diff --git a/packages/hoppscotch-agent/package.json b/packages/hoppscotch-agent/package.json index 805cf8b2..8eb42e06 100644 --- a/packages/hoppscotch-agent/package.json +++ b/packages/hoppscotch-agent/package.json @@ -1,7 +1,7 @@ { "name": "hoppscotch-agent", "private": true, - "version": "0.1.12", + "version": "0.1.13", "type": "module", "scripts": { "dev": "vite", diff --git a/packages/hoppscotch-agent/src-tauri/Cargo.lock b/packages/hoppscotch-agent/src-tauri/Cargo.lock index 15422841..09d96df2 100644 --- a/packages/hoppscotch-agent/src-tauri/Cargo.lock +++ b/packages/hoppscotch-agent/src-tauri/Cargo.lock @@ -2076,7 +2076,7 @@ dependencies = [ [[package]] name = "hoppscotch-agent" -version = "0.1.12" +version = "0.1.13" dependencies = [ "aes-gcm", "axum", diff --git a/packages/hoppscotch-agent/src-tauri/Cargo.toml b/packages/hoppscotch-agent/src-tauri/Cargo.toml index fdb29270..fe6dd4c7 100644 --- a/packages/hoppscotch-agent/src-tauri/Cargo.toml +++ b/packages/hoppscotch-agent/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "hoppscotch-agent" -version = "0.1.12" +version = "0.1.13" description = "A cross-platform HTTP request agent for Hoppscotch for advanced request handling including custom headers, certificates, proxies, and local system integration." authors = ["AndrewBastin", "CuriousCorrelation"] edition = "2021" diff --git a/packages/hoppscotch-agent/src-tauri/tauri.conf.json b/packages/hoppscotch-agent/src-tauri/tauri.conf.json index 69c0cde0..bc6a048c 100644 --- a/packages/hoppscotch-agent/src-tauri/tauri.conf.json +++ b/packages/hoppscotch-agent/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2.0.0-rc", "productName": "Hoppscotch Agent", - "version": "0.1.12", + "version": "0.1.13", "identifier": "io.hoppscotch.agent", "build": { "beforeDevCommand": "pnpm dev", diff --git a/packages/hoppscotch-agent/src-tauri/tauri.portable.conf.json b/packages/hoppscotch-agent/src-tauri/tauri.portable.conf.json index bc95662a..74b424fd 100644 --- a/packages/hoppscotch-agent/src-tauri/tauri.portable.conf.json +++ b/packages/hoppscotch-agent/src-tauri/tauri.portable.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2.0.0-rc", "productName": "Hoppscotch Agent Portable", - "version": "0.1.12", + "version": "0.1.13", "identifier": "io.hoppscotch.agent", "build": { "beforeDevCommand": "pnpm dev", diff --git a/packages/hoppscotch-desktop/package.json b/packages/hoppscotch-desktop/package.json index 51964d52..32e649cd 100644 --- a/packages/hoppscotch-desktop/package.json +++ b/packages/hoppscotch-desktop/package.json @@ -24,7 +24,7 @@ "@fontsource-variable/roboto-mono": "5.2.6", "@hoppscotch/common": "workspace:^", "@hoppscotch/kernel": "workspace:^", - "@hoppscotch/plugin-appload": "github:CuriousCorrelation/tauri-plugin-appload#e8dbe06eabf947e5efaf07d2e573238ceb11a7b1", + "@hoppscotch/plugin-appload": "github:CuriousCorrelation/tauri-plugin-appload#feat-desktop-appload-top-level-config", "@hoppscotch/ui": "0.2.5", "@tauri-apps/api": "2.1.1", "@tauri-apps/plugin-fs": "2.0.2", diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/Cargo.lock b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/Cargo.lock index b33e7333..84f403ad 100644 --- a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/Cargo.lock +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/Cargo.lock @@ -54,9 +54,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android-tzdata" @@ -75,9 +75,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.93" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] name = "arbitrary" @@ -102,9 +102,9 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "atk" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4af014b17dd80e8af9fa689b2d4a211ddba6eb583c1622f35d0cb543f6b17e4" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" dependencies = [ "atk-sys", "glib", @@ -113,9 +113,9 @@ dependencies = [ [[package]] name = "atk-sys" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "251e0b7d90e33e0ba930891a505a9a35ece37b2dd37a14f3ffc306c13b980009" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" dependencies = [ "glib-sys", "gobject-sys", @@ -137,9 +137,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", "cfg-if", @@ -164,9 +164,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.6.0" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" [[package]] name = "bitflags" @@ -176,18 +176,18 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" dependencies = [ "serde", ] [[package]] name = "blake3" -version = "1.5.5" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ee0c1824c4dea5b5f81736aff91bae041d2c07ee1192bec91054e10e3e601e" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" dependencies = [ "arrayref", "arrayvec", @@ -218,7 +218,41 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" dependencies = [ - "objc2", + "objc2 0.5.2", +] + +[[package]] +name = "block2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2" +dependencies = [ + "objc2 0.6.1", +] + +[[package]] +name = "bon" +version = "3.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced38439e7a86a4761f7f7d5ded5ff009135939ecb464a24452eaa4c1696af7d" +dependencies = [ + "bon-macros", + "rustversion", +] + +[[package]] +name = "bon-macros" +version = "3.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce61d2d3844c6b8d31b2353d9f66cf5e632b3e9549583fe3cac2f4f6136725e" +dependencies = [ + "darling", + "ident_case", + "prettyplease", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.101", ] [[package]] @@ -234,9 +268,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.1" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" +checksum = "a334ef7c9e23abf0ce748e8cd309037da93e606ad52eb372e4ce327a0dcfbdfd" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -244,15 +278,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "bytemuck" -version = "1.20.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" +checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" [[package]] name = "byteorder" @@ -262,31 +296,29 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.9.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" dependencies = [ "serde", ] [[package]] name = "bzip2" -version = "0.4.4" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +checksum = "49ecfb22d906f800d4fe833b6282cf4dc1c298f5057ca0b5445e5c209735ca47" dependencies = [ "bzip2-sys", - "libc", ] [[package]] name = "bzip2-sys" -version = "0.1.11+1.0.8" +version = "0.1.13+1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" dependencies = [ "cc", - "libc", "pkg-config", ] @@ -296,7 +328,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "cairo-sys-rs", "glib", "libc", @@ -335,33 +367,33 @@ dependencies = [ [[package]] name = "cargo_metadata" -version = "0.18.1" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" dependencies = [ "camino", "cargo-platform", "semver", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 2.0.12", ] [[package]] name = "cargo_toml" -version = "0.17.2" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a969e13a7589e9e3e4207e153bae624ade2b5622fb4684a4923b23ec3d57719" +checksum = "02260d489095346e5cafd04dea8e8cb54d1d74fcd759022a9b72986ebe9a1257" dependencies = [ "serde", - "toml 0.8.2", + "toml", ] [[package]] name = "cc" -version = "1.2.2" +version = "1.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f34d93e62b03caf570cccc334cbc6c2fceca82f39211051345108adcba3eebdc" +checksum = "32db95edf998450acc7881c932f94cd9b05c87b4b2599e8bab064753da4acfd1" dependencies = [ "jobserver", "libc", @@ -409,9 +441,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ "android-tzdata", "iana-time-zone", @@ -419,7 +451,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -438,7 +470,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "block", "cocoa-foundation", "core-foundation 0.10.0", @@ -454,7 +486,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "block", "core-foundation 0.10.0", "core-graphics-types", @@ -532,7 +564,7 @@ version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "core-foundation 0.10.0", "core-graphics-types", "foreign-types 0.5.0", @@ -545,25 +577,25 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "core-foundation 0.10.0", "libc", ] [[package]] name = "cpufeatures" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] [[package]] name = "crc" -version = "3.2.1" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" dependencies = [ "crc-catalog", ] @@ -585,18 +617,18 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.13" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -613,9 +645,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crypto-common" @@ -651,7 +683,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] @@ -661,7 +693,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] @@ -688,14 +720,14 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] name = "darling" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ "darling_core", "darling_macro", @@ -703,27 +735,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] name = "darling_macro" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] @@ -748,9 +780,9 @@ checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b" [[package]] name = "der" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ "const-oid", "zeroize", @@ -758,9 +790,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.11" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" dependencies = [ "powerfmt", "serde", @@ -774,20 +806,20 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] name = "derive_more" -version = "0.99.18" +version = "0.99.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ "convert_case", "proc-macro2", "quote", "rustc_version", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] @@ -803,23 +835,23 @@ dependencies = [ [[package]] name = "dirs" -version = "5.0.1" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" dependencies = [ "dirs-sys", ] [[package]] name = "dirs-sys" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -828,6 +860,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.9.0", + "objc2 0.6.1", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -836,7 +878,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] @@ -859,23 +901,23 @@ checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] name = "dpi" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" dependencies = [ "serde", ] [[package]] name = "dtoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" +checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" [[package]] name = "dtoa-short" @@ -894,9 +936,9 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "dyn-clone" -version = "1.0.17" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" +checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" [[package]] name = "ed25519" @@ -926,20 +968,20 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "embed-resource" -version = "2.5.1" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b68b6f9f63a0b6a38bc447d4ce84e2b388f3ec95c99c641c8ff0dd3ef89a6379" +checksum = "7fbc6e0d8e0c03a655b53ca813f0463d2c956bc4db8138dbc89f120b066551e3" dependencies = [ "cc", "memchr", "rustc_version", - "toml 0.8.2", + "toml", "vswhom", "winreg", ] @@ -961,15 +1003,15 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24e2389d65ab4fab27dc2a5de7b191e1f6617d1f1c8855c0dc569c94a4cbb18d" +checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" dependencies = [ "serde", "typeid", @@ -977,9 +1019,9 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" dependencies = [ "libc", "windows-sys 0.59.0", @@ -987,15 +1029,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fdeflate" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c6f4c64c1d33a3111c4466f7365ebdcc37c5bd1ea0d62aae2e3d722aacbedb" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" dependencies = [ "simd-adler32", ] @@ -1018,9 +1060,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.35" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" dependencies = [ "crc32fast", "miniz_oxide", @@ -1034,9 +1076,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "foreign-types" @@ -1065,7 +1107,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] @@ -1155,7 +1197,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] @@ -1199,9 +1241,9 @@ dependencies = [ [[package]] name = "gdk" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5ba081bdef3b75ebcdbfc953699ed2d7417d6bd853347a42a37d76406a33646" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" dependencies = [ "cairo-rs", "gdk-pixbuf", @@ -1240,9 +1282,9 @@ dependencies = [ [[package]] name = "gdk-sys" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31ff856cb3386dae1703a920f803abafcc580e9b5f711ca62ed1620c25b51ff2" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", @@ -1257,9 +1299,9 @@ dependencies = [ [[package]] name = "gdkwayland-sys" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90fbf5c033c65d93792192a49a8efb5bb1e640c419682a58bb96f5ae77f3d4a" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" dependencies = [ "gdk-sys", "glib-sys", @@ -1271,9 +1313,9 @@ dependencies = [ [[package]] name = "gdkx11" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2ea8a4909d530f79921290389cbd7c34cb9d623bfe970eaae65ca5f9cd9cce" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" dependencies = [ "gdk", "gdkx11-sys", @@ -1285,9 +1327,9 @@ dependencies = [ [[package]] name = "gdkx11-sys" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fee8f00f4ee46cad2939b8990f5c70c94ff882c3028f3cc5abf950fa4ab53043" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" dependencies = [ "gdk-sys", "glib-sys", @@ -1319,15 +1361,29 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", "wasi 0.11.0+wasi-snapshot-preview1", ] +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", +] + [[package]] name = "gimli" version = "0.31.1" @@ -1372,7 +1428,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "futures-channel", "futures-core", "futures-executor", @@ -1396,11 +1452,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" dependencies = [ "heck 0.4.1", - "proc-macro-crate 2.0.2", + "proc-macro-crate 2.0.0", "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] @@ -1415,9 +1471,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "gobject-sys" @@ -1432,9 +1488,9 @@ dependencies = [ [[package]] name = "gtk" -version = "0.18.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93c4f5e0e20b60e10631a5f06da7fe3dda744b05ad0ea71fee2f47adf865890c" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" dependencies = [ "atk", "cairo-rs", @@ -1453,9 +1509,9 @@ dependencies = [ [[package]] name = "gtk-sys" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771437bf1de2c1c0b496c11505bdf748e26066bbe942dfc8f614c9460f6d7722" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" dependencies = [ "atk-sys", "cairo-sys-rs", @@ -1471,22 +1527,22 @@ dependencies = [ [[package]] name = "gtk3-macros" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6063efb63db582968fb7df72e1ae68aa6360dcfb0a75143f34fc7d616bad75e" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] name = "h2" -version = "0.4.7" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e" +checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" dependencies = [ "atomic-waker", "bytes", @@ -1494,7 +1550,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.6.0", + "indexmap 2.9.0", "slab", "tokio", "tokio-util", @@ -1515,9 +1571,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" dependencies = [ "allocator-api2", "equivalent", @@ -1536,12 +1592,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - [[package]] name = "hex" version = "0.4.3" @@ -1582,13 +1632,13 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", - "itoa 1.0.14", + "itoa 1.0.15", ] [[package]] @@ -1603,12 +1653,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "futures-util", + "futures-core", "http", "http-body", "pin-project-lite", @@ -1616,15 +1666,15 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "humantime" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" [[package]] name = "humantime-serde" @@ -1638,9 +1688,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", @@ -1649,7 +1699,7 @@ dependencies = [ "http", "http-body", "httparse", - "itoa 1.0.14", + "itoa 1.0.15", "pin-project-lite", "smallvec", "tokio", @@ -1658,9 +1708,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", "http", @@ -1691,9 +1741,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" dependencies = [ "bytes", "futures-channel", @@ -1701,6 +1751,7 @@ dependencies = [ "http", "http-body", "hyper", + "libc", "pin-project-lite", "socket2", "tokio", @@ -1710,16 +1761,17 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows-core 0.52.0", + "windows-core 0.61.0", ] [[package]] @@ -1733,9 +1785,9 @@ dependencies = [ [[package]] name = "ico" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3804960be0bb5e4edb1e1ad67afd321a9ecfd875c3e65c099468fd2717d7cae" +checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" dependencies = [ "byteorder", "png", @@ -1743,21 +1795,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -1766,31 +1819,11 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -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" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -1798,67 +1831,54 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "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.89", -] - [[package]] name = "ident_case" version = "1.0.1" @@ -1878,9 +1898,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -1899,47 +1919,38 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.3", "serde", ] [[package]] name = "infer" -version = "0.16.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc150e5ce2330295b8616ce0e3f53250e53af31759a9dbedad1621ba29151847" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" dependencies = [ "cfb", ] [[package]] name = "inout" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ "generic-array", ] -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - [[package]] name = "ipnet" -version = "2.10.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "itoa" @@ -1949,9 +1960,9 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "javascriptcore-rs" @@ -2000,19 +2011,21 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ + "getrandom 0.3.3", "libc", ] [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -2044,7 +2057,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "serde", "unicode-segmentation", ] @@ -2114,21 +2127,21 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "libc", ] [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" @@ -2140,17 +2153,11 @@ dependencies = [ "scopeguard", ] -[[package]] -name = "lockfree-object-pool" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" - [[package]] name = "log" -version = "0.4.22" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "lru" @@ -2158,7 +2165,7 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.3", ] [[package]] @@ -2171,6 +2178,17 @@ dependencies = [ "crc", ] +[[package]] +name = "lzma-sys" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + [[package]] name = "mac" version = "0.1.1" @@ -2249,9 +2267,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" dependencies = [ "adler2", "simd-adler32", @@ -2259,11 +2277,10 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi", "libc", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", @@ -2271,29 +2288,30 @@ dependencies = [ [[package]] name = "muda" -version = "0.15.3" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdae9c00e61cc0579bcac625e8ad22104c60548a025bfc972dc83868a28e1484" +checksum = "4de14a9b5d569ca68d7c891d613b390cf5ab4f851c77aaa2f9e435555d3d9492" dependencies = [ "crossbeam-channel", "dpi", "gtk", "keyboard-types", - "objc2", + "objc2 0.6.1", "objc2-app-kit", - "objc2-foundation", + "objc2-core-foundation", + "objc2-foundation 0.3.1", "once_cell", "png", "serde", - "thiserror 1.0.69", + "thiserror 2.0.12", "windows-sys 0.59.0", ] [[package]] name = "native-tls" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ "libc", "log", @@ -2312,7 +2330,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "jni-sys", "log", "ndk-sys", @@ -2387,10 +2405,10 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 2.0.2", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] @@ -2407,9 +2425,6 @@ name = "objc-sys" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" -dependencies = [ - "cc", -] [[package]] name = "objc2" @@ -2422,55 +2437,54 @@ dependencies = [ ] [[package]] -name = "objc2-app-kit" -version = "0.2.2" +name = "objc2" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" dependencies = [ - "bitflags 2.6.0", - "block2", + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" +dependencies = [ + "bitflags 2.9.0", + "block2 0.6.1", "libc", - "objc2", + "objc2 0.6.1", + "objc2-cloud-kit", "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", "objc2-core-image", - "objc2-foundation", - "objc2-quartz-core", + "objc2-foundation 0.3.1", + "objc2-quartz-core 0.3.1", ] [[package]] name = "objc2-cloud-kit" -version = "0.2.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +checksum = "17614fdcd9b411e6ff1117dfb1d0150f908ba83a7df81b1f118005fe0a8ea15d" 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", + "bitflags 2.9.0", + "objc2 0.6.1", + "objc2-foundation 0.3.1", ] [[package]] name = "objc2-core-data" -version = "0.2.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +checksum = "291fbbf7d29287518e8686417cf7239c74700fd4b607623140a7d4a3c834329d" dependencies = [ - "bitflags 2.6.0", - "block2", - "objc2", - "objc2-foundation", + "bitflags 2.9.0", + "objc2 0.6.1", + "objc2-foundation 0.3.1", ] [[package]] @@ -2479,38 +2493,48 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", + "dispatch2", + "objc2 0.6.1", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" +dependencies = [ + "bitflags 2.9.0", + "dispatch2", + "objc2 0.6.1", + "objc2-core-foundation", + "objc2-io-surface", ] [[package]] name = "objc2-core-image" -version = "0.2.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +checksum = "79b3dc0cc4386b6ccf21c157591b34a7f44c8e75b064f85502901ab2188c007e" 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", + "objc2 0.6.1", + "objc2-foundation 0.3.1", ] [[package]] name = "objc2-encode" -version = "4.0.3" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] [[package]] name = "objc2-foundation" @@ -2518,22 +2542,34 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.6.0", - "block2", + "bitflags 2.9.0", + "block2 0.5.1", "libc", - "objc2", + "objc2 0.5.2", ] [[package]] -name = "objc2-link-presentation" -version = "0.2.2" +name = "objc2-foundation" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" dependencies = [ - "block2", - "objc2", - "objc2-app-kit", - "objc2-foundation", + "bitflags 2.9.0", + "block2 0.6.1", + "libc", + "objc2 0.6.1", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" +dependencies = [ + "bitflags 2.9.0", + "objc2 0.6.1", + "objc2-core-foundation", ] [[package]] @@ -2542,10 +2578,10 @@ 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", + "bitflags 2.9.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] @@ -2554,103 +2590,72 @@ 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", + "bitflags 2.9.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", "objc2-metal", ] [[package]] -name = "objc2-symbols" -version = "0.2.2" +name = "objc2-quartz-core" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5" dependencies = [ - "objc2", - "objc2-foundation", + "bitflags 2.9.0", + "objc2 0.6.1", + "objc2-foundation 0.3.1", ] [[package]] name = "objc2-ui-kit" -version = "0.2.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +checksum = "25b1312ad7bc8a0e92adae17aa10f90aae1fb618832f9b993b022b591027daed" 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", + "bitflags 2.9.0", + "objc2 0.6.1", + "objc2-core-foundation", + "objc2-foundation 0.3.1", ] [[package]] name = "objc2-web-kit" -version = "0.2.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68bc69301064cebefc6c4c90ce9cba69225239e4b8ff99d445a2b5563797da65" +checksum = "91672909de8b1ce1c2252e95bbee8c1649c9ad9d14b9248b3d7b4c47903c47ad" dependencies = [ - "bitflags 2.6.0", - "block2", - "objc2", + "bitflags 2.9.0", + "block2 0.6.1", + "objc2 0.6.1", "objc2-app-kit", - "objc2-foundation", + "objc2-core-foundation", + "objc2-foundation 0.3.1", ] [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.2" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "openssl" -version = "0.10.68" +version = "0.10.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "cfg-if", "foreign-types 0.3.2", "libc", @@ -2667,20 +2672,20 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.104" +version = "0.9.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +checksum = "e145e1651e858e820e4860f7b9c5e169bc1d8ce1c86043be79fa7b7634821847" dependencies = [ "cc", "libc", @@ -2780,12 +2785,12 @@ dependencies = [ [[package]] name = "phf" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ - "phf_macros 0.11.2", - "phf_shared 0.11.2", + "phf_macros 0.11.3", + "phf_shared 0.11.3", ] [[package]] @@ -2830,11 +2835,11 @@ dependencies = [ [[package]] name = "phf_generator" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ - "phf_shared 0.11.2", + "phf_shared 0.11.3", "rand 0.8.5", ] @@ -2854,15 +2859,15 @@ dependencies = [ [[package]] name = "phf_macros" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" dependencies = [ - "phf_generator 0.11.2", - "phf_shared 0.11.2", + "phf_generator 0.11.3", + "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] @@ -2871,7 +2876,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" dependencies = [ - "siphasher", + "siphasher 0.3.11", ] [[package]] @@ -2880,23 +2885,23 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" dependencies = [ - "siphasher", + "siphasher 0.3.11", ] [[package]] name = "phf_shared" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ - "siphasher", + "siphasher 1.0.1", ] [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -2916,18 +2921,18 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "plist" -version = "1.7.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" +checksum = "eac26e981c03a6e53e0aee43c113e3202f5581d5360dae7bd2c70e800dd0451d" dependencies = [ "base64 0.22.1", - "indexmap 2.6.0", + "indexmap 2.9.0", "quick-xml", "serde", "time", @@ -2935,9 +2940,9 @@ dependencies = [ [[package]] name = "png" -version = "0.17.14" +version = "0.17.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f9d46a34a05a6a57566bc2bfae066ef07585a6e3fa30fbbdff5936380623f0" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -2946,6 +2951,15 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -2954,9 +2968,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] @@ -2967,6 +2981,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "prettyplease" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" +dependencies = [ + "proc-macro2", + "syn 2.0.101", +] + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -2979,12 +3003,20 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "2.0.2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" dependencies = [ - "toml_datetime", - "toml_edit 0.20.2", + "toml_edit 0.20.7", +] + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit 0.22.26", ] [[package]] @@ -3019,9 +3051,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -3037,13 +3069,19 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "rand" version = "0.7.3" @@ -3104,7 +3142,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] @@ -3153,22 +3191,22 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", ] [[package]] name = "redox_users" -version = "0.4.6" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", - "thiserror 1.0.69", + "thiserror 2.0.12", ] [[package]] @@ -3202,9 +3240,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" dependencies = [ "base64 0.22.1", "bytes", @@ -3236,6 +3274,7 @@ dependencies = [ "tokio", "tokio-native-tls", "tokio-util", + "tower", "tower-service", "url", "wasm-bindgen", @@ -3247,15 +3286,14 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] @@ -3277,22 +3315,22 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.41" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.23.19" +version = "0.23.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" +checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" dependencies = [ "once_cell", "rustls-pki-types", @@ -3312,15 +3350,18 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" dependencies = [ "ring", "rustls-pki-types", @@ -3328,10 +3369,16 @@ dependencies = [ ] [[package]] -name = "ryu" -version = "1.0.18" +name = "rustversion" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "same-file" @@ -3353,9 +3400,9 @@ dependencies = [ [[package]] name = "schemars" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" dependencies = [ "dyn-clone", "indexmap 1.9.3", @@ -3368,14 +3415,14 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] @@ -3390,7 +3437,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -3399,9 +3446,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.1" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -3429,27 +3476,27 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.215" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde-untagged" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2676ba99bd82f75cae5cbd2c8eda6fa0b8760f18978ea840e980dd5567b5c5b6" +checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e" dependencies = [ "erased-serde", "serde", @@ -3458,13 +3505,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] @@ -3475,16 +3522,16 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ - "itoa 1.0.14", + "itoa 1.0.15", "memchr", "ryu", "serde", @@ -3492,13 +3539,13 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] @@ -3517,22 +3564,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.14", + "itoa 1.0.15", "ryu", "serde", ] [[package]] name = "serde_with" -version = "3.11.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.6.0", + "indexmap 2.9.0", "serde", "serde_derive", "serde_json", @@ -3542,14 +3589,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.11.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] @@ -3597,9 +3644,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures", @@ -3633,6 +3680,12 @@ version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + [[package]] name = "slab" version = "0.4.9" @@ -3644,15 +3697,15 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ "libc", "windows-sys 0.52.0", @@ -3670,9 +3723,9 @@ dependencies = [ "foreign-types 0.5.0", "js-sys", "log", - "objc2", - "objc2-foundation", - "objc2-quartz-core", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-quartz-core 0.2.2", "raw-window-handle", "redox_syscall", "wasm-bindgen", @@ -3706,12 +3759,6 @@ dependencies = [ "system-deps", ] -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - [[package]] name = "spki" version = "0.7.3" @@ -3730,26 +3777,25 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "string_cache" -version = "0.8.7" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" dependencies = [ "new_debug_unreachable", - "once_cell", "parking_lot", - "phf_shared 0.10.0", + "phf_shared 0.11.3", "precomputed-hash", "serde", ] [[package]] name = "string_cache_codegen" -version = "0.5.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", + "phf_generator 0.11.3", + "phf_shared 0.11.3", "proc-macro2", "quote", ] @@ -3790,9 +3836,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.89" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -3810,13 +3856,13 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] @@ -3838,7 +3884,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -3862,18 +3908,17 @@ dependencies = [ "cfg-expr", "heck 0.5.0", "pkg-config", - "toml 0.8.2", + "toml", "version-compare", ] [[package]] name = "tao" -version = "0.30.8" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6682a07cf5bab0b8a2bd20d0a542917ab928b5edb75ebd4eda6b05cbaab872da" +checksum = "1e59c1f38e657351a2e822eadf40d6a2ad4627b9c25557bc1180ec1b3295ef82" dependencies = [ - "bitflags 2.6.0", - "cocoa", + "bitflags 2.9.0", "core-foundation 0.10.0", "core-graphics", "crossbeam-channel", @@ -3883,7 +3928,6 @@ dependencies = [ "gdkwayland-sys", "gdkx11-sys", "gtk", - "instant", "jni", "lazy_static", "libc", @@ -3891,7 +3935,9 @@ dependencies = [ "ndk", "ndk-context", "ndk-sys", - "objc", + "objc2 0.6.1", + "objc2-app-kit", + "objc2-foundation 0.3.1", "once_cell", "parking_lot", "raw-window-handle", @@ -3899,8 +3945,8 @@ dependencies = [ "tao-macros", "unicode-segmentation", "url", - "windows 0.58.0", - "windows-core 0.58.0", + "windows 0.61.1", + "windows-core 0.61.0", "windows-version", "x11-dl", ] @@ -3913,7 +3959,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] @@ -3924,9 +3970,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.1.1" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e545de0a2dfe296fa67db208266cd397c5a55ae782da77973ef4c4fac90e9f2c" +checksum = "e7b0bc1aec81bda6bc455ea98fcaed26b3c98c1648c627ad6ff1c704e8bf8cbc" dependencies = [ "anyhow", "bytes", @@ -3934,7 +3980,7 @@ dependencies = [ "dunce", "embed_plist", "futures-util", - "getrandom 0.2.15", + "getrandom 0.2.16", "glob", "gtk", "heck 0.5.0", @@ -3944,9 +3990,10 @@ dependencies = [ "log", "mime", "muda", - "objc2", + "objc2 0.6.1", "objc2-app-kit", - "objc2-foundation", + "objc2-foundation 0.3.1", + "objc2-ui-kit", "percent-encoding", "plist", "raw-window-handle", @@ -3961,7 +4008,7 @@ dependencies = [ "tauri-runtime", "tauri-runtime-wry", "tauri-utils", - "thiserror 2.0.3", + "thiserror 2.0.12", "tokio", "tray-icon", "url", @@ -3969,14 +4016,14 @@ dependencies = [ "webkit2gtk", "webview2-com", "window-vibrancy", - "windows 0.58.0", + "windows 0.61.1", ] [[package]] name = "tauri-build" -version = "2.0.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bd2a4bcfaf5fb9f4be72520eefcb61ae565038f8ccba2a497d8c28f463b8c01" +checksum = "d7a0350f0df1db385ca5c02888a83e0e66655c245b7443db8b78a70da7d7f8fc" dependencies = [ "anyhow", "cargo_toml", @@ -3990,15 +4037,15 @@ dependencies = [ "serde_json", "tauri-utils", "tauri-winres", - "toml 0.8.2", + "toml", "walkdir", ] [[package]] name = "tauri-codegen" -version = "2.0.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf79faeecf301d3e969b1fae977039edb77a4c1f25cc0a961be298b54bff97cf" +checksum = "f93f035551bf7b11b3f51ad9bc231ebbe5e085565527991c16cf326aa38cdf47" dependencies = [ "base64 0.22.1", "brotli", @@ -4012,9 +4059,9 @@ dependencies = [ "serde", "serde_json", "sha2", - "syn 2.0.89", + "syn 2.0.101", "tauri-utils", - "thiserror 2.0.3", + "thiserror 2.0.12", "time", "url", "uuid", @@ -4023,23 +4070,23 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.0.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c52027c8c5afb83166dacddc092ee8fff50772f9646d461d8c33ee887e447a03" +checksum = "8db4df25e2d9d45de0c4c910da61cd5500190da14ae4830749fee3466dddd112" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", "tauri-codegen", "tauri-utils", ] [[package]] name = "tauri-plugin" -version = "2.0.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e753f2a30933a9bbf0a202fa47d7cc4a3401f06e8d6dcc53b79aa62954828c79" +checksum = "37a5ebe6a610d1b78a94650896e6f7c9796323f408800cef436e0fa0539de601" dependencies = [ "anyhow", "glob", @@ -4048,7 +4095,7 @@ dependencies = [ "serde", "serde_json", "tauri-utils", - "toml 0.8.2", + "toml", "walkdir", ] @@ -4058,6 +4105,7 @@ version = "0.1.0" dependencies = [ "base64 0.22.1", "blake3", + "bon", "chrono", "cocoa", "dashmap", @@ -4081,7 +4129,7 @@ dependencies = [ "sysinfo", "tauri", "tauri-plugin", - "thiserror 2.0.3", + "thiserror 2.0.12", "tokio", "tracing", "url", @@ -4092,36 +4140,40 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "2.2.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cce18d43f80d4aba3aa8a0c953bbe835f3d0f2370aca75e8dbb14bd4bab27958" +checksum = "00f004905d549854069e6774533d742b03cacfd6f03deb08940a8677586cbe39" dependencies = [ + "cookie", "dpi", "gtk", "http", "jni", + "objc2 0.6.1", + "objc2-ui-kit", "raw-window-handle", "serde", "serde_json", "tauri-utils", - "thiserror 2.0.3", + "thiserror 2.0.12", "url", - "windows 0.58.0", + "windows 0.61.1", ] [[package]] name = "tauri-runtime-wry" -version = "2.2.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f442a38863e10129ffe2cec7bd09c2dcf8a098a3a27801a476a304d5bb991d2" +checksum = "f85d056f4d4b014fe874814034f3416d57114b617a493a4fe552580851a3f3a2" dependencies = [ "gtk", "http", "jni", "log", - "objc2", + "objc2 0.6.1", "objc2-app-kit", - "objc2-foundation", + "objc2-foundation 0.3.1", + "once_cell", "percent-encoding", "raw-window-handle", "softbuffer", @@ -4131,16 +4183,17 @@ dependencies = [ "url", "webkit2gtk", "webview2-com", - "windows 0.58.0", + "windows 0.61.1", "wry", ] [[package]] name = "tauri-utils" -version = "2.1.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9271a88f99b4adea0dc71d0baca4505475a0bbd139fb135f62958721aaa8fe54" +checksum = "b2900399c239a471bcff7f15c4399eb1a8c4fe511ba2853e07c996d771a5e0a4" dependencies = [ + "anyhow", "brotli", "cargo_metadata", "ctor", @@ -4153,7 +4206,7 @@ dependencies = [ "kuchikiki", "log", "memchr", - "phf 0.11.2", + "phf 0.11.3", "proc-macro2", "quote", "regex", @@ -4164,8 +4217,8 @@ dependencies = [ "serde_json", "serde_with", "swift-rs", - "thiserror 2.0.3", - "toml 0.8.2", + "thiserror 2.0.12", + "toml", "url", "urlpattern", "uuid", @@ -4174,22 +4227,23 @@ dependencies = [ [[package]] name = "tauri-winres" -version = "0.1.1" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb" +checksum = "e8d321dbc6f998d825ab3f0d62673e810c861aac2d0de2cc2c395328f1d113b4" dependencies = [ "embed-resource", - "toml 0.7.8", + "indexmap 2.9.0", + "toml", ] [[package]] name = "tempfile" -version = "3.14.0" +version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ - "cfg-if", "fastrand", + "getrandom 0.3.3", "once_cell", "rustix", "windows-sys 0.59.0", @@ -4223,11 +4277,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.3" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl 2.0.3", + "thiserror-impl 2.0.12", ] [[package]] @@ -4238,28 +4292,28 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] name = "thiserror-impl" -version = "2.0.3" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] name = "time" -version = "0.3.36" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", - "itoa 1.0.14", + "itoa 1.0.15", "num-conv", "powerfmt", "serde", @@ -4269,15 +4323,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ "num-conv", "time-core", @@ -4285,9 +4339,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -4295,9 +4349,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.41.1" +version = "1.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" +checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" dependencies = [ "backtrace", "bytes", @@ -4320,20 +4374,19 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ "rustls", - "rustls-pki-types", "tokio", ] [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" dependencies = [ "bytes", "futures-core", @@ -4344,33 +4397,21 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.8" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.19.15", -] - -[[package]] -name = "toml" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit 0.20.2", + "toml_edit 0.22.26", ] [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" dependencies = [ "serde", ] @@ -4381,26 +4422,63 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.6.0", - "serde", - "serde_spanned", + "indexmap 2.9.0", "toml_datetime", - "winnow", + "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.20.2" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.9.0", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" +dependencies = [ + "indexmap 2.9.0", "serde", "serde_spanned", "toml_datetime", - "winnow", + "toml_write", + "winnow 0.7.10", ] +[[package]] +name = "toml_write" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.3" @@ -4426,7 +4504,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] @@ -4440,22 +4518,23 @@ dependencies = [ [[package]] name = "tray-icon" -version = "0.19.2" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d48a05076dd272615d03033bf04f480199f7d1b66a8ac64d75c625fc4a70c06b" +checksum = "9f7eee98ec5c90daf179d55c20a49d8c0d043054ce7c26336c09a24d31f14fa0" dependencies = [ - "core-graphics", "crossbeam-channel", "dirs", "libappindicator", "muda", - "objc2", + "objc2 0.6.1", "objc2-app-kit", - "objc2-foundation", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.1", "once_cell", "png", "serde", - "thiserror 1.0.69", + "thiserror 2.0.12", "windows-sys 0.59.0", ] @@ -4467,15 +4546,15 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typeid" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "unic-char-property" @@ -4520,15 +4599,15 @@ dependencies = [ [[package]] name = "unicase" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-segmentation" @@ -4572,12 +4651,6 @@ 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" @@ -4586,11 +4659,11 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.11.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.3.3", "serde", ] @@ -4624,9 +4697,9 @@ dependencies = [ [[package]] name = "vswhom-sys" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" dependencies = [ "cc", "libc", @@ -4664,48 +4737,58 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] -name = "wasm-bindgen" -version = "0.2.95" +name = "wasi" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4713,22 +4796,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-streams" @@ -4745,9 +4831,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -4799,16 +4885,16 @@ dependencies = [ [[package]] name = "webview2-com" -version = "0.33.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f61ff3d9d0ee4efcb461b14eb3acfda2702d10dc329f339303fc3e57215ae2c" +checksum = "b542b5cfbd9618c46c2784e4d41ba218c336ac70d44c55e47b251033e7d85601" dependencies = [ "webview2-com-macros", "webview2-com-sys", - "windows 0.58.0", - "windows-core 0.58.0", - "windows-implement 0.58.0", - "windows-interface 0.58.0", + "windows 0.61.1", + "windows-core 0.61.0", + "windows-implement 0.60.0", + "windows-interface 0.59.1", ] [[package]] @@ -4819,18 +4905,18 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] name = "webview2-com-sys" -version = "0.33.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3a3e2eeb58f82361c93f9777014668eb3d07e7d174ee4c819575a9208011886" +checksum = "8ae2d11c4a686e4409659d7891791254cf9286d3cfe0eef54df1523533d22295" dependencies = [ - "thiserror 1.0.69", - "windows 0.58.0", - "windows-core 0.58.0", + "thiserror 2.0.12", + "windows 0.61.1", + "windows-core 0.61.0", ] [[package]] @@ -4866,13 +4952,14 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "window-vibrancy" -version = "0.5.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea403deff7b51fff19e261330f71608ff2cdef5721d72b64180bb95be7c4150" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" dependencies = [ - "objc2", + "objc2 0.6.1", "objc2-app-kit", - "objc2-foundation", + "objc2-core-foundation", + "objc2-foundation 0.3.1", "raw-window-handle", "windows-sys 0.59.0", "windows-version", @@ -4908,12 +4995,25 @@ dependencies = [ ] [[package]] -name = "windows-core" -version = "0.52.0" +name = "windows" +version = "0.61.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "c5ee8f3d025738cb02bad7868bbb5f8a6327501e870bf51f1b455b0a2454a419" dependencies = [ - "windows-targets 0.52.6", + "windows-collections", + "windows-core 0.61.0", + "windows-future", + "windows-link", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.0", ] [[package]] @@ -4937,10 +5037,33 @@ dependencies = [ "windows-implement 0.58.0", "windows-interface 0.58.0", "windows-result 0.2.0", - "windows-strings", + "windows-strings 0.1.0", "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +dependencies = [ + "windows-implement 0.60.0", + "windows-interface 0.59.1", + "windows-link", + "windows-result 0.3.2", + "windows-strings 0.4.0", +] + +[[package]] +name = "windows-future" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a1d6bbefcb7b60acd19828e1bc965da6fcf18a7e39490c5f8be71e54a19ba32" +dependencies = [ + "windows-core 0.61.0", + "windows-link", +] + [[package]] name = "windows-implement" version = "0.57.0" @@ -4949,7 +5072,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] @@ -4960,7 +5083,18 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", ] [[package]] @@ -4971,7 +5105,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] @@ -4982,18 +5116,45 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.0", + "windows-link", ] [[package]] name = "windows-registry" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ - "windows-result 0.2.0", - "windows-strings", - "windows-targets 0.52.6", + "windows-result 0.3.2", + "windows-strings 0.3.1", + "windows-targets 0.53.0", ] [[package]] @@ -5014,6 +5175,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-result" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-strings" version = "0.1.0" @@ -5024,6 +5194,24 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-strings" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -5099,7 +5287,7 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", @@ -5107,12 +5295,28 @@ dependencies = [ ] [[package]] -name = "windows-version" -version = "0.1.1" +name = "windows-targets" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6998aa457c9ba8ff2fb9f13e9d2a930dabcea28f1d0ab94d687d8b3654844515" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" dependencies = [ - "windows-targets 0.52.6", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[package]] +name = "windows-version" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e04a5c6627e310a23ad2358483286c7df260c964eb2d003d8efd6d0f4e79265c" +dependencies = [ + "windows-link", ] [[package]] @@ -5133,6 +5337,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -5151,6 +5361,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -5169,12 +5385,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -5193,6 +5421,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -5211,6 +5445,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -5229,6 +5469,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -5247,6 +5493,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winnow" version = "0.5.40" @@ -5256,6 +5508,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.52.0" @@ -5276,25 +5537,28 @@ dependencies = [ ] [[package]] -name = "write16" -version = "1.0.0" +name = "wit-bindgen-rt" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.0", +] [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "wry" -version = "0.47.2" +version = "0.51.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ce51277d65170f6379d8cda935c80e3c2d1f0ff712a123c8bddb11b31a4b73" +checksum = "c886a0a9d2a94fd90cfa1d929629b79cfefb1546e2c7430c63a47f0664c0e4e2" dependencies = [ "base64 0.22.1", - "block2", + "block2 0.6.1", "cookie", "crossbeam-channel", "dpi", @@ -5308,9 +5572,10 @@ dependencies = [ "kuchikiki", "libc", "ndk", - "objc2", + "objc2 0.6.1", "objc2-app-kit", - "objc2-foundation", + "objc2-core-foundation", + "objc2-foundation 0.3.1", "objc2-ui-kit", "objc2-web-kit", "once_cell", @@ -5319,13 +5584,13 @@ dependencies = [ "sha2", "soup3", "tao-macros", - "thiserror 1.0.69", + "thiserror 2.0.12", "url", "webkit2gtk", "webkit2gtk-sys", "webview2-com", - "windows 0.58.0", - "windows-core 0.58.0", + "windows 0.61.1", + "windows-core 0.61.0", "windows-version", "x11-dl", ] @@ -5352,10 +5617,19 @@ dependencies = [ ] [[package]] -name = "yoke" -version = "0.7.5" +name = "xz2" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" +dependencies = [ + "lzma-sys", +] + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -5365,55 +5639,54 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", "synstructure", ] [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", "synstructure", ] @@ -5434,14 +5707,25 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", ] [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" dependencies = [ "yoke", "zerofrom", @@ -5450,20 +5734,20 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.101", ] [[package]] name = "zip" -version = "2.2.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d52293fc86ea7cf13971b3bb81eb21683636e7ae24c729cdaf1b7c4157a352" +checksum = "1dcb24d0152526ae49b9b96c1dcf71850ca1e0b882e4e28ed898a93c41334744" dependencies = [ "aes", "arbitrary", @@ -5472,17 +5756,16 @@ dependencies = [ "crc32fast", "crossbeam-utils", "deflate64", - "displaydoc", "flate2", + "getrandom 0.3.3", "hmac", - "indexmap 2.6.0", + "indexmap 2.9.0", "lzma-rs", "memchr", "pbkdf2", - "rand 0.8.5", "sha1", - "thiserror 2.0.3", "time", + "xz2", "zeroize", "zopfli", "zstd", @@ -5490,41 +5773,39 @@ dependencies = [ [[package]] name = "zopfli" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946" +checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" dependencies = [ "bumpalo", "crc32fast", - "lockfree-object-pool", "log", - "once_cell", "simd-adler32", ] [[package]] name = "zstd" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "7.2.1" +version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.13+zstd.1.5.6" +version = "2.0.15+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" dependencies = [ "cc", "pkg-config", diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/Cargo.toml b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/Cargo.toml index c4b38a8f..89dd7a67 100644 --- a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/Cargo.toml +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/Cargo.toml @@ -14,7 +14,7 @@ serde = "1.0" serde_json = { version = "1", features = [] } thiserror = { version = "2.0.3", features = [] } url = { version = "2.5.3", features = ["serde"] } -reqwest = { version = "0.12.9", features = [] } +reqwest = { version = "0.12.9", features = ["json"] } zip = { version = "2.2.0", features = [] } tokio = { version = "1.41.1", features = [] } mime-infer = { version = "3.0.0", features = [] } @@ -35,6 +35,7 @@ mime_guess = "2.0.5" rayon = "1.10.0" hex_color = "3.0.0" dunce = "1.0.5" +bon = "3.6.3" [build-dependencies] tauri-plugin = { version = "2.0.1", features = ["build"] } diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/build.rs b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/build.rs index 9f0dff99..3412832e 100644 --- a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/build.rs +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/build.rs @@ -1,4 +1,4 @@ -const COMMANDS: &[&str] = &["load", "download", "clear", "remove"]; +const COMMANDS: &[&str] = &["load", "download", "clear", "close", "remove"]; fn main() { tauri_plugin::Builder::new(COMMANDS) diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/dist-js/index.cjs b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/dist-js/index.cjs index e53b239e..aa575c49 100644 --- a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/dist-js/index.cjs +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/dist-js/index.cjs @@ -8,6 +8,9 @@ async function download(options) { async function load(options) { return await core.invoke('plugin:appload|load', { options }); } +async function close(options) { + return await core.invoke('plugin:appload|close', { options }); +} async function remove(options) { return await core.invoke('plugin:appload|remove', { options }); } @@ -16,6 +19,7 @@ async function clear() { } exports.clear = clear; +exports.close = close; exports.download = download; exports.load = load; exports.remove = remove; diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/dist-js/index.d.ts b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/dist-js/index.d.ts index 63243966..3626cc37 100644 --- a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/dist-js/index.d.ts +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/dist-js/index.d.ts @@ -22,6 +22,12 @@ export interface LoadResponse { success: boolean; windowLabel: string; } +export interface CloseOptions { + windowLabel: string; +} +export interface CloseResponse { + success: boolean; +} export interface RemoveOptions { bundleName: string; serverUrl: string; @@ -32,6 +38,7 @@ export interface RemoveResponse { } export declare function download(options: DownloadOptions): Promise; export declare function load(options: LoadOptions): Promise; +export declare function close(options: CloseOptions): Promise; export declare function remove(options: RemoveOptions): Promise; export declare function clear(): Promise; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/dist-js/index.d.ts.map b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/dist-js/index.d.ts.map index 3f581680..df38b143 100644 --- a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/dist-js/index.d.ts.map +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/dist-js/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["guest-js/index.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAElF;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAEtE;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAE5E;AAED,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3C"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["guest-js/index.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAElF;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAEtE;AAED,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAEzE;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAE5E;AAED,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3C"} \ No newline at end of file diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/dist-js/index.js b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/dist-js/index.js index 382f7853..5dbd5b7e 100644 --- a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/dist-js/index.js +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/dist-js/index.js @@ -6,6 +6,9 @@ async function download(options) { async function load(options) { return await invoke('plugin:appload|load', { options }); } +async function close(options) { + return await invoke('plugin:appload|close', { options }); +} async function remove(options) { return await invoke('plugin:appload|remove', { options }); } @@ -13,4 +16,4 @@ async function clear() { return await invoke('plugin:appload|clear'); } -export { clear, download, load, remove }; +export { clear, close, download, load, remove }; diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/examples/tauri-app/package.json b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/examples/tauri-app/package.json index f8153af4..f4d0dade 100644 --- a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/examples/tauri-app/package.json +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/examples/tauri-app/package.json @@ -10,7 +10,7 @@ "tauri": "tauri" }, "dependencies": { - "@tauri-apps/api": "^2.1.1", + "@tauri-apps/api": "2.1.1", "tauri-plugin-appload-api": "file:../../" }, "devDependencies": { diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/guest-js/index.ts b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/guest-js/index.ts index 74f1f085..58cb0772 100644 --- a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/guest-js/index.ts +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/guest-js/index.ts @@ -29,6 +29,14 @@ export interface LoadResponse { windowLabel: string } +export interface CloseOptions { + windowLabel: string +} + +export interface CloseResponse { + success: boolean +} + export interface RemoveOptions { bundleName: string serverUrl: string @@ -47,6 +55,10 @@ export async function load(options: LoadOptions): Promise { return await invoke('plugin:appload|load', { options }) } +export async function close(options: CloseOptions): Promise { + return await invoke('plugin:appload|close', { options }) +} + export async function remove(options: RemoveOptions): Promise { return await invoke('plugin:appload|remove', { options }) } diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/permissions/autogenerated/commands/close.toml b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/permissions/autogenerated/commands/close.toml new file mode 100644 index 00000000..fad12d15 --- /dev/null +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/permissions/autogenerated/commands/close.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-close" +description = "Enables the close command without any pre-configured scope." +commands.allow = ["close"] + +[[permission]] +identifier = "deny-close" +description = "Denies the close command without any pre-configured scope." +commands.deny = ["close"] diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/permissions/autogenerated/reference.md b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/permissions/autogenerated/reference.md index 686fa6dc..0608d50a 100644 --- a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/permissions/autogenerated/reference.md +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/permissions/autogenerated/reference.md @@ -2,6 +2,8 @@ Default permissions for AppLoad plugin +#### This default permission set includes the following: + - `allow-load` - `allow-download` - `allow-clear` @@ -45,6 +47,32 @@ Denies the clear command without any pre-configured scope. +`appload:allow-close` + + + + +Enables the close command without any pre-configured scope. + + + + + + + +`appload:deny-close` + + + + +Denies the close command without any pre-configured scope. + + + + + + + `appload:allow-download` diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/permissions/default.toml b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/permissions/default.toml index fe9f435c..2bb1ae22 100644 --- a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/permissions/default.toml +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/permissions/default.toml @@ -1,3 +1,3 @@ [default] description = "Default permissions for AppLoad plugin" -permissions = ["allow-load", "allow-download", "allow-clear", "allow-remove"] +permissions = ["allow-load", "allow-download", "allow-clear", "allow-close", "allow-remove"] diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/permissions/schemas/schema.json b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/permissions/schemas/schema.json index 3873ff55..97ddce3b 100644 --- a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/permissions/schemas/schema.json +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/permissions/schemas/schema.json @@ -49,7 +49,7 @@ "minimum": 1.0 }, "description": { - "description": "Human-readable description of what the permission does. Tauri convention is to use

headings in markdown content for Tauri documentation generation purposes.", + "description": "Human-readable description of what the permission does. Tauri convention is to use `

` headings in markdown content for Tauri documentation generation purposes.", "type": [ "string", "null" @@ -111,7 +111,7 @@ "type": "string" }, "description": { - "description": "Human-readable description of what the permission does. Tauri internal convention is to use

headings in markdown content for Tauri documentation generation purposes.", + "description": "Human-readable description of what the permission does. Tauri internal convention is to use `

` headings in markdown content for Tauri documentation generation purposes.", "type": [ "string", "null" @@ -297,57 +297,78 @@ { "description": "Enables the clear command without any pre-configured scope.", "type": "string", - "const": "allow-clear" + "const": "allow-clear", + "markdownDescription": "Enables the clear command without any pre-configured scope." }, { "description": "Denies the clear command without any pre-configured scope.", "type": "string", - "const": "deny-clear" + "const": "deny-clear", + "markdownDescription": "Denies the clear command without any pre-configured scope." + }, + { + "description": "Enables the close command without any pre-configured scope.", + "type": "string", + "const": "allow-close" + }, + { + "description": "Denies the close command without any pre-configured scope.", + "type": "string", + "const": "deny-close" }, { "description": "Enables the download command without any pre-configured scope.", "type": "string", - "const": "allow-download" + "const": "allow-download", + "markdownDescription": "Enables the download command without any pre-configured scope." }, { "description": "Denies the download command without any pre-configured scope.", "type": "string", - "const": "deny-download" + "const": "deny-download", + "markdownDescription": "Denies the download command without any pre-configured scope." }, { "description": "Enables the load command without any pre-configured scope.", "type": "string", - "const": "allow-load" + "const": "allow-load", + "markdownDescription": "Enables the load command without any pre-configured scope." }, { "description": "Denies the load command without any pre-configured scope.", "type": "string", - "const": "deny-load" + "const": "deny-load", + "markdownDescription": "Denies the load command without any pre-configured scope." }, { "description": "Enables the ping command without any pre-configured scope.", "type": "string", - "const": "allow-ping" + "const": "allow-ping", + "markdownDescription": "Enables the ping command without any pre-configured scope." }, { "description": "Denies the ping command without any pre-configured scope.", "type": "string", - "const": "deny-ping" + "const": "deny-ping", + "markdownDescription": "Denies the ping command without any pre-configured scope." }, { "description": "Enables the remove command without any pre-configured scope.", "type": "string", - "const": "allow-remove" + "const": "allow-remove", + "markdownDescription": "Enables the remove command without any pre-configured scope." }, { "description": "Denies the remove command without any pre-configured scope.", "type": "string", - "const": "deny-remove" + "const": "deny-remove", + "markdownDescription": "Denies the remove command without any pre-configured scope." }, { - "description": "Default permissions for AppLoad plugin", + "description": "Default permissions for AppLoad plugin\n#### This default permission set includes:\n\n- `allow-load`\n- `allow-download`\n- `allow-clear`\n- `allow-remove`", "type": "string", - "const": "default" + "const": "default", + "markdownDescription": "Default permissions for AppLoad plugin\n#### This default permission set includes:\n\n- `allow-load`\n- `allow-download`\n- `allow-clear`\n- `allow-remove`" } ] } diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/pnpm-lock.yaml b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/pnpm-lock.yaml index b97120a2..51ceb4d9 100644 --- a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/pnpm-lock.yaml +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/pnpm-lock.yaml @@ -9,12 +9,12 @@ importers: .: dependencies: '@tauri-apps/api': - specifier: ^2.0.0 + specifier: 2.1.1 version: 2.1.1 devDependencies: '@rollup/plugin-typescript': specifier: ^11.1.6 - version: 11.1.6(rollup@4.28.0)(tslib@2.8.1)(typescript@5.8.3) + version: 11.1.6(rollup@4.28.0)(tslib@2.8.1)(typescript@5.9.2) rollup: specifier: ^4.9.6 version: 4.28.0 @@ -22,8 +22,8 @@ importers: specifier: ^2.6.2 version: 2.8.1 typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: 5.9.2 + version: 5.9.2 packages: @@ -187,18 +187,18 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} engines: {node: '>=14.17'} hasBin: true snapshots: - '@rollup/plugin-typescript@11.1.6(rollup@4.28.0)(tslib@2.8.1)(typescript@5.8.3)': + '@rollup/plugin-typescript@11.1.6(rollup@4.28.0)(tslib@2.8.1)(typescript@5.9.2)': dependencies: '@rollup/pluginutils': 5.1.3(rollup@4.28.0) resolve: 1.22.8 - typescript: 5.8.3 + typescript: 5.9.2 optionalDependencies: rollup: 4.28.0 tslib: 2.8.1 @@ -322,4 +322,4 @@ snapshots: tslib@2.8.1: {} - typescript@5.8.3: {} + typescript@5.9.2: {} diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/commands.rs b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/commands.rs index c345bdbc..fbbe4591 100644 --- a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/commands.rs +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/commands.rs @@ -9,7 +9,9 @@ use tauri::{ use crate::{ bundle::BundleLoader, cache::CacheManager, - models::{DownloadOptions, DownloadResponse, LoadOptions, LoadResponse}, + models::{ + CloseOptions, CloseResponse, DownloadOptions, DownloadResponse, LoadOptions, LoadResponse, + }, storage::{StorageError, StorageManager}, ui, RemoveOptions, RemoveResponse, Result, }; @@ -111,21 +113,6 @@ pub async fn load(app: AppHandle, options: LoadOptions) -> Result })?; } - for old_label in [ - &format!("{}-curr", base_label), - &format!("{}-next", base_label), - "main", - ] { - if old_label == &label { - continue; - } - - if let Some(old_window) = app.get_webview_window(old_label) { - old_window.close()?; - tracing::info!("Closing {} window", old_label); - } - } - let response = LoadResponse { success: window.is_visible().unwrap_or(false), window_label: label, @@ -135,6 +122,26 @@ pub async fn load(app: AppHandle, options: LoadOptions) -> Result Ok(response) } +#[command] +pub async fn close(app: AppHandle, options: CloseOptions) -> Result { + tracing::info!(?options, "Starting window close process"); + + let Some(window) = app.get_webview_window(&options.window_label) else { + tracing::info!(window_label = %options.window_label, "Window not found or already closed"); + return Ok(CloseResponse { success: true }); + }; + + window.close().map_err(|e| { + tracing::error!(?e, window_label = %options.window_label, "Failed to close window"); + e + })?; + + let response = CloseResponse { success: true }; + + tracing::info!(?response, "Window close process completed"); + Ok(response) +} + #[command] pub async fn remove( app: AppHandle, diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/config/mod.rs b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/config/mod.rs index 5b595eae..44859c36 100644 --- a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/config/mod.rs +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/config/mod.rs @@ -1,5 +1,5 @@ mod model; -pub use model::Config; +pub use model::{ApiConfig, CacheConfig, Config, StorageConfig}; pub const DEFAULT_CONFIG_PATH: &str = "config.json"; diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/config/model.rs b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/config/model.rs index 061fbf7e..173f6f42 100644 --- a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/config/model.rs +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/config/model.rs @@ -1,10 +1,12 @@ +use bon::Builder; use serde::{Deserialize, Serialize}; use std::path::PathBuf; use std::time::Duration; use crate::cache::DEFAULT_CACHE_SIZE; +use crate::vendor::VendorConfig; -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Builder, Serialize, Deserialize)] pub struct Config { #[serde(default)] pub api: ApiConfig, @@ -12,6 +14,8 @@ pub struct Config { pub cache: CacheConfig, #[serde(default)] pub storage: StorageConfig, + #[serde(skip)] + pub vendor: VendorConfig, } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -35,16 +39,6 @@ pub struct StorageConfig { pub max_bundle_size: usize, } -impl Default for Config { - fn default() -> Self { - Self { - api: ApiConfig::default(), - cache: CacheConfig::default(), - storage: StorageConfig::default(), - } - } -} - impl Default for ApiConfig { fn default() -> Self { Self { diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/lib.rs b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/lib.rs index 06eef760..c427fb61 100644 --- a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/lib.rs +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/lib.rs @@ -17,6 +17,8 @@ use tauri::{ Manager, Runtime, }; +pub use config::Config; +pub use config::{ApiConfig, CacheConfig, StorageConfig}; pub use models::*; #[cfg(desktop)] @@ -40,35 +42,28 @@ mod vendor; mod verification; pub use error::{Error, Result}; -pub use vendor::{VendorConfig, VendorConfigBuilder}; +pub use vendor::VendorConfig; #[cfg(mobile)] use mobile::Appload; const KERNEL_JS: &str = include_str!("kernel.js"); -pub fn init(vendor: VendorConfigBuilder) -> TauriPlugin { +pub fn init(config: Config) -> TauriPlugin { Builder::new("appload") .setup(move |app, api| { tracing::info!("Initializing appload plugin"); - tracing::debug!("Loading configuration settings."); - let mut config = config::Config::default(); - - tracing::debug!("Resolving app config directory for storage root."); - let app_config_dir = app.path().app_config_dir().map_err(|e| { - tracing::error!(error = %e, "Failed to resolve app config directory."); - Error::Config(e.to_string()) - })?; + tracing::debug!("Using provided configuration settings."); + let storage_root = config.storage.root_dir.clone(); tracing::info!( - path = ?app_config_dir, - "Setting storage root to app config directory." + path = ?storage_root, + "Using configured storage root directory." ); - config.storage.root_dir = app_config_dir; let storage = tauri::async_runtime::block_on(async { - let storage = storage::StorageManager::new(config.storage.root_dir.clone()) + let storage = storage::StorageManager::new(storage_root) .await .map_err(|e| { tracing::error!(error = %e, "Failed to initialize storage manager"); @@ -107,15 +102,8 @@ pub fn init(vendor: VendorConfigBuilder) -> TauriPlugin { let cache = cache.clone(); let storage = storage.clone(); tauri::async_runtime::block_on(async move { - match vendor.build() { - Ok(vendor) => { - if let Err(e) = vendor.initialize(tauri_config, cache, storage).await { - tracing::error!(error = %e, "Failed to initialize vendor."); - } - } - Err(e) => { - tracing::error!(error = %e, "Failed to build vendor."); - } + if let Err(e) = config.vendor.initialize(tauri_config, cache, storage).await { + tracing::error!(error = %e, "Failed to initialize vendor."); } }); } @@ -142,6 +130,7 @@ pub fn init(vendor: VendorConfigBuilder) -> TauriPlugin { .invoke_handler(tauri::generate_handler![ commands::download, commands::load, + commands::close, commands::remove, commands::clear ]) diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/models.rs b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/models.rs index 9c6978ea..b1fd04cb 100644 --- a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/models.rs +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/models.rs @@ -160,6 +160,18 @@ pub struct LoadResponse { pub window_label: String, } +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct CloseOptions { + pub window_label: String, +} + +#[derive(Debug, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct CloseResponse { + pub success: bool, +} + #[derive(Debug, Clone, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RemoveOptions { diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/vendor/config.rs b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/vendor/config.rs index 6ef28b3b..b839ce79 100644 --- a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/vendor/config.rs +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/vendor/config.rs @@ -1,6 +1,8 @@ +use std::fs; +use std::path::PathBuf; use std::sync::Arc; -use tauri::Config; +use tauri::Config as TauriConfig; use crate::{ bundle::VerifiedBundle, cache::CacheManager, storage::StorageManager, vendor::VendorError, @@ -11,22 +13,26 @@ use super::Result; const VENDOR_SOURCE: &str = "vendor"; -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Default)] pub struct VendorConfig { - pub(super) bundle: Option<(Vec, Manifest)>, + pub bundle_path: PathBuf, + pub manifest_path: PathBuf, } impl VendorConfig { - pub(crate) async fn initialize( - self, - config: Config, + pub async fn initialize( + &self, + config: TauriConfig, cache: Arc, storage: Arc, ) -> Result<()> { - let Some((content, manifest)) = self.bundle else { - tracing::info!("No vendored bundle provided, skipping initialization"); - return Ok(()); - }; + let content = fs::read(&self.bundle_path).map_err(|e| VendorError::Io(e))?; + + let manifest_str = + fs::read_to_string(&self.manifest_path).map_err(|e| VendorError::Io(e))?; + + let manifest: Manifest = + serde_json::from_str(&manifest_str).map_err(|e| VendorError::Json(e))?; let max_bundle_size = 100 * 1024 * 1024; if content.len() > max_bundle_size { @@ -55,6 +61,9 @@ impl VendorConfig { let verified = VerifiedBundle::trust(content, manifest)?; + // NOTE: This is temporary, to make sure bundle verifier + // has required file at the location, + // won't be necessary after source refactor. storage .store_bundle(&name, VENDOR_SOURCE, &version, &verified) .await?; diff --git a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/vendor/mod.rs b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/vendor/mod.rs index 5547337b..2e6dfc9d 100644 --- a/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/vendor/mod.rs +++ b/packages/hoppscotch-desktop/plugin-workspace/tauri-plugin-appload/src/vendor/mod.rs @@ -1,7 +1,5 @@ -mod builder; mod config; mod error; -pub use builder::VendorConfigBuilder; pub use config::VendorConfig; pub use error::{Result, VendorError}; diff --git a/packages/hoppscotch-desktop/src-tauri/Cargo.lock b/packages/hoppscotch-desktop/src-tauri/Cargo.lock index d58338a4..a4da81b0 100644 --- a/packages/hoppscotch-desktop/src-tauri/Cargo.lock +++ b/packages/hoppscotch-desktop/src-tauri/Cargo.lock @@ -251,7 +251,7 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix", + "rustix 0.38.42", "slab", "tracing", "windows-sys 0.59.0", @@ -283,7 +283,7 @@ dependencies = [ "cfg-if", "event-listener", "futures-lite", - "rustix", + "rustix 0.38.42", "tracing", ] @@ -310,7 +310,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix", + "rustix 0.38.42", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -521,6 +521,31 @@ dependencies = [ "piper", ] +[[package]] +name = "bon" +version = "3.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537c317ddf588aab15c695bf92cf55dec159b93221c074180ca3e0e5a94da415" +dependencies = [ + "bon-macros", + "rustversion", +] + +[[package]] +name = "bon-macros" +version = "3.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5abbf2d4a4c6896197c9de13d6d7cb7eff438c63dacde1dde980569cb00248" +dependencies = [ + "darling 0.21.2", + "ident_case", + "prettyplease", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.90", +] + [[package]] name = "brotli" version = "7.0.0" @@ -1136,8 +1161,18 @@ version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.20.10", + "darling_macro 0.20.10", +] + +[[package]] +name = "darling" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08440b3dd222c3d0433e63e097463969485f112baff337dfdaca043a0d760570" +dependencies = [ + "darling_core 0.21.2", + "darling_macro 0.21.2", ] [[package]] @@ -1154,13 +1189,38 @@ dependencies = [ "syn 2.0.90", ] +[[package]] +name = "darling_core" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25b7912bc28a04ab1b7715a68ea03aaa15662b43a1a4b2c480531fd19f8bf7e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.90", +] + [[package]] name = "darling_macro" version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ - "darling_core", + "darling_core 0.20.10", + "quote", + "syn 2.0.90", +] + +[[package]] +name = "darling_macro" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce154b9bea7fb0c8e8326e62d00354000c36e79770ff21b8c84e3aa267d9d531" +dependencies = [ + "darling_core 0.21.2", "quote", "syn 2.0.90", ] @@ -1967,6 +2027,18 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + [[package]] name = "gimli" version = "0.31.1" @@ -2884,6 +2956,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + [[package]] name = "litemap" version = "0.7.4" @@ -3929,7 +4007,7 @@ dependencies = [ "concurrent-queue", "hermit-abi", "pin-project-lite", - "rustix", + "rustix 0.38.42", "tracing", "windows-sys 0.59.0", ] @@ -3955,6 +4033,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "prettyplease" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +dependencies = [ + "proc-macro2", + "syn 2.0.90", +] + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -4117,6 +4205,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "rand" version = "0.7.3" @@ -4477,7 +4571,20 @@ dependencies = [ "bitflags 2.6.0", "errno", "libc", - "linux-raw-sys", + "linux-raw-sys 0.4.14", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys 0.9.4", "windows-sys 0.59.0", ] @@ -4765,7 +4872,7 @@ version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ - "darling", + "darling 0.20.10", "proc-macro2", "quote", "syn 2.0.90", @@ -5341,10 +5448,11 @@ dependencies = [ [[package]] name = "tauri-plugin-appload" version = "0.1.0" -source = "git+https://github.com/CuriousCorrelation/tauri-plugin-appload?rev=e8dbe06eabf947e5efaf07d2e573238ceb11a7b1#e8dbe06eabf947e5efaf07d2e573238ceb11a7b1" +source = "git+https://github.com/CuriousCorrelation/tauri-plugin-appload?branch=feat-desktop-appload-top-level-config#3d03f6c7b1726ecf179af2124e77a9742d600637" dependencies = [ "base64 0.22.1", "blake3", + "bon", "chrono", "cocoa 0.26.0", "dashmap", @@ -5681,14 +5789,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.14.0" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" dependencies = [ - "cfg-if", "fastrand", + "getrandom 0.3.3", "once_cell", - "rustix", + "rustix 1.0.8", "windows-sys 0.59.0", ] @@ -6351,6 +6459,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasm-bindgen" version = "0.2.99" @@ -6439,7 +6556,7 @@ checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" dependencies = [ "cc", "downcast-rs", - "rustix", + "rustix 0.38.42", "scoped-tls", "smallvec", "wayland-sys", @@ -6452,7 +6569,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" dependencies = [ "bitflags 2.6.0", - "rustix", + "rustix 0.38.42", "wayland-backend", "wayland-scanner", ] @@ -6619,7 +6736,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix", + "rustix 0.38.42", ] [[package]] @@ -7093,6 +7210,15 @@ dependencies = [ "windows 0.48.0", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.6.0", +] + [[package]] name = "write16" version = "1.0.0" @@ -7176,8 +7302,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e105d177a3871454f754b33bb0ee637ecaaac997446375fd3e5d43a2ed00c909" dependencies = [ "libc", - "linux-raw-sys", - "rustix", + "linux-raw-sys 0.4.14", + "rustix 0.38.42", ] [[package]] diff --git a/packages/hoppscotch-desktop/src-tauri/Cargo.toml b/packages/hoppscotch-desktop/src-tauri/Cargo.toml index 672c1df8..63904fcf 100644 --- a/packages/hoppscotch-desktop/src-tauri/Cargo.toml +++ b/packages/hoppscotch-desktop/src-tauri/Cargo.toml @@ -29,7 +29,7 @@ tauri-plugin-store = "2.2.0" tauri-plugin-dialog = "2.2.0" tauri-plugin-fs = "2.2.0" tauri-plugin-deep-link = "2.2.0" -tauri-plugin-appload = { git = "https://github.com/CuriousCorrelation/tauri-plugin-appload", rev = "e8dbe06eabf947e5efaf07d2e573238ceb11a7b1" } +tauri-plugin-appload = { git = "https://github.com/CuriousCorrelation/tauri-plugin-appload", branch = "feat-desktop-appload-top-level-config" } tauri-plugin-relay = { git = "https://github.com/CuriousCorrelation/tauri-plugin-relay", rev = "ff18f776ddeb53dbbdeaf97e1fabc30bdc57c158" } axum = "0.8.1" tower-http = { version = "0.6.2", features = ["cors"] } @@ -44,6 +44,9 @@ tauri-plugin-http = { version = "2.0.1", features = ["gzip"] } tauri-plugin-opener = "2" semver = "1.0" +[dev-dependencies] +tempfile = "3.20.0" + [target.'cfg(windows)'.dependencies] tempfile = { version = "3.13.0" } winreg = { version = "0.52.0" } diff --git a/packages/hoppscotch-desktop/src-tauri/capabilities/default.json b/packages/hoppscotch-desktop/src-tauri/capabilities/default.json index 4b3748d9..8c038424 100644 --- a/packages/hoppscotch-desktop/src-tauri/capabilities/default.json +++ b/packages/hoppscotch-desktop/src-tauri/capabilities/default.json @@ -16,8 +16,22 @@ "dialog:default", "process:default", "updater:default", + "fs:allow-copy-file", + "fs:allow-remove", + "fs:allow-exists", + "fs:allow-read-file", + "fs:allow-read-dir", "fs:allow-write-file", "fs:allow-write-text-file", + { + "identifier": "fs:scope", + "allow": [ + { "path": "$APPCONFIG" }, + { "path": "$APPCONFIG/**" }, + { "path": "$APPDATA" }, + { "path": "$APPDATA/**" } + ] + }, "deep-link:default", "appload:default", "relay:default" diff --git a/packages/hoppscotch-desktop/src-tauri/src/backup.rs b/packages/hoppscotch-desktop/src-tauri/src/backup.rs new file mode 100644 index 00000000..eff75b0d --- /dev/null +++ b/packages/hoppscotch-desktop/src-tauri/src/backup.rs @@ -0,0 +1,425 @@ +use std::fs; +use std::path::PathBuf; + +use semver::Version; +use tauri::{AppHandle, Runtime}; + +use crate::{error::HoppError, path}; + +const MAX_BACKUP_COUNT: usize = 3; + +#[tauri::command] +pub async fn check_and_backup_on_version_change( + app: AppHandle, +) -> Result<(), String> { + let handle = app.clone(); + match tauri::async_runtime::spawn_blocking(move || perform_version_check_and_backup(handle)) + .await + { + Ok(Ok(_)) => Ok(()), + Ok(Err(e)) => { + tracing::error!(error = %e, "Backup operation failed"); + Err(e.to_string()) + } + Err(e) => { + tracing::error!(error = %e, "Backup task panicked"); + Err("Backup operation panicked".to_string()) + } + } +} + +pub fn perform_version_check_and_backup(app: AppHandle) -> Result<(), HoppError> { + let current_version = get_current_app_version(&app)?; + + tracing::info!( + current_version = %current_version, + "Version check initiated" + ); + + if !backup_exists_for_version(¤t_version)? { + tracing::info!( + version = %current_version, + "No backup found for current version, creating backup" + ); + + backup_current_data(¤t_version)?; + cleanup_old_backups()?; + + tracing::info!("Backup operation completed successfully"); + } else { + tracing::debug!( + version = %current_version, + "Backup already exists for current version, skipping" + ); + } + + Ok(()) +} + +fn get_current_app_version(app: &AppHandle) -> Result { + let version_str = app.package_info().version.to_string(); + Version::parse(&version_str).map_err(|e| { + tracing::error!( + version_string = %version_str, + error = %e, + "Failed to parse current app version" + ); + HoppError::Io(std::io::Error::new( + std::io::ErrorKind::InvalidData, + format!("Invalid version format: {}", version_str), + )) + }) +} + +fn backup_exists_for_version(version: &Version) -> Result { + let backup_dir = path::backup_dir()?; + let version_backup_dir = backup_dir.join(format!("backup-by-v{}", version)); + + Ok(version_backup_dir.exists()) +} + +fn backup_current_data(current_version: &Version) -> Result<(), HoppError> { + let config_dir = path::config_dir()?; + let backup_dir = path::backup_dir()?; + let version_backup_dir = backup_dir.join(format!("backup-by-v{}", current_version)); + + if !config_dir.exists() { + tracing::warn!("Config directory doesn't exist, skipping backup"); + return Ok(()); + } + + tracing::info!( + source = %config_dir.display(), + target = %version_backup_dir.display(), + "Starting full config directory backup" + ); + + fs::create_dir_all(&version_backup_dir)?; + + // NOTE: This copies all contents of `config_dir` to `version_backup_dir`, + // but excludes the `backup` and `latest` directories to avoid infinite recursion + // and prevent backing up the current working data that might be in flux. + copy_directory_contents_excluding_special_dirs(&config_dir, &version_backup_dir, &backup_dir)?; + + tracing::info!( + target = %version_backup_dir.display(), + "Full config backup completed successfully" + ); + + Ok(()) +} + +fn copy_directory_contents_excluding_special_dirs( + src: &PathBuf, + dst: &PathBuf, + backup_dir: &PathBuf, +) -> Result<(), HoppError> { + if !src.exists() { + return Ok(()); + } + + let latest_dir = match path::latest_dir() { + Ok(dir) => Some(dir), + Err(e) => { + tracing::warn!(error = %e, "Failed to get latest directory path"); + None + } + }; + + for entry in fs::read_dir(src)? { + let entry = entry?; + let src_path = entry.path(); + let dst_path = dst.join(entry.file_name()); + + if src_path == *backup_dir { + tracing::debug!( + path = %src_path.display(), + "Skipping backup directory to avoid recursion" + ); + continue; + } + + if let Some(ref latest_dir) = latest_dir { + if src_path == *latest_dir { + tracing::debug!( + path = %src_path.display(), + "Skipping latest directory to avoid backing up current working data" + ); + continue; + } + } + + if src_path.is_dir() { + copy_directory_recursive(&src_path, &dst_path)?; + } else { + fs::copy(&src_path, &dst_path)?; + } + } + + Ok(()) +} + +fn copy_directory_recursive(src: &PathBuf, dst: &PathBuf) -> Result<(), HoppError> { + if !src.exists() { + return Ok(()); + } + + fs::create_dir_all(dst)?; + + for entry in fs::read_dir(src)? { + let entry = entry?; + let src_path = entry.path(); + let dst_path = dst.join(entry.file_name()); + + if src_path.is_dir() { + copy_directory_recursive(&src_path, &dst_path)?; + } else { + fs::copy(&src_path, &dst_path)?; + } + } + + Ok(()) +} + +fn parse_version_from_backup_dirname(dirname: &str) -> Option { + // Parse "backup-by-v1.2.3" format + if let Some(version_part) = dirname.strip_prefix("backup-by-v") { + Version::parse(version_part).ok() + } else { + None + } +} + +fn cleanup_old_backups() -> Result<(), HoppError> { + let backup_dir = path::backup_dir()?; + + if !backup_dir.exists() { + return Ok(()); + } + + let entries = fs::read_dir(&backup_dir)?; + let mut version_paths = Vec::new(); + + for entry in entries { + let entry = entry?; + let path = entry.path(); + + if path.is_dir() { + if let Some(dirname) = path.file_name().and_then(|n| n.to_str()) { + if let Some(version) = parse_version_from_backup_dirname(dirname) { + version_paths.push((version, path)); + } + } + } + } + + if version_paths.len() <= MAX_BACKUP_COUNT { + return Ok(()); + } + + version_paths.sort_by(|a, b| a.0.cmp(&b.0)); + + let to_remove_count = version_paths.len() - MAX_BACKUP_COUNT; + let to_remove = &version_paths[..to_remove_count]; + + for (version, path) in to_remove { + tracing::info!( + version = %version, + path = %path.display(), + "Removing old backup" + ); + + match fs::remove_dir_all(path) { + Ok(_) => { + tracing::debug!( + version = %version, + "Successfully removed old backup" + ); + } + Err(e) => { + tracing::warn!( + version = %version, + error = %e, + "Failed to remove old backup, continuing" + ); + } + } + } + + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use tempfile::TempDir; + + #[test] + fn test_parse_version_from_backup_dirname() { + // Valid cases + assert_eq!( + parse_version_from_backup_dirname("backup-by-v1.2.3"), + Some(Version::new(1, 2, 3)) + ); + assert_eq!( + parse_version_from_backup_dirname("backup-by-v10.0.0"), + Some(Version::new(10, 0, 0)) + ); + assert_eq!( + parse_version_from_backup_dirname("backup-by-v2.1.0-beta.1"), + Version::parse("2.1.0-beta.1").ok() + ); + + // Invalid cases + assert_eq!(parse_version_from_backup_dirname("backup-v1.2.3"), None); + assert_eq!(parse_version_from_backup_dirname("v1.2.3"), None); + assert_eq!(parse_version_from_backup_dirname("backup-by-v"), None); + assert_eq!( + parse_version_from_backup_dirname("backup-by-vinvalid"), + None + ); + assert_eq!(parse_version_from_backup_dirname(""), None); + assert_eq!(parse_version_from_backup_dirname("random-dir"), None); + } + + #[test] + fn test_max_backup_count_constant() { + assert_eq!(MAX_BACKUP_COUNT, 3); + } + + #[test] + fn test_copy_directory_recursive_empty_dir() { + let temp_dir = TempDir::new().unwrap(); + let src = temp_dir.path().join("src"); + let dst = temp_dir.path().join("dst"); + + fs::create_dir_all(&src).unwrap(); + + let result = copy_directory_recursive(&src, &dst); + assert!(result.is_ok()); + assert!(dst.exists()); + assert!(dst.is_dir()); + } + + #[test] + fn test_copy_directory_recursive_with_files() { + let temp_dir = TempDir::new().unwrap(); + let src = temp_dir.path().join("src"); + let dst = temp_dir.path().join("dst"); + + fs::create_dir_all(&src).unwrap(); + fs::write(src.join("test.txt"), "test content").unwrap(); + fs::create_dir_all(src.join("subdir")).unwrap(); + fs::write(src.join("subdir").join("nested.txt"), "nested content").unwrap(); + + let result = copy_directory_recursive(&src, &dst); + assert!(result.is_ok()); + + assert!(dst.exists()); + assert!(dst.join("test.txt").exists()); + assert!(dst.join("subdir").exists()); + assert!(dst.join("subdir").join("nested.txt").exists()); + + let content = fs::read_to_string(dst.join("test.txt")).unwrap(); + assert_eq!(content, "test content"); + + let nested_content = fs::read_to_string(dst.join("subdir").join("nested.txt")).unwrap(); + assert_eq!(nested_content, "nested content"); + } + + #[test] + fn test_copy_directory_recursive_nonexistent_src() { + let temp_dir = TempDir::new().unwrap(); + let src = temp_dir.path().join("nonexistent"); + let dst = temp_dir.path().join("dst"); + + let result = copy_directory_recursive(&src, &dst); + assert!(result.is_ok()); // Should return Ok for nonexistent source + assert!(!dst.exists()); // Destination should not be created + } + + #[test] + fn test_version_sorting_in_cleanup() { + let versions = vec![ + Version::new(1, 0, 0), + Version::new(2, 1, 0), + Version::new(1, 5, 0), + Version::new(2, 0, 0), + ]; + + let mut version_paths: Vec<(Version, PathBuf)> = versions + .into_iter() + .map(|v| { + ( + v.clone(), + PathBuf::from(format!("backup-by-v{}", v.clone())), + ) + }) + .collect(); + + version_paths.sort_by(|a, b| a.0.cmp(&b.0)); + + // Should be sorted: 1.0.0, 1.5.0, 2.0.0, 2.1.0 + assert_eq!(version_paths[0].0, Version::new(1, 0, 0)); + assert_eq!(version_paths[1].0, Version::new(1, 5, 0)); + assert_eq!(version_paths[2].0, Version::new(2, 0, 0)); + assert_eq!(version_paths[3].0, Version::new(2, 1, 0)); + } + + #[test] + fn test_cleanup_old_backups_integration() { + let temp_dir = TempDir::new().unwrap(); + let backup_root = temp_dir.path(); + + let backup_dirs = vec![ + "backup-by-v1.0.0", + "backup-by-v1.1.0", + "backup-by-v1.2.0", + "backup-by-v2.0.0", + "backup-by-v2.1.0", // This should be kept (newest 3) + "backup-by-v2.2.0", // This should be kept + "backup-by-v3.0.0", // This should be kept + "not-a-backup-dir", // This should be ignored + ]; + + for dir in &backup_dirs { + fs::create_dir_all(backup_root.join(dir)).unwrap(); + } + + let entries = fs::read_dir(backup_root).unwrap(); + let mut version_paths = Vec::new(); + + for entry in entries { + let entry = entry.unwrap(); + let path = entry.path(); + + if path.is_dir() { + if let Some(dirname) = path.file_name().and_then(|n| n.to_str()) { + if let Some(version) = parse_version_from_backup_dirname(dirname) { + version_paths.push((version, path)); + } + } + } + } + + version_paths.sort_by(|a, b| a.0.cmp(&b.0)); + + // Should have 7 valid backup directories (excluding "not-a-backup-dir") + assert_eq!(version_paths.len(), 7); + + // If MAX_BACKUP_COUNT is 3, we should remove 4 directories + let should_remove = version_paths.len() > MAX_BACKUP_COUNT; + assert!(should_remove); + + if should_remove { + let to_remove_count = version_paths.len() - MAX_BACKUP_COUNT; + assert_eq!(to_remove_count, 4); + + // The oldest versions should be marked for removal + assert_eq!(version_paths[0].0, Version::new(1, 0, 0)); + assert_eq!(version_paths[1].0, Version::new(1, 1, 0)); + assert_eq!(version_paths[2].0, Version::new(1, 2, 0)); + assert_eq!(version_paths[3].0, Version::new(2, 0, 0)); + } + } +} diff --git a/packages/hoppscotch-desktop/src-tauri/src/config.rs b/packages/hoppscotch-desktop/src-tauri/src/config.rs new file mode 100644 index 00000000..fdbfab2b --- /dev/null +++ b/packages/hoppscotch-desktop/src-tauri/src/config.rs @@ -0,0 +1,117 @@ +use std::{fs, path::PathBuf, time::Duration}; + +use tauri_plugin_appload::{ApiConfig, CacheConfig, Config, StorageConfig, VendorConfig}; + +use crate::{error::HoppError, path}; + +const API_SERVER_URL: &str = "http://localhost:3200"; +const API_TIMEOUT_SECS: u64 = 30; +const CACHE_MAX_SIZE_MB: usize = 1000; +const CACHE_FILE_TTL_SECS: u64 = 3600; +const CACHE_HOT_RATIO: f32 = 0.9; +const MAX_BUNDLE_SIZE_MB: usize = 50; + +pub struct HoppApploadConfig { + bundle_path: PathBuf, + manifest_path: PathBuf, + config_dir: PathBuf, +} + +impl HoppApploadConfig { + pub fn new() -> Result { + let config_dir = path::config_dir().unwrap_or_else(|e| { + tracing::error!(error = %e, "Failed to create config directory, using temp dir"); + std::env::temp_dir().join(path::APP_ID) + }); + + let bundle_path = path::bundle_path(); + let manifest_path = path::manifest_path(); + + Ok(Self { + bundle_path, + manifest_path, + config_dir, + }) + } + + pub fn write_vendored(&self) -> Result<(), HoppError> { + fs::write(&self.bundle_path, include_bytes!("../../bundle.zip"))?; + fs::write(&self.manifest_path, include_bytes!("../../manifest.json"))?; + Ok(()) + } + + pub fn build(&self) -> Config { + Config::builder() + .api(ApiConfig { + server_url: API_SERVER_URL.to_string(), + timeout: Duration::from_secs(API_TIMEOUT_SECS), + }) + .cache(CacheConfig { + max_size: CACHE_MAX_SIZE_MB * 1024 * 1024, + file_ttl: Duration::from_secs(CACHE_FILE_TTL_SECS), + hot_ratio: CACHE_HOT_RATIO, + }) + .storage(StorageConfig { + root_dir: self.config_dir.clone(), + max_bundle_size: MAX_BUNDLE_SIZE_MB * 1024 * 1024, + }) + .vendor(VendorConfig { + bundle_path: self.bundle_path.clone(), + manifest_path: self.manifest_path.clone(), + }) + .build() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_constants() { + // NOTE: These are rather pointless tests, but are here just in case + // there are rebase/merge conflicts that rewrites the values + // (since there's been quite a lot of experimentation on that front) + // so this created on a new branch shall remain consistent. + assert_eq!(API_SERVER_URL, "http://localhost:3200"); + assert_eq!(API_TIMEOUT_SECS, 30); + assert_eq!(CACHE_MAX_SIZE_MB, 1000); + assert_eq!(CACHE_FILE_TTL_SECS, 3600); + assert_eq!(CACHE_HOT_RATIO, 0.9); + assert_eq!(MAX_BUNDLE_SIZE_MB, 50); + } + + #[test] + fn test_hopp_appload_config_new() { + let config = HoppApploadConfig::new(); + assert!(config.is_ok()); + + let config = config.unwrap(); + assert!(config + .bundle_path + .to_string_lossy() + .contains("hopp_bundle.zip")); + assert!(config + .manifest_path + .to_string_lossy() + .contains("hopp_manifest.json")); + assert!(!config.config_dir.as_os_str().is_empty()); + } + + #[test] + fn test_config_paths() { + let config = HoppApploadConfig::new().unwrap(); + + assert_eq!( + config.bundle_path.file_name().unwrap().to_str().unwrap(), + "hopp_bundle.zip" + ); + + assert_eq!( + config.manifest_path.file_name().unwrap().to_str().unwrap(), + "hopp_manifest.json" + ); + + assert!(!config.config_dir.as_os_str().is_empty()); + } +} diff --git a/packages/hoppscotch-desktop/src-tauri/src/dialog.rs b/packages/hoppscotch-desktop/src-tauri/src/dialog.rs new file mode 100644 index 00000000..e4967b43 --- /dev/null +++ b/packages/hoppscotch-desktop/src-tauri/src/dialog.rs @@ -0,0 +1,58 @@ +use native_dialog::{MessageDialog, MessageType}; + +pub fn panic(msg: &str) { + const FATAL_ERROR: &str = "Fatal error"; + + MessageDialog::new() + .set_type(MessageType::Error) + .set_title(FATAL_ERROR) + .set_text(msg) + .show_alert() + .unwrap_or_default(); + + tracing::error!("{}: {}", FATAL_ERROR, msg); + + panic!("{}: {}", FATAL_ERROR, msg); +} + +pub fn info(msg: &str) { + tracing::info!("{}", msg); + + MessageDialog::new() + .set_type(MessageType::Info) + .set_title("Info") + .set_text(msg) + .show_alert() + .unwrap_or_default(); +} + +pub fn warn(msg: &str) { + tracing::warn!("{}", msg); + + MessageDialog::new() + .set_type(MessageType::Warning) + .set_title("Warning") + .set_text(msg) + .show_alert() + .unwrap_or_default(); +} + +pub fn error(msg: &str) { + tracing::error!("{}", msg); + + MessageDialog::new() + .set_type(MessageType::Error) + .set_title("Error") + .set_text(msg) + .show_alert() + .unwrap_or_default(); +} + +pub fn confirm(title: &str, msg: &str, icon: MessageType) -> bool { + MessageDialog::new() + .set_type(icon) + .set_title(title) + .set_text(msg) + .show_confirm() + .unwrap_or_default() +} diff --git a/packages/hoppscotch-desktop/src-tauri/src/error.rs b/packages/hoppscotch-desktop/src-tauri/src/error.rs new file mode 100644 index 00000000..02474e03 --- /dev/null +++ b/packages/hoppscotch-desktop/src-tauri/src/error.rs @@ -0,0 +1,18 @@ +use std::io; + +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum HoppError { + #[error("IO error: {0}")] + Io(#[from] io::Error), + + #[error("Failed to initialize server port")] + ServerPortInitialization, + + #[error("Failed to emit event: {0}")] + EventEmission(String), + + #[error("Tauri error: {0}")] + Tauri(#[from] tauri::Error), +} diff --git a/packages/hoppscotch-desktop/src-tauri/src/lib.rs b/packages/hoppscotch-desktop/src-tauri/src/lib.rs index 572da8c2..f5e68221 100644 --- a/packages/hoppscotch-desktop/src-tauri/src/lib.rs +++ b/packages/hoppscotch-desktop/src-tauri/src/lib.rs @@ -1,22 +1,116 @@ +pub mod backup; +pub mod config; +pub mod dialog; +pub mod error; pub mod logger; +pub mod path; pub mod server; pub mod updater; +pub mod util; +pub mod webview; use std::sync::OnceLock; -use tauri::{Emitter, Manager}; -use tauri_plugin_appload::VendorConfigBuilder; +use tauri::Emitter; use tauri_plugin_deep_link::DeepLinkExt; use tauri_plugin_window_state::StateFlags; use random_port::{PortPicker, Protocol}; -pub const HOPPSCOTCH_DESKTOP_IDENTIFIER: &'static str = "io.hoppscotch.desktop"; +use config::HoppApploadConfig; +use error::HoppError; + static SERVER_PORT: OnceLock = OnceLock::new(); +#[tauri::command] +fn is_portable() -> bool { + cfg!(feature = "portable") +} + #[tauri::command] fn hopp_auth_port() -> u16 { - *SERVER_PORT.get().expect("Server port not initialized") + SERVER_PORT + .get() + .copied() + .expect("Server port not initialized") +} + +fn setup_deep_link_handler(app: &tauri::App) -> Result<(), HoppError> { + let handle = app.handle().clone(); + + app.deep_link().on_open_url(move |event| { + let urls = event.urls(); + tracing::info!( + urls = ?urls, + count = urls.len(), + "Processing deep link request" + ); + + if let Err(e) = handle.emit("scheme-request-received", urls) { + tracing::error!( + error.message = %e, + error.type = %std::any::type_name_of_val(&e), + "Deep link event emission failed" + ); + } + }); + + tracing::info!(app_name = %app.package_info().name, "Configured deep link handler"); + + Ok(()) +} + +fn setup_server(app: &tauri::App) -> Result { + let server_port: u16 = PortPicker::new() + .protocol(Protocol::Tcp) + .port_range(15000..=25000) + .pick() + .map_err(|_| HoppError::ServerPortInitialization)?; + + tracing::info!("Selected server port: {}", server_port); + SERVER_PORT + .set(server_port) + .map_err(|_| HoppError::ServerPortInitialization)?; + + let port = *SERVER_PORT + .get() + .ok_or(HoppError::ServerPortInitialization)?; + tracing::info!(port = port, "Initializing server with pre-selected port"); + + let port = server::init(port, app.handle().clone()); + tracing::info!(port = port, "Server initialization complete"); + + Ok(port) +} + +async fn setup_version_backup(app: &tauri::App) -> Result<(), HoppError> { + tracing::info!("Checking for version changes and performing backup if needed"); + + let handle = app.handle().clone(); + match tauri::async_runtime::spawn_blocking(move || { + backup::perform_version_check_and_backup(handle) + }) + .await + { + Ok(Ok(_)) => { + tracing::info!("Version backup check completed successfully"); + Ok(()) + } + Ok(Err(e)) => { + tracing::error!( + error = %e, + "Version backup check failed, but continuing with startup" + ); + Ok(()) + } + Err(e) => { + tracing::error!( + error = %e, + "Version backup task panicked, but continuing with startup" + ); + Ok(()) + } + } } /// Gracefully quit the Hoppscotch Desktop @@ -40,45 +134,55 @@ fn quit_app(app: tauri::AppHandle) -> Result<(), String> { #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { - tauri::Builder::default() + let mode = if cfg!(feature = "portable") { + "portable" + } else { + "standard" + }; + tracing::info!(mode = mode, "Hoppscotch Desktop running in {} mode", mode); + + #[cfg(all(feature = "portable", windows))] + { + tracing::debug!("Checking WebView initialization for portable Windows variant"); + webview::init_webview(); + } + + let appload_config = match HoppApploadConfig::new() { + Ok(config) => config, + Err(e) => { + tracing::error!(error = %e, "Failed to initialize application configuration"); + return; + } + }; + + if let Err(e) = appload_config.write_vendored() { + tracing::error!(error = %e, "Failed to write bundled files"); + return; + } + + let appload_config = appload_config.build(); + + let app = tauri::Builder::default() .setup(|app| { - let server_port: u16 = PortPicker::new() - .protocol(Protocol::Tcp) - .port_range(15000..=25000) - .pick() - .expect("Cannot find unused port"); - tracing::info!("Selected server port: {}", server_port); - SERVER_PORT - .set(server_port) - .expect("Failed to set server port"); - let port = *SERVER_PORT.get().expect("Server port not initialized"); - tracing::info!(port = port, "Initializing server with pre-selected port"); - let port = server::init(port, app.handle().clone()); - tracing::info!(port = port, "Server initialization complete"); + tauri::async_runtime::block_on(async { + if let Err(e) = setup_version_backup(app).await { + tracing::error!(error = %e, "Failed to setup version backup"); + return Err(e.into()); + } - tracing::info!(app_name = %app.package_info().name, "Configuring deep link handler"); - let handle = app.handle().clone(); - app.deep_link().on_open_url(move |event| { - let urls = event.urls(); - tracing::info!( - urls = ?urls, - count = urls.len(), - "Processing deep link request" - ); - handle - .emit("scheme-request-received", urls) - .unwrap_or_else(|e| { - tracing::error!( - error.message = %e, - error.type = %std::any::type_name_of_val(&e), - "Deep link event emission failed" - ); - }); - }); + if let Err(e) = setup_server(app) { + tracing::error!(error = %e, "Failed to setup server"); + return Err(e.into()); + } - tracing::info!("Starting Hoppscotch Desktop v{}", env!("CARGO_PKG_VERSION")); + if let Err(e) = setup_deep_link_handler(app) { + tracing::error!(error = %e, "Failed to setup deep link handler"); + return Err(e.into()); + } - Ok(()) + tracing::info!("Starting Hoppscotch Desktop v{}", env!("CARGO_PKG_VERSION")); + Ok(()) + }) }) .plugin( tauri_plugin_window_state::Builder::new() @@ -92,25 +196,32 @@ pub fn run() { .build(), ) .plugin(tauri_plugin_process::init()) + .plugin(tauri_plugin_http::init()) + .plugin(tauri_plugin_opener::init()) .plugin(tauri_plugin_updater::Builder::new().build()) .plugin(tauri_plugin_store::Builder::new().build()) .plugin(tauri_plugin_deep_link::init()) .plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_shell::init()) .plugin(tauri_plugin_fs::init()) - .plugin(tauri_plugin_appload::init( - VendorConfigBuilder::new().bundle( - include_bytes!("../../bundle.zip").to_vec(), - include_bytes!("../../manifest.json"), - ), - )) + .plugin(tauri_plugin_appload::init(appload_config)) .plugin(tauri_plugin_relay::init()) .invoke_handler(tauri::generate_handler![ + is_portable, hopp_auth_port, - updater::check_updates_available, - updater::install_updates_and_restart, quit_app, + backup::check_and_backup_on_version_change, + updater::check_for_updates, + path::get_config_dir, + path::get_latest_dir, + path::get_instance_dir, + path::get_store_dir, + path::get_backup_dir, + path::get_logs_dir, ]) - .run(tauri::generate_context!()) - .expect("error while running tauri application"); + .run(tauri::generate_context!()); + + if let Err(e) = app { + tracing::error!(error = %e, "Error while running Hoppscotch Desktop"); + } } diff --git a/packages/hoppscotch-desktop/src-tauri/src/logger.rs b/packages/hoppscotch-desktop/src-tauri/src/logger.rs index 7455b03f..7ce3fc52 100644 --- a/packages/hoppscotch-desktop/src-tauri/src/logger.rs +++ b/packages/hoppscotch-desktop/src-tauri/src/logger.rs @@ -3,7 +3,7 @@ use std::path::PathBuf; use file_rotate::{compression::Compression, suffix::AppendCount, ContentLimit, FileRotate}; use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt, EnvFilter}; -use crate::HOPPSCOTCH_DESKTOP_IDENTIFIER; +use crate::path; pub struct LogGuard(pub tracing_appender::non_blocking::WorkerGuard); @@ -12,7 +12,7 @@ pub fn setup(log_dir: &PathBuf) -> Result> let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| "debug".into()); - let log_file_path = log_dir.join(&format!("{}.log", HOPPSCOTCH_DESKTOP_IDENTIFIER)); + let log_file_path = path::log_file_path(); tracing::info!(log_file_path =? &log_file_path); let file = FileRotate::new( diff --git a/packages/hoppscotch-desktop/src-tauri/src/main.rs b/packages/hoppscotch-desktop/src-tauri/src/main.rs index 82295274..641b8464 100644 --- a/packages/hoppscotch-desktop/src-tauri/src/main.rs +++ b/packages/hoppscotch-desktop/src-tauri/src/main.rs @@ -3,37 +3,31 @@ use hoppscotch_desktop_lib::{ logger::{self, LogGuard}, - HOPPSCOTCH_DESKTOP_IDENTIFIER, + path, }; fn main() { - // Follows how `tauri` does this - // see: https://github.com/tauri-apps/tauri/blob/dev/crates/tauri/src/path/desktop.rs - let path = { - #[cfg(target_os = "macos")] - let path = dirs::home_dir() - .map(|dir| dir.join("Library/Logs").join(HOPPSCOTCH_DESKTOP_IDENTIFIER)); + #[cfg(feature = "portable")] + println!("Starting Hoppscotch Desktop in PORTABLE mode"); - #[cfg(not(target_os = "macos"))] - let path = - dirs::data_local_dir().map(|dir| dir.join(HOPPSCOTCH_DESKTOP_IDENTIFIER).join("logs")); + #[cfg(not(feature = "portable"))] + println!("Starting Hoppscotch Desktop in STANDARD mode"); - path + let log_dir = match path::logs_dir() { + Ok(dir) => { + println!("Log directory: {}", dir.display()); + dir + } + Err(e) => { + eprintln!("Failed to setup logging directory: {}", e); + println!("Starting Hoppscotch Desktop without logging..."); + return hoppscotch_desktop_lib::run(); + } }; - let Some(log_file_path) = path else { - eprint!("Failed to setup logging!"); - - println!("Starting Hoppscotch Desktop..."); - - return hoppscotch_desktop_lib::run(); - }; - - let Ok(LogGuard(guard)) = logger::setup(&log_file_path) else { - eprint!("Failed to setup logging!"); - - println!("Starting Hoppscotch Desktop..."); - + let Ok(LogGuard(guard)) = logger::setup(&log_dir) else { + eprintln!("Failed to setup logging!"); + println!("Starting Hoppscotch Desktop without logging..."); return hoppscotch_desktop_lib::run(); }; @@ -42,7 +36,30 @@ fn main() { // so safe to have it like this. let _guard = guard; - tracing::info!("Starting Hoppscotch Desktop..."); + #[cfg(feature = "portable")] + { + tracing::info!( + "Hoppscotch Desktop v{} starting in PORTABLE mode", + env!("CARGO_PKG_VERSION") + ); + if let Ok(config_dir) = path::config_dir() { + tracing::info!("Config directory (portable): {}", config_dir.display()); + } + if let Ok(current_dir) = std::env::current_dir() { + tracing::info!("Current working directory: {}", current_dir.display()); + } + } + + #[cfg(not(feature = "portable"))] + { + tracing::info!( + "Hoppscotch Desktop v{} starting in STANDARD mode", + env!("CARGO_PKG_VERSION") + ); + if let Ok(config_dir) = path::config_dir() { + tracing::info!("Config directory (standard): {}", config_dir.display()); + } + } hoppscotch_desktop_lib::run() } diff --git a/packages/hoppscotch-desktop/src-tauri/src/path.rs b/packages/hoppscotch-desktop/src-tauri/src/path.rs new file mode 100644 index 00000000..6f9dc0bc --- /dev/null +++ b/packages/hoppscotch-desktop/src-tauri/src/path.rs @@ -0,0 +1,314 @@ +use std::io; +use std::path::PathBuf; + +/// App identifier (identical to `tauri.conf.json`) +/// used for various directories and configurations +pub const APP_ID: &str = "io.hoppscotch.desktop"; + +pub fn config_dir() -> io::Result { + let path = platform_config_dir(); + std::fs::create_dir_all(&path)?; + Ok(path) +} + +pub fn latest_dir() -> io::Result { + let path = config_dir()?.join("latest"); + std::fs::create_dir_all(&path)?; + Ok(path) +} + +pub fn instance_dir() -> io::Result { + let path = latest_dir()?.join("instance"); + std::fs::create_dir_all(&path)?; + Ok(path) +} + +pub fn store_dir() -> io::Result { + let path = latest_dir()?.join("store"); + std::fs::create_dir_all(&path)?; + Ok(path) +} + +pub fn get_versioned_backup_dir(version: &str) -> io::Result { + let backup_root = backup_dir()?; + let versioned_path = backup_root.join(format!("v{}", version)); + std::fs::create_dir_all(&versioned_path)?; + Ok(versioned_path) +} + +pub fn backup_dir() -> io::Result { + let path = config_dir()?.join("backup"); + std::fs::create_dir_all(&path)?; + Ok(path) +} + +pub fn logs_dir() -> io::Result { + let path = platform_logs_dir(); + std::fs::create_dir_all(&path)?; + Ok(path) +} + +#[tauri::command] +pub fn get_config_dir() -> Result { + config_dir() + .map(|path| path.to_string_lossy().to_string()) + .map_err(|err| err.to_string()) +} + +#[tauri::command] +pub fn get_latest_dir() -> Result { + latest_dir() + .map(|path| path.to_string_lossy().to_string()) + .map_err(|err| err.to_string()) +} + +#[tauri::command] +pub fn get_instance_dir() -> Result { + instance_dir() + .map(|path| path.to_string_lossy().to_string()) + .map_err(|err| err.to_string()) +} + +#[tauri::command] +pub fn get_store_dir() -> Result { + store_dir() + .map(|path| path.to_string_lossy().to_string()) + .map_err(|err| err.to_string()) +} + +#[tauri::command] +pub fn get_backup_dir() -> Result { + backup_dir() + .map(|path| path.to_string_lossy().to_string()) + .map_err(|err| err.to_string()) +} + +#[tauri::command] +pub fn get_logs_dir() -> Result { + logs_dir() + .map(|path| path.to_string_lossy().to_string()) + .map_err(|err| err.to_string()) +} + +pub fn log_file_path() -> PathBuf { + platform_logs_dir().join(format!("{}.log", APP_ID)) +} + +pub fn bundle_path() -> PathBuf { + if cfg!(feature = "portable") { + std::env::current_dir() + .unwrap_or_else(|_| std::env::temp_dir()) + .join("hopp_bundle.zip") + } else { + std::env::temp_dir().join("hopp_bundle.zip") + } +} + +pub fn manifest_path() -> PathBuf { + if cfg!(feature = "portable") { + std::env::current_dir() + .unwrap_or_else(|_| std::env::temp_dir()) + .join("hopp_manifest.json") + } else { + std::env::temp_dir().join("hopp_manifest.json") + } +} + +// Follows how `tauri` does this +// see: https://github.com/tauri-apps/tauri/blob/dev/crates/tauri/src/path/desktop.rs +fn platform_config_dir() -> PathBuf { + if cfg!(feature = "portable") { + return std::env::current_dir() + .unwrap_or_else(|_| std::env::temp_dir()) + .join("hoppscotch-desktop-data"); + } + + #[cfg(target_os = "macos")] + { + dirs::home_dir() + .map(|dir| dir.join("Library/Application Support").join(APP_ID)) + .unwrap_or_else(|| std::env::temp_dir().join(APP_ID)) + } + + #[cfg(target_os = "windows")] + { + dirs::config_dir() + .map(|dir| dir.join(APP_ID)) + .unwrap_or_else(|| std::env::temp_dir().join(APP_ID)) + } + + #[cfg(target_os = "linux")] + { + dirs::config_dir() + .map(|dir| dir.join(APP_ID)) + .unwrap_or_else(|| std::env::temp_dir().join(APP_ID)) + } + + // Fallback for others + #[cfg(not(any(target_os = "macos", target_os = "windows", target_os = "linux")))] + { + std::env::temp_dir().join(APP_ID) + } +} + +// Follows how `tauri` does this +// see: https://github.com/tauri-apps/tauri/blob/dev/crates/tauri/src/path/desktop.rs +fn platform_logs_dir() -> PathBuf { + if cfg!(feature = "portable") { + return std::env::current_dir() + .unwrap_or_else(|_| std::env::temp_dir()) + .join("logs"); + } + + #[cfg(target_os = "macos")] + { + dirs::home_dir() + .map(|dir| dir.join("Library/Logs").join(APP_ID)) + .unwrap_or_else(|| std::env::temp_dir().join(APP_ID).join("logs")) + } + + // Also fallback for others + #[cfg(not(target_os = "macos"))] + { + dirs::data_local_dir() + .map(|dir| dir.join(APP_ID).join("logs")) + .unwrap_or_else(|| std::env::temp_dir().join(APP_ID).join("logs")) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_app_id_constant() { + assert_eq!(APP_ID, "io.hoppscotch.desktop"); + } + + #[test] + fn test_log_file_path() { + let path = log_file_path(); + assert!(path.to_string_lossy().contains("io.hoppscotch.desktop.log")); + } + + #[test] + fn test_manifest_path_portable() { + let path = manifest_path(); + assert!(path.to_string_lossy().ends_with("hopp_manifest.json")); + } + + #[test] + fn test_platform_config_dir_structure() { + let config_dir = platform_config_dir(); + + #[cfg(feature = "portable")] + { + assert!(config_dir + .to_string_lossy() + .contains("hoppscotch-desktop-data")); + } + + #[cfg(not(feature = "portable"))] + { + assert!(config_dir.to_string_lossy().contains(APP_ID)); + } + } + + #[test] + fn test_platform_logs_dir_structure() { + let logs_dir = platform_logs_dir(); + + #[cfg(feature = "portable")] + { + assert!(logs_dir.to_string_lossy().ends_with("logs")); + } + + #[cfg(not(feature = "portable"))] + { + assert!(logs_dir.to_string_lossy().contains(APP_ID)); + } + } + + #[test] + fn test_get_config_dir_command() { + let result = get_config_dir(); + assert!(result.is_ok()); + let path_str = result.unwrap(); + assert!(!path_str.is_empty()); + } + + #[test] + fn test_get_logs_dir_command() { + let result = get_logs_dir(); + assert!(result.is_ok()); + let path_str = result.unwrap(); + assert!(!path_str.is_empty()); + } +} + +#[cfg(test)] +mod portable_tests { + // NOTE: These tests should only run when + // the portable feature flag is enabled + #[cfg(feature = "portable")] + #[test] + fn test_portable_bundle_path() { + let path = bundle_path(); + assert!(path.file_name().unwrap() == "hopp_bundle.zip"); + } + + #[cfg(feature = "portable")] + #[test] + fn test_portable_manifest_path() { + let path = manifest_path(); + assert!(path.file_name().unwrap() == "hopp_manifest.json"); + } + + #[cfg(feature = "portable")] + #[test] + fn test_portable_config_dir_structure() { + let config_dir = platform_config_dir(); + assert!(config_dir + .to_string_lossy() + .contains("hoppscotch-desktop-data")); + } +} + +#[cfg(test)] +mod platform_tests { + use super::*; + + #[cfg(target_os = "macos")] + #[test] + fn test_macos_paths() { + let config_dir = platform_config_dir(); + if !cfg!(feature = "portable") { + assert!(config_dir + .to_string_lossy() + .contains("Library/Application Support")); + } + + let logs_dir = platform_logs_dir(); + if !cfg!(feature = "portable") { + assert!(logs_dir.to_string_lossy().contains("Library/Logs")); + } + } + + #[cfg(target_os = "windows")] + #[test] + fn test_windows_paths() { + let config_dir = platform_config_dir(); + if !cfg!(feature = "portable") { + assert!(config_dir.to_string_lossy().contains(APP_ID)); + } + } + + #[cfg(target_os = "linux")] + #[test] + fn test_linux_paths() { + let config_dir = platform_config_dir(); + if !cfg!(feature = "portable") { + assert!(config_dir.to_string_lossy().contains(APP_ID)); + } + } +} diff --git a/packages/hoppscotch-desktop/src-tauri/src/updater.rs b/packages/hoppscotch-desktop/src-tauri/src/updater.rs index c6d16d6c..ec99054d 100644 --- a/packages/hoppscotch-desktop/src-tauri/src/updater.rs +++ b/packages/hoppscotch-desktop/src-tauri/src/updater.rs @@ -1,36 +1,13 @@ -use tauri_plugin_dialog::DialogExt; +use crate::{dialog, util}; +use native_dialog::MessageType; use tauri_plugin_updater::UpdaterExt; +/// Check for updates using the updater and return whether updates are available +/// This mimics the behavior of `checkForUpdates` in `updater.ts` but uses native dialogs when needed #[tauri::command] -pub async fn check_updates_available(app: tauri::AppHandle) -> Result { - tracing::info!("Checking for updates..."); - let updater = match app.updater() { - Ok(updater) => updater, - Err(e) => { - tracing::error!(error = %e, "Failed to initialize updater"); - return Ok(false); - } - }; +pub async fn check_for_updates(app: tauri::AppHandle) -> Result { + tracing::info!("Checking for portable updates"); - match updater.check().await { - Ok(Some(_update)) => { - tracing::info!("Update available"); - Ok(true) - } - Ok(None) => { - tracing::info!("No updates available"); - Ok(false) - } - Err(e) => { - tracing::error!(error = %e, "Failed to check for updates"); - Err(format!("Failed to check for updates: {}", e)) - } - } -} - -#[tauri::command] -pub async fn install_updates_and_restart(app: tauri::AppHandle) -> Result<(), String> { - tracing::info!("Installing updates..."); let updater = match app.updater() { Ok(updater) => updater, Err(e) => { @@ -44,48 +21,29 @@ pub async fn install_updates_and_restart(app: tauri::AppHandle) -> Result<(), St tracing::info!( current_version = app.package_info().version.to_string(), update_version = update.version.to_string(), - "Installing update" + "Update available" + ); + let download_url = "https://hoppscotch.com/download"; + let message = format!( + "An update (version {}) is available for Hoppscotch Desktop (Portable).\n\nWould you like to download it now?\n\n• Yes = Download now\n• No = Remind me later", + update.version ); - let dialog = app.dialog(); - let should_update = dialog - .message(format!( - "A new version of Hoppscotch (v{}) is available.\n\n{}", - update.version, - update.body.as_ref().unwrap_or(&"".to_string()) - )) - .title("Update Available") - .kind(tauri_plugin_dialog::MessageDialogKind::Info) - .buttons(tauri_plugin_dialog::MessageDialogButtons::YesNo) - .blocking_show(); - - if should_update { - tracing::info!("User agreed to update, starting download..."); - match update.download_and_install(|_, _| {}, || {}).await { - Ok(_) => { - tracing::info!("Update installed successfully, restarting app"); - app.restart(); - Err("Unreachable - app should have restarted".to_string()) - } - Err(e) => { - tracing::error!(error = %e, "Failed to download or install update"); - let _ = app - .dialog() - .message(format!("Failed to install update: {}", e)) - .title("Update Error") - .kind(tauri_plugin_dialog::MessageDialogKind::Error) - .blocking_show(); - Err(format!("Failed to download or install update: {}", e)) - } + if dialog::confirm("Download Update", &message, MessageType::Info) { + if let None = util::open_link(download_url) { + dialog::error(&format!( + "Failed to open download page. Please visit {}", + download_url + )); + return Err(format!("Failed to open download URL")); } - } else { - tracing::info!("User declined the update"); - Ok(()) } + + Ok(true) } Ok(None) => { tracing::info!("No updates available"); - Ok(()) + Ok(false) } Err(e) => { tracing::error!(error = %e, "Failed to check for updates"); diff --git a/packages/hoppscotch-desktop/src-tauri/src/util.rs b/packages/hoppscotch-desktop/src-tauri/src/util.rs new file mode 100644 index 00000000..42abe788 --- /dev/null +++ b/packages/hoppscotch-desktop/src-tauri/src/util.rs @@ -0,0 +1,107 @@ +use std::process::{Command, Stdio}; + +pub fn open_link(link: &str) -> Option<()> { + let null = Stdio::null(); + + #[cfg(target_os = "windows")] + { + Command::new("rundll32") + .args(["url.dll,FileProtocolHandler", link]) + .stdout(null) + .spawn() + .ok() + .map(|_| ()) + } + + #[cfg(target_os = "macos")] + { + Command::new("open") + .arg(link) + .stdout(null) + .spawn() + .ok() + .map(|_| ()) + } + + #[cfg(target_os = "linux")] + { + Command::new("xdg-open") + .arg(link) + .stdout(null) + .spawn() + .ok() + .map(|_| ()) + } + + #[cfg(not(any(target_os = "windows", target_os = "macos", target_os = "linux")))] + { + None + } +} + +#[cfg(test)] +mod tests { + use super::*; + + // NOTE: These tests won't actually open URLs in testing environments + // but these will test the command construction logic + #[test] + fn test_open_link_with_valid_url() { + let test_url = "https://example.com"; + + // The function should not panic and should return `Some(())` or `None` + // depending on whether the command can be spawned + let result = open_link(test_url); + + // This should return `Some(())` if the command exists, + // on unsupported platforms, this should return None + #[cfg(any(target_os = "windows", target_os = "macos", target_os = "linux"))] + { + assert!(result.is_some() || result.is_none()); + } + + #[cfg(not(any(target_os = "windows", target_os = "macos", target_os = "linux")))] + { + assert_eq!(result, None); + } + } + + #[test] + fn test_open_link_with_empty_string() { + let result = open_link(""); + + #[cfg(any(target_os = "windows", target_os = "macos", target_os = "linux"))] + { + assert!(result.is_some() || result.is_none()); + } + + #[cfg(not(any(target_os = "windows", target_os = "macos", target_os = "linux")))] + { + assert_eq!(result, None); + } + } + + #[test] + fn test_open_link_with_special_characters() { + let test_urls = vec![ + "https://example.com/path with spaces", + "https://example.com/path?query=value&other=test", + "https://example.com/path#fragment", + "file:///path/to/local/file.txt", + ]; + + for url in test_urls { + let result = open_link(url); + + #[cfg(any(target_os = "windows", target_os = "macos", target_os = "linux"))] + { + assert!(result.is_some() || result.is_none()); + } + + #[cfg(not(any(target_os = "windows", target_os = "macos", target_os = "linux")))] + { + assert_eq!(result, None); + } + } + } +} diff --git a/packages/hoppscotch-desktop/src-tauri/src/webview/error.rs b/packages/hoppscotch-desktop/src-tauri/src/webview/error.rs new file mode 100644 index 00000000..7bfeff52 --- /dev/null +++ b/packages/hoppscotch-desktop/src-tauri/src/webview/error.rs @@ -0,0 +1,15 @@ +use std::io; + +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum WebViewError { + #[error("Failed to open URL: {0}")] + UrlOpen(#[from] io::Error), + #[error("Failed to download WebView2 installer: {0}")] + Download(String), + #[error("WebView2 installation failed: {0}")] + Installation(String), + #[error("Failed during request: {0}")] + Request(#[from] tauri_plugin_http::reqwest::Error), +} diff --git a/packages/hoppscotch-desktop/src-tauri/src/webview/mod.rs b/packages/hoppscotch-desktop/src-tauri/src/webview/mod.rs new file mode 100644 index 00000000..02381545 --- /dev/null +++ b/packages/hoppscotch-desktop/src-tauri/src/webview/mod.rs @@ -0,0 +1,212 @@ +/// The WebView2 Runtime is a critical dependency for Tauri applications on Windows. +/// We need to check for its presence, see [Source: GitHub Issue #59 - Portable windows build](https://github.com/tauri-apps/tauri-action/issues/59#issuecomment-827142638) +/// +/// > "Tauri requires an installer if you define app resources, external binaries or running on environments that do not have Webview2 runtime installed. So I don't think it's a good idea to have a "portable" option since a Tauri binary itself isn't 100% portable." +/// +/// The approach for checking WebView2 installation is based on Microsoft's official documentation, which states: +/// +/// > ###### Detect if a WebView2 Runtime is already installed +/// > +/// > To verify that a WebView2 Runtime is installed, use one of the following approaches: +/// > +/// > * Approach 1: Inspect the `pv (REG_SZ)` regkey for the WebView2 Runtime at both of the following registry locations. The `HKEY_LOCAL_MACHINE` regkey is used for _per-machine_ install. The `HKEY_CURRENT_USER` regkey is used for _per-user_ install. +/// > +/// > For WebView2 applications, at least one of these regkeys must be present and defined with a version greater than 0.0.0.0. If neither regkey exists, or if only one of these regkeys exists but its value is `null`, an empty string, or 0.0.0.0, this means that the WebView2 Runtime isn't installed on the client. Inspect these regkeys to detect whether the WebView2 Runtime is installed, and to get the version of the WebView2 Runtime. Find `pv (REG_SZ)` at the following two locations. +/// > +/// > The two registry locations to inspect on 64-bit Windows: +/// > +/// > ```text +/// > HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5} +/// > +/// > HKEY_CURRENT_USER\Software\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5} +/// > ``` +/// > +/// > The two registry locations to inspect on 32-bit Windows: +/// > +/// > ```text +/// > HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5} +/// > +/// > HKEY_CURRENT_USER\Software\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5} +/// > ``` +/// > +/// > * Approach 2: Run [GetAvailableCoreWebView2BrowserVersionString](/microsoft-edge/webview2/reference/win32/webview2-idl#getavailablecorewebview2browserversionstring) and evaluate whether the `versionInfo` is `nullptr`. `nullptr` indicates that the WebView2 Runtime isn't installed. This API returns version information for the WebView2 Runtime or for any installed preview channels of Microsoft Edge (Beta, Dev, or Canary). +/// +/// See: https://learn.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution?tabs=dotnetcsharp#detect-if-a-webview2-runtime-is-already-installed +/// +/// Our implementation uses Approach 1, checking both the 32-bit (WOW6432Node) and 64-bit registry locations +/// to make sure we have critical dependency compatibility with different system architectures. +pub mod error; + +use std::{io, ops::Not}; + +use native_dialog::MessageType; + +use crate::{dialog, util}; +use error::WebViewError; + +#[cfg(windows)] +use { + std::io::Cursor, + std::process::Command, + tauri_plugin_http::reqwest, + tempfile::TempDir, + winreg::{ + enums::{HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE}, + RegKey, + }, +}; + +const TAURI_WEBVIEW_REF: &str = "https://v2.tauri.app/references/webview-versions/"; +const WINDOWS_WEBVIEW_REF: &str = + "https://developer.microsoft.com/microsoft-edge/webview2/#download-section"; + +fn is_available() -> bool { + #[cfg(windows)] + { + const KEY_WOW64: &str = r"SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}"; + const KEY: &str = + r"SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}"; + + let hklm = RegKey::predef(HKEY_LOCAL_MACHINE); + let hkcu = RegKey::predef(HKEY_CURRENT_USER); + + [ + hklm.open_subkey(KEY_WOW64), + hkcu.open_subkey(KEY_WOW64), + hklm.open_subkey(KEY), + hkcu.open_subkey(KEY), + ] + .into_iter() + .any(|result| result.is_ok()) + } + + #[cfg(not(windows))] + { + true + } +} + +fn open_install_website() -> Result<(), WebViewError> { + let url = if cfg!(windows) { + WINDOWS_WEBVIEW_REF + } else { + TAURI_WEBVIEW_REF + }; + + util::open_link(url).map(|_| ()).ok_or_else(|| { + WebViewError::UrlOpen(io::Error::new( + io::ErrorKind::Other, + "Failed to open browser to WebView download section", + )) + }) +} + +#[cfg(windows)] +async fn install() -> Result<(), WebViewError> { + const WEBVIEW2_BOOTSTRAPPER_URL: &str = "https://go.microsoft.com/fwlink/p/?LinkId=2124703"; + const DEFAULT_FILENAME: &str = "MicrosoftEdgeWebview2Setup.exe"; + + let client = reqwest::Client::builder() + .user_agent("Hoppscotch Agent") + .gzip(true) + .build()?; + + let response = client.get(WEBVIEW2_BOOTSTRAPPER_URL).send().await?; + + if !response.status().is_success() { + return Err(WebViewError::Download(format!( + "Failed to download WebView2 bootstrapper. Status: {}", + response.status() + ))); + } + + let filename = + get_filename_from_response(&response).unwrap_or_else(|| DEFAULT_FILENAME.to_owned()); + + let tmp_dir = TempDir::with_prefix("WebView-setup-")?; + let installer_path = tmp_dir.path().join(filename); + + let content = response.bytes().await?; + { + let mut file = std::fs::File::create(&installer_path)?; + io::copy(&mut Cursor::new(content), &mut file)?; + } + + let status = Command::new(&installer_path).args(["/install"]).status()?; + + if !status.success() { + return Err(WebViewError::Installation(format!( + "Installer exited with code `{}`.", + status.code().unwrap_or(-1) + ))); + } + + Ok(()) +} + +#[cfg(windows)] +fn get_filename_from_response(response: &reqwest::Response) -> Option { + response + .headers() + .get("content-disposition") + .and_then(|value| value.to_str().ok()) + .and_then(|value| value.split("filename=").last()) + .map(|name| name.trim().replace('\"', "")) + .or_else(|| { + response + .url() + .path_segments() + .and_then(|segments| segments.last()) + .map(|name| name.to_string()) + }) + .filter(|name| !name.is_empty()) +} + +#[cfg(not(windows))] +async fn install() -> Result<(), WebViewError> { + Err(WebViewError::Installation( + "Unable to auto-install WebView. Please refer to https://v2.tauri.app/references/webview-versions/".to_string(), + )) +} + +pub fn init_webview() { + if is_available() { + return; + } + + if dialog::confirm( + "WebView Error", + "WebView is required for this application to work.\n\n\ + Do you want to install it?", + MessageType::Error, + ) + .not() + { + tracing::warn!("Declined to setup WebView."); + + std::process::exit(1); + } + + if let Err(e) = tauri::async_runtime::block_on(install()) { + dialog::error(&format!( + "Failed to install WebView: {}\n\n\ + Please install it manually from webpage that should open when you click 'Ok'.\n\n\ + If that doesn't work, please visit Microsoft Edge Webview2 download section.", + e + )); + + if let Err(e) = open_install_website() { + tracing::warn!("Failed to launch WebView website:\n{}", e); + } + + std::process::exit(1); + } + + if is_available().not() { + dialog::panic( + "Unable to setup WebView:\n\n\ + Please install it manually and relaunch the application.\n\ + https://developer.microsoft.com/microsoft-edge/webview2/#download-section", + ); + } +} diff --git a/packages/hoppscotch-desktop/src/views/Home.vue b/packages/hoppscotch-desktop/src/views/Home.vue index d219d11d..01401a50 100644 --- a/packages/hoppscotch-desktop/src/views/Home.vue +++ b/packages/hoppscotch-desktop/src/views/Home.vue @@ -131,7 +131,7 @@