From 88877ecb55166f87a75ac3a73c93e4b00f191747 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Tue, 11 Mar 2025 20:54:46 +0100 Subject: [PATCH 01/68] Add initial Tauri v2 support --- .gitignore | 4 + package.json | 6 +- src-tauri/Cargo.lock | 4850 +++++++++++++++++++++++++++++++ src-tauri/Cargo.toml | 21 + src-tauri/build.rs | 3 + src-tauri/icons/bf_icon_128.png | Bin 0 -> 4805 bytes src-tauri/src/main.rs | 11 + src-tauri/tauri.conf.json | 35 + vite.config.js | 3 + yarn.lock | 72 + 10 files changed, 5004 insertions(+), 1 deletion(-) create mode 100644 src-tauri/Cargo.lock create mode 100644 src-tauri/Cargo.toml create mode 100644 src-tauri/build.rs create mode 100644 src-tauri/icons/bf_icon_128.png create mode 100644 src-tauri/src/main.rs create mode 100644 src-tauri/tauri.conf.json diff --git a/.gitignore b/.gitignore index 1599b1573d..3bf7b34f11 100644 --- a/.gitignore +++ b/.gitignore @@ -47,3 +47,7 @@ capacitor.config.json # Ignore Gradle build output directory build + +# Ignore Tauri build artifacts +src-tauri/target/ +src-tauri/gen/ diff --git a/package.json b/package.json index 995de18faa..ae6678fb92 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,9 @@ "android:release": "vite build && node capacitor.config.generator.mjs && npx cap build android --release", "format": "prettier --write {src,test}/**/*.{js,vue,css,less}", "storybook": "start-storybook -p 6006", - "prepare": "husky install" + "prepare": "husky install", + "tauri:dev": "tauri dev", + "tauri:build": "tauri build" }, "window": { "icon": "images/bf_icon_128.png", @@ -44,6 +46,8 @@ "@capacitor/android": "^7.0.1", "@capacitor/core": "^7.0.1", "@fortawesome/fontawesome-free": "^6.5.2", + "@tauri-apps/api": "^2.3.0", + "@tauri-apps/cli": "^2.3.1", "@vitejs/plugin-vue": "^6.0.1", "crypto-es": "^2.1.0", "d3": "^7.9.0", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock new file mode 100644 index 0000000000..98cbad01e6 --- /dev/null +++ b/src-tauri/Cargo.lock @@ -0,0 +1,4850 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "backtrace" +version = "0.3.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "betaflight-configurator" +version = "11.0.0" +dependencies = [ + "serde", + "serde_json", + "tauri", + "tauri-build", + "tauri-plugin-shell", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +dependencies = [ + "serde", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2 0.5.2", +] + +[[package]] +name = "block2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d59b4c170e16f0405a2e95aff44432a0d41aa97675f3d52623effe95792a037" +dependencies = [ + "objc2 0.6.0", +] + +[[package]] +name = "brotli" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "bytemuck" +version = "1.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +dependencies = [ + "serde", +] + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.9.0", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.12", +] + +[[package]] +name = "cargo_toml" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fbd1fe9db3ebf71b89060adaf7b0504c2d6a425cf061313099547e382c2e472" +dependencies = [ + "serde", + "toml", +] + +[[package]] +name = "cc" +version = "1.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" +dependencies = [ + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" +dependencies = [ + "bitflags 2.9.0", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.9.0", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa 0.4.8", + "matches", + "phf 0.8.0", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.100", +] + +[[package]] +name = "ctor" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" +dependencies = [ + "quote", + "syn 2.0.100", +] + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.100", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derive_more" +version = "0.99.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.100", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.59.0", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "dlopen2" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "dpi" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" +dependencies = [ + "serde", +] + +[[package]] +name = "dtoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" + +[[package]] +name = "embed-resource" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fbc6e0d8e0c03a655b53ca813f0463d2c956bc4db8138dbc89f120b066551e3" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" +dependencies = [ + "serde", + "typeid", +] + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "flate2" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.9.0", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.0", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html5ever" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "http" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a761d192fbf18bdef69f5ceedd0d1333afcbda0ee23840373b8317570d23c65" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.15", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "itoa 1.0.15", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +dependencies = [ + "futures-util", + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-util" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core 0.52.0", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", + "serde", +] + +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.9.0", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "kuchikiki" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8" +dependencies = [ + "cssparser", + "html5ever", + "indexmap 1.9.3", + "matches", + "selectors", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading", + "once_cell", +] + +[[package]] +name = "libc" +version = "0.2.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.9.0", + "libc", +] + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "markup5ever" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" +dependencies = [ + "log", + "phf 0.10.1", + "phf_codegen 0.10.0", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "muda" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4de14a9b5d569ca68d7c891d613b390cf5ab4f851c77aaa2f9e435555d3d9492" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2 0.6.0", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation 0.3.0", + "once_cell", + "png", + "serde", + "thiserror 2.0.12", + "windows-sys 0.59.0", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.9.0", + "jni-sys", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate 3.3.0", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3531f65190d9cff863b77a99857e74c314dd16bf56c538c4b57c7cbc3f3a6e59" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5906f93257178e2f7ae069efb89fbd6ee94f0592740b5f8a1512ca498814d0fb" +dependencies = [ + "bitflags 2.9.0", + "block2 0.6.0", + "libc", + "objc2 0.6.0", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-foundation 0.3.0", + "objc2-quartz-core 0.3.0", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c1948a9be5f469deadbd6bcb86ad7ff9e47b4f632380139722f7d9840c0d42c" +dependencies = [ + "bitflags 2.9.0", + "objc2 0.6.0", + "objc2-foundation 0.3.0", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f860f8e841f6d32f754836f51e6bc7777cd7e7053cf18528233f6811d3eceb4" +dependencies = [ + "bitflags 2.9.0", + "objc2 0.6.0", + "objc2-foundation 0.3.0", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daeaf60f25471d26948a1c2f840e3f7d86f4109e3af4e8e4b5cd70c39690d925" +dependencies = [ + "bitflags 2.9.0", + "objc2 0.6.0", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dca602628b65356b6513290a21a6405b4d4027b8b250f0b98dddbb28b7de02" +dependencies = [ + "bitflags 2.9.0", + "objc2 0.6.0", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ffa6bea72bf42c78b0b34e89c0bafac877d5f80bf91e159a5d96ea7f693ca56" +dependencies = [ + "objc2 0.6.0", + "objc2-foundation 0.3.0", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +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" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.9.0", + "block2 0.5.1", + "libc", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a21c6c9014b82c39515db5b396f91645182611c97d24637cf56ac01e5f8d998" +dependencies = [ + "bitflags 2.9.0", + "block2 0.6.0", + "libc", + "objc2 0.6.0", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "161a8b87e32610086e1a7a9e9ec39f84459db7b3a0881c1f16ca5a2605581c19" +dependencies = [ + "bitflags 2.9.0", + "objc2 0.6.0", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.9.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.9.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fb3794501bb1bee12f08dcad8c61f2a5875791ad1c6f47faa71a0f033f20071" +dependencies = [ + "bitflags 2.9.0", + "objc2 0.6.0", + "objc2-foundation 0.3.0", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777a571be14a42a3990d4ebedaeb8b54cd17377ec21b92e8200ac03797b3bee1" +dependencies = [ + "bitflags 2.9.0", + "objc2 0.6.0", + "objc2-core-foundation", + "objc2-foundation 0.3.0", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b717127e4014b0f9f3e8bba3d3f2acec81f1bde01f656823036e823ed2c94dce" +dependencies = [ + "bitflags 2.9.0", + "block2 0.6.0", + "objc2 0.6.0", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation 0.3.0", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde51589ab56b20a6f686b2c68f7a0bd6add753d697abf720d63f8db3ab7b1ad" + +[[package]] +name = "open" +version = "5.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2483562e62ea94312f3576a7aca397306df7990b8d89033e18766744377ef95" +dependencies = [ + "dunce", + "is-wsl", + "libc", + "pathdiff", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "os_pipe" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_macros 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_shared 0.10.0", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher 0.3.11", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher 1.0.1", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plist" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" +dependencies = [ + "base64 0.22.1", + "indexmap 2.8.0", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +dependencies = [ + "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.24", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.12", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" +dependencies = [ + "bytes", + "getrandom 0.2.15", + "rand 0.8.5", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.12", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e46f3055866785f6b92bc6164b76be02ca8f2eb4b002c0354b28cf4c119e5944" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "quote" +version = "1.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "redox_syscall" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "redox_users" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +dependencies = [ + "getrandom 0.2.15", + "libredox", + "thiserror 2.0.12", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "reqwest" +version = "0.12.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pemfile", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-util", + "tower", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots", + "windows-registry", +] + +[[package]] +name = "ring" +version = "0.17.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ac5d832aa16abd7d1def883a8545280c20a60f523a370aa3a9617c2b8550ee" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.15", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustls" +version = "0.23.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" +dependencies = [ + "web-time", +] + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +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" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.100", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "selectors" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +dependencies = [ + "bitflags 1.3.2", + "cssparser", + "derive_more", + "fxhash", + "log", + "matches", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc", + "smallvec", + "thin-slice", +] + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-untagged" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e" +dependencies = [ + "erased-serde", + "serde", + "typeid", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa 1.0.15", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa 1.0.15", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.8.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "servo_arc" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shared_child" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09fa9338aed9a1df411814a5b2252f7cd206c55ae9bf2fa763f8de84603aa60c" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "siphasher" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "softbuffer" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08" +dependencies = [ + "bytemuck", + "cfg_aliases", + "core-graphics", + "foreign-types", + "js-sys", + "log", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-quartz-core 0.2.2", + "raw-window-handle", + "redox_syscall", + "wasm-bindgen", + "web-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "string_cache" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "938d512196766101d333398efde81bc1f37b00cb42c2f8350e5df639f040bbbe" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.11.3", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.32.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63c8b1020610b9138dd7b1e06cf259ae91aa05c30f3bd0d6b42a03997b92dec1" +dependencies = [ + "bitflags 2.9.0", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc2 0.6.0", + "objc2-app-kit", + "objc2-foundation 0.3.0", + "once_cell", + "parking_lot", + "raw-window-handle", + "scopeguard", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.60.1", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be747b26bf28674977fac47bdf6963fd9c7578271c3fbeb25d8686de6596f35" +dependencies = [ + "anyhow", + "bytes", + "dirs", + "dunce", + "embed_plist", + "futures-util", + "getrandom 0.2.15", + "glob", + "gtk", + "heck 0.5.0", + "http", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2 0.6.0", + "objc2-app-kit", + "objc2-foundation 0.3.0", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.12", + "tokio", + "tray-icon", + "url", + "urlpattern", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51a2e96f3c0baa0581656bb58e6fdd0f7c9c31eaf6721a0c08689d938fe85f2d" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "toml", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e357ec3daf8faad1029bc7109e7f5b308ceb63b6073d110d7388923a4cce5e55" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.100", + "tauri-utils", + "thiserror 2.0.12", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "447ee4dd94690d77f1422f2b57e783c654ba75c535ad6f6e727887330804fff2" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.100", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad3021d8e60ec7672f51ecb67c5e1a514a4d7a9a5ffc9d85090739378047502" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars", + "serde", + "serde_json", + "tauri-utils", + "toml", + "walkdir", +] + +[[package]] +name = "tauri-plugin-shell" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb2c50a63e60fb8925956cc5b7569f4b750ac197a4d39f13b8dd46ea8e2bad79" +dependencies = [ + "encoding_rs", + "log", + "open", + "os_pipe", + "regex", + "schemars", + "serde", + "serde_json", + "shared_child", + "tauri", + "tauri-plugin", + "thiserror 2.0.12", + "tokio", +] + +[[package]] +name = "tauri-runtime" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e758a405ab39e25f4d1235c5f06fe563f44b01ee18bbe38ddec5356d4f581908" +dependencies = [ + "dpi", + "gtk", + "http", + "jni", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.12", + "url", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2beb90decade4c71e8b09c9e4a9245837a8a97693f945b77e32baf13f51fec" +dependencies = [ + "gtk", + "http", + "jni", + "log", + "objc2 0.6.0", + "objc2-app-kit", + "objc2-foundation 0.3.0", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "107a959dbd5ff53d89a98f6f2e3e987c611334141a43630caae1d80e79446dd6" +dependencies = [ + "brotli", + "cargo_metadata", + "ctor", + "dunce", + "glob", + "html5ever", + "http", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.3", + "proc-macro2", + "quote", + "regex", + "schemars", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.12", + "toml", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56eaa45f707bedf34d19312c26d350bc0f3c59a47e58e8adbeecdc850d2c13a0" +dependencies = [ + "embed-resource", + "toml", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "thin-slice" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "time" +version = "0.3.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad298b01a40a23aac4580b67e3dbedb7cc8402f3592d7f49469de2ea4aecdd8" +dependencies = [ + "deranged", + "itoa 1.0.15", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "765c97a5b985b7c11d7bc27fa927dc4fe6af3a6dfb021d28deb60d3bf51e76ef" + +[[package]] +name = "time-macros" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8093bc3e81c3bc5f7879de09619d06c9a5a5e45ca44dfeeb7225bae38005c5c" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9975ea0f48b5aa3972bf2d888c238182458437cc2a19374b81b25cdf1023fb3a" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.24", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.8.0", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +dependencies = [ + "indexmap 2.8.0", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +dependencies = [ + "indexmap 2.8.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.7.3", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tray-icon" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d433764348e7084bad2c5ea22c96c71b61b17afe3a11645710f533bd72b6a2b5" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2 0.6.0", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.0", + "once_cell", + "png", + "serde", + "thiserror 2.0.12", + "windows-sys 0.59.0", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587" +dependencies = [ + "getrandom 0.3.1", + "serde", +] + +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +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.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.100", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webkit2gtk" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + +[[package]] +name = "webpki-roots" +version = "0.26.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "webview2-com" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0d606f600e5272b514dbb66539dd068211cc20155be8d3958201b4b5bd79ed3" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core 0.60.1", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "webview2-com-sys" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb27fccd3c27f68e9a6af1bcf48c2d82534b8675b83608a4d81446d095a17ac" +dependencies = [ + "thiserror 2.0.12", + "windows", + "windows-core 0.60.1", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "window-vibrancy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2 0.6.0", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation 0.3.0", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddf874e74c7a99773e62b1c671427abf01a425e77c3d3fb9fb1e4883ea934529" +dependencies = [ + "windows-collections", + "windows-core 0.60.1", + "windows-future", + "windows-link", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5467f79cc1ba3f52ebb2ed41dbb459b8e7db636cc3429458d9a852e15bc24dec" +dependencies = [ + "windows-core 0.60.1", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.60.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca21a92a9cae9bf4ccae5cf8368dce0837100ddf6e6d57936749e85f152f6247" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result 0.3.1", + "windows-strings 0.3.1", +] + +[[package]] +name = "windows-future" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a787db4595e7eb80239b74ce8babfb1363d8e343ab072f2ffe901400c03349f0" +dependencies = [ + "windows-core 0.60.1", + "windows-link", +] + +[[package]] +name = "windows-implement" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83577b051e2f49a058c308f17f273b570a6a758386fc291b5f6a934dd84e48c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "windows-interface" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb26fd936d991781ea39e87c3a27285081e3c0da5ca0fcbc02d368cc6f52ff01" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "windows-link" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" + +[[package]] +name = "windows-numerics" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "005dea54e2f6499f2cee279b8f703b3cf3b5734a2d8d21867c8f44003182eeed" +dependencies = [ + "windows-core 0.60.1", + "windows-link", +] + +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result 0.2.0", + "windows-strings 0.1.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06374efe858fab7e4f881500e6e86ec8bc28f9462c47e5a9941a0142ad86b189" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result 0.2.0", + "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-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-version" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bfbcc4996dd183ff1376a20ade1242da0d2dcaff83cc76710a588d24fd4c5db" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[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_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "wry" +version = "0.50.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "804a7d1613bd699beccaa60f3b3c679acee21cebba1945a693f5eab95c08d1fa" +dependencies = [ + "base64 0.22.1", + "block2 0.6.0", + "cookie", + "crossbeam-channel", + "dpi", + "dunce", + "gdkx11", + "gtk", + "html5ever", + "http", + "javascriptcore-rs", + "jni", + "kuchikiki", + "libc", + "ndk", + "objc2 0.6.0", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation 0.3.0", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.12", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.60.1", + "windows-version", + "x11-dl", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml new file mode 100644 index 0000000000..58ad2e5baf --- /dev/null +++ b/src-tauri/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "betaflight-configurator" +version = "11.0.0" +description = "Betaflight Configurator" +authors = ["Betaflight Team"] +license = "GPL-3.0" +repository = "https://github.com/betaflight/betaflight-configurator" +edition = "2021" + +[build-dependencies] +tauri-build = { version = "2.0.6", features = [] } + +[dependencies] +tauri = { version = "2.0.6", features = [] } +tauri-plugin-shell = "2.0.0" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" + +[features] +default = ["custom-protocol"] +custom-protocol = ["tauri/custom-protocol"] diff --git a/src-tauri/build.rs b/src-tauri/build.rs new file mode 100644 index 0000000000..795b9b7c83 --- /dev/null +++ b/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/src-tauri/icons/bf_icon_128.png b/src-tauri/icons/bf_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..1616939acf3c8b2fd24192970100333b0e8f4a92 GIT binary patch literal 4805 zcma)Abx_n@)c&z7v64$mF1VC{bl1`>Euy5vBHg`|G>C+-AYDpGOH0Foz7hhG(&bAm zt&$?};rq?^|2NN^^URz%bLY&x_spE<#2e^oklkUt0{{RSQd8CNmc#!VG2yN6SFjnr zC77+Ip)LRfao)zG0N~>0mT>^!Cjy;fgr47j3PC^qL`z7OfgpyMY7T(rep$|BZg2)ZqlktNFy4c^I?vI*`3OY7 za$TuVCJ8WEW&9WpV$cu=56G;!X2vY@{meXtxmojLlA0iyEs3*@<;#PdMS9Fx?BQik zz~Pr{QPHhGqCWNqU2muX-?yHY2KNj=e@zUFs`p$|smocF1P2g@zwHOEPROw@xfIQ= zDl-5(u+>8q8F07z&v(wCqN7(+p5!rXrc^x8-VgD@Q;x~f)aSfVYXb3f729SiyyZ9Q z-j09N;{mbx0N2IG9Dq0`DvB!n|AitXkEm$cSrz^91b3+h#nrxAT-V+MZGgrIWL#m? zz1U^gUXa4kIP>!qW4vI=*=4rlCXUA=Bf*2mgSV#=ZcBD8)GU(BIA;o}JFeFZ{~&{n zap-#E+8WQeFh`ss&Vzsb(=Z?wd=pwM`X@vMAZ5u@Pdd;MMlAIi!~*=+Cpmnsl`Met z+}){jmI&bP-J1ZK>jvw?7#u1vP#SkM{n(flLMbK6A1HXdi^Sy zD1l8|R>-73EAg##D*pOLO948>OI6f7ThB3jd-k&I0r}+T&ylPr22G^?+`V7>jLr{& z=&L4gM%wIu3>9=A^}c}bP-?(|^)049HKPhW{Y*P_(S4c5?LRe-u5$C&9J>^0DD+B` zy~IF?{Nlpo_AE(fF@a8X9=fo_E^HyRyKNJ+kP(Y;Z^@P!ct{+M_Ud>wJt%e0Wbh$| z)ZzIiiQ@Ik9{$CkHd+2)eh`256!I()z~OLjV}zb&ad)z*sR!Dt`kdiK2G;YzVRHnHJscSV=QngPZshUubn@F19gb2R9=Sw{g@nwH#1b2y1@_IRLcZomJe=)w z2M@rCZ=%xVYsmlXSx}&_5TbZTAuw(}-KJ{JNm7?e<+a1ii->g!_;ac5aSE+i_@k}n z01#|bfmtAsFx*5jtjP7EGtUU^Z&x%j^P}V2Q|rqH7!^<1L+%y_5Nugt!W;vjIbIY$ zMSia1pw3%FG4WjQ8%ml;OD4vPmy0f>0QQY@n+3Ym*9vkEGPcCl9BV`27Dk1$p&MCf z^p!Om6Gtezl3Pwjx?PQMwdLvTwGy4E4u3)%^izDNuW+FF$&2Z6%ug+u4PTOtXOQ0e zP67`Oem2PL?)iIUJ#n(0`5D%^ekTm(75OBzku5RymEK7cI|x&Z@@3whcBi8rTF)wK z?&gZ#v&8s)3lkjY0`ssHSj!VD-(H~Igg~~F(AFDA2F&}V^1C>D6Jg18Q$lnEhbdRV z${tCn3dUD*rr$QnGe2c-$Wp(&fDQ>-64L^j9T&fj?UV#)S`=k2=T#fo`>xMLdRAZo z5lLCKfZ~xHhW;-Wts_fq9F$swxjcC3;l+On-?y8vG+76g)Uxn$>Gj%e5RK|Ywd%HD zs^!>5Pf@k=7`DcllN^YlIf07rUUbm|I9Xb24epXq~pzpEBL z5eWBBSN<2m2C$~CEbIKQrNg>4FCxy8&l4(E@|yZpw@739ckSymOr`ucM+{e!THKgQoSM#g;MAWMiu$3505 zLN|);S$(Itkmkx2(Pkxcqs5!`pB}yAqX&Z7W3FV*gb(eh1a?brfJZa#Uu(JmJeQnFW^0cd^1EcKs-E>AQvc z{5f~E?9)^kENRA?b`ugtJmlRhXuxiEK6Lw$Kt%eMz|0v%N-0k@0!kY^)q3)j)8Z?n_mB5ioE7W(nDIvNDm9C%v!1WG#o6JUa>3 z!}=qkNb-)tV|usABAv9?;PL=xwWeRtaCW?G$mx5WgKcXX=!e?KQc*d7|$$C z>hroQdDkR7z@jU}dE1bM0%B|Rdl#s8@Bu!RaT7Ou0*gK^+G^dZeE{X@tXm*o2t5u~sm-W3X zyHr4x0k6)Up@{OtZ<`vP>Ps0Fs}@n`@LG}C<%r!}QNJ~?Trvbbk;Fbt(Sz|H_1XP{ zc01n}48rY%>?TKoOY}#{B77SM%U1X{qdnInC_5I~mZ-wjkT!B&_KK~c6;)63uvcaf z9RyV-Yp&M-M0L(r&}hj@G1z6Z=G zrL;mw659?wuvpWFz+%OeUp(ZjKN|Q*T%IpZSx`yd@BnXjiwHY0hre1+)NeC!HSTHk zkl928qk2Lr@WMkTnE2mPTWNo|GeH4$boP04oD)|Mq~6e)ROO$n5iCaqUm*rucg^VehyRN_w3lbjJ@ma)lRv?=`d9Eb(xB&M(*{B$;tH)HyHA zS=)*#i)+3#wD=_%>E4@Ms&MN++vR17E(tCIitmGV5V@~(qs@n3`$WpRuJGdJ9PKE) zDw{-Dp}pNHEo8r%dmURX?JBio#gZ?1n1bM3Ki`Q}1pnFC^g7&l{(2%>rVZB@(&i7@ zg}Q86i!6otw{%qEu1ES0g#0X`pM`yzFD+fsI;CxlG7G+~u+iEVDYh6g`ji%LnOkXX zJ)0eFpuK%`RR)HY=dSdqX$%*3&$6%F7tZoN11*$CbplkJETAhf;xLbA(U)v6v?rXuJ|E0>RS@*z?oYy%kUqV?Bwju zsrf`w-9AL|e5aB`hnafWIaE(0{I$>T{+i5=KBBQR$469ks%ZCoNg8@p7x%OChijgl zSdwnHAgyy!_H@=$PZ>~NSQ&-wz{hBG)~{8dwQdssb{yZYvO1SK{YNQawtI>~L2*Sl zK%{eemU@T&cYjHP&_F!{+D%74f%At7oIeLjsVRC7uc zEO;wAyv0JEck@+O-AQ>Z{0`&iA7A)ZbPpM;NV%RrH$yaoX?c!r(3lK}U(#fT7FWsV zB?E`7K2akHSE|3%X*GHexI~N#zKMt9C*9- z*L=ZJ&7Y`i_XFZ^wD@m=w1ix<4k@@LgGGw9Yl^>KBshR^df_$NIq}jwOTagZR>^$c z<7m=G?1R%3PK2wgDASLeV8LjiS6vRnyc^mZ5I>)d(jhIJ$|{dbQksxd-p^iyiIDD1 z+Q(mGXdyRdNe|FQwuapJIfv)}A#M^1jGMf>f~>xlKS+5E?N8U&66-TIw%DTscWbPtL)D;e zC=xXgLz220r=dvJgUol23+F>hz1uPzrwcvS%B$HYLoF;C3j!$!_%bekSCTAt|6BPZ zq3A(f_k1BZOno}^*@l_3iz%p1iv=orU*%a3%|FoY<{A1gyuuQ8VWCDB;y=Efo}o_n zc33$BB8yK7QWSYANA_2nz=$t}i~|fk7i24=o`J?5CWr~$c*1d!Nj_yGX<9!%D6p&0 zHH{xjM&9Ef;pq&5ab=Q4_gMPcb>lB~O)yP7D(1BN{+;Y-yyD|f#BsZQxF3wA%d6$GHD_$@f0m+td17&zxB0x?p-KvS2J}pu{}<5tfG3v z?h#fz^i7Bf&*1mn1+(4a?LUeIICWH_W;wHTisF3yK~-=tw$BMYYg^|OXJnN=vGH&E zUbKN4;GpzG9e(>)V_xN|U(}G)dfMj_O+CKEVodQGgz*ysUY*ntW)_b$(&mk) z#s6h!Qo=+;sG@t7y>Znj_jV!O%Fa3q?TzN`R1CCi@I*=5ytTow$84|WQ!MJlkqd~i zjkw(bAPN8|6e?Hev?%u^+u#YmJ`Z=&Xb`7t{*g(YZXoBN!W1q^}e|dRQ?e{lm1aam>AI-V8<@bF{v)##55Vs^c-L zPRx_c`z*|Zb|IAzt=vDeNLoCeJc=pebYO~jH1P)S>!K~~U}D4P+g%fYRMS(fRkn`& EA7{?gw*UYD literal 0 HcmV?d00001 diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs new file mode 100644 index 0000000000..c5f7db999d --- /dev/null +++ b/src-tauri/src/main.rs @@ -0,0 +1,11 @@ +#![cfg_attr( + all(not(debug_assertions), target_os = "windows"), + windows_subsystem = "windows" +)] + +fn main() { + tauri::Builder::default() + .plugin(tauri_plugin_shell::init()) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json new file mode 100644 index 0000000000..15353aff74 --- /dev/null +++ b/src-tauri/tauri.conf.json @@ -0,0 +1,35 @@ +{ + "productName": "Betaflight Configurator", + "version": "11.0.0", + "identifier": "com.betaflight.configurator", + "build": { + "beforeDevCommand": "yarn dev", + "beforeBuildCommand": "yarn build", + "devUrl": "http://localhost:8000", + "frontendDist": "../dist" + }, + "app": { + "security": { + "csp": null + }, + "windows": [ + { + "title": "Betaflight Configurator", + "width": 1024, + "height": 550, + "resizable": true, + "fullscreen": false + } + ] + }, + "bundle": { + "active": true, + "targets": ["deb", "appimage"], + "icon": ["icons/bf_icon_128.png"] + }, + "plugins": { + "shell": { + "open": true + } + } +} diff --git a/vite.config.js b/vite.config.js index 1d973f1ca8..1cd3d57ed9 100644 --- a/vite.config.js +++ b/vite.config.js @@ -56,6 +56,8 @@ export default defineConfig({ __APP_REVISION__: JSON.stringify(commitHash), }, build: { + outDir: "dist", + emptyOutDir: true, rollupOptions: { input: { main: resolve(__dirname, "src/index.html"), @@ -115,6 +117,7 @@ export default defineConfig({ alias: { "/src": path.resolve(process.cwd(), "src"), vue: path.resolve(__dirname, "node_modules/vue/dist/vue.esm-bundler.js"), + "@": resolve(__dirname, "src"), }, }, server: { diff --git a/yarn.lock b/yarn.lock index ed71ba4025..f509f18ee7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2196,6 +2196,78 @@ integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== "@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.6": +"@tauri-apps/api@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-2.3.0.tgz#8ced2a5e5f1d30d585a22b11dff2cbdfa3f9eab2" + integrity sha512-33Z+0lX2wgZbx1SPFfqvzI6su63hCBkbzv+5NexeYjIx7WA9htdOKoRR7Dh3dJyltqS5/J8vQFyybiRoaL0hlA== + +"@tauri-apps/cli-darwin-arm64@2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.3.1.tgz#e76c01fdd484a6282a1eb285c2eacf150e8166c9" + integrity sha512-TOhSdsXYt+f+asRU+Dl+Wufglj/7+CX9h8RO4hl5k7D6lR4L8yTtdhpS7btaclOMmjYC4piNfJE70GoxhOoYWw== + +"@tauri-apps/cli-darwin-x64@2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.3.1.tgz#a8dda7fb9abaa6ea1eeeaf6c7b59562f7f36686a" + integrity sha512-LDwGg3AuBQ3aCeMAFaFwt0MSGOVFoXuXEe0z4QxQ7jZE5tdAOhKABaq4i569V5lShCgQZ6nLD/tmA5+GipvHnA== + +"@tauri-apps/cli-linux-arm-gnueabihf@2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.3.1.tgz#805753a2fb6662c11a601ce3f56bb141b453bd90" + integrity sha512-hu3HpbbtJBvHXw5i54QHwLxOUoXWqhf7CL2YYSPOrWEEQo10NKddulP61L5gfr5z+bSSaitfLwqgTidgnaNJCA== + +"@tauri-apps/cli-linux-arm64-gnu@2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.3.1.tgz#497e81aebee7a0f5d211c98a93a197779a87bf1f" + integrity sha512-mEGgwkiGSKYXWHhGodo7zU9PCd2I/d6KkR+Wp1nzK+DxsCrEK6yJ5XxYLSQSDcKkM4dCxpVEPUiVMbDhmn08jg== + +"@tauri-apps/cli-linux-arm64-musl@2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.1.tgz#c78e351deb8ae5c4ea6d69ca14a68cd3fe9e0560" + integrity sha512-tqQkafikGfnc7ISnGjSYkbpnzJKEyO8XSa0YOXTAL3J8R5Pss5ZIZY7G8kq1mwQSR/dPVR1ZLTVXgZGuysjP8w== + +"@tauri-apps/cli-linux-x64-gnu@2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.3.1.tgz#351894786928fa4dfef59693b9f7203c07ccab7c" + integrity sha512-I3puDJ2wGEauXlXbzIHn2etz78TaWs1cpN6zre02maHr6ZR7nf7euTCOGPhhfoMG0opA5mT/eLuYpVw648/VAA== + +"@tauri-apps/cli-linux-x64-musl@2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.1.tgz#cee486acacaada50eff6b37c31449f4595e1c9e9" + integrity sha512-rbWiCOBuQN7tPySkUyBs914uUikE3mEUOqV/IFospvKESw4UC3G1DL5+ybfXH7Orb8/in3JpJuVzYQjo+OSbBA== + +"@tauri-apps/cli-win32-arm64-msvc@2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.3.1.tgz#d5a5b865fede9b8d13338da38a3cc5fe9e3cfb53" + integrity sha512-PdTmUzSeTHjJuBpCV7L+V29fPhPtToU+NZU46slHKSA1aT38MiFDXBZ/6P5Zudrt9QPMfIubqnJKbK8Ivvv7Ww== + +"@tauri-apps/cli-win32-ia32-msvc@2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.3.1.tgz#5d9fa6d3ffd705d5b8e435082591efbd32f7bad5" + integrity sha512-K/Xa97kspWT4UWj3t26lL2D3QsopTAxS7kWi5kObdqtAGn3qD52qBi24FH38TdvHYz4QlnLIb30TukviCgh4gw== + +"@tauri-apps/cli-win32-x64-msvc@2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.3.1.tgz#996ba5720b1b552014425570d95b3b905f89ff59" + integrity sha512-RgwzXbP8gAno3kQEsybMtgLp6D1Z1Nec2cftryYbPTJmoMJs6e4qgtxuTSbUz5SKnHe8rGgMiFSvEGoHvbG72Q== + +"@tauri-apps/cli@^2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-2.3.1.tgz#e049127bb083ad158afb34fc3c41d1f0400ff42f" + integrity sha512-xewcw/ZsCqgilTy2h7+pp2Baxoy7zLR2wXOV7SZLzkb6SshHVbm1BFAjn8iFATURRW85KLzl6wSGJ2dQHjVHqw== + optionalDependencies: + "@tauri-apps/cli-darwin-arm64" "2.3.1" + "@tauri-apps/cli-darwin-x64" "2.3.1" + "@tauri-apps/cli-linux-arm-gnueabihf" "2.3.1" + "@tauri-apps/cli-linux-arm64-gnu" "2.3.1" + "@tauri-apps/cli-linux-arm64-musl" "2.3.1" + "@tauri-apps/cli-linux-x64-gnu" "2.3.1" + "@tauri-apps/cli-linux-x64-musl" "2.3.1" + "@tauri-apps/cli-win32-arm64-msvc" "2.3.1" + "@tauri-apps/cli-win32-ia32-msvc" "2.3.1" + "@tauri-apps/cli-win32-x64-msvc" "2.3.1" + +"@types/estree@*", "@types/estree@1.0.6", "@types/estree@^1.0.0", "@types/estree@^1.0.6": version "1.0.6" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== From 48c2b5a296e796f93310d49afd1d5152b869eeb3 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Wed, 12 Mar 2025 19:38:25 +0100 Subject: [PATCH 02/68] Add native tauri check --- src-tauri/Cargo.lock | 4 +- src-tauri/Cargo.toml | 6 +- src-tauri/tauri.conf.json | 8 +- src/js/utils/checkBrowserCompatibility.js | 6 +- yarn.lock | 140 ++++++++++++---------- 5 files changed, 89 insertions(+), 75 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 98cbad01e6..7e873f2bcb 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -119,8 +119,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] -name = "betaflight-configurator" -version = "11.0.0" +name = "betaflight-app" +version = "2025.12.0" dependencies = [ "serde", "serde_json", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 58ad2e5baf..f4e9deb879 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,7 +1,7 @@ [package] -name = "betaflight-configurator" -version = "11.0.0" -description = "Betaflight Configurator" +name = "betaflight-app" +version = "2025.12.0" +description = "Betaflight App" authors = ["Betaflight Team"] license = "GPL-3.0" repository = "https://github.com/betaflight/betaflight-configurator" diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 15353aff74..3e5f40713b 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { - "productName": "Betaflight Configurator", - "version": "11.0.0", - "identifier": "com.betaflight.configurator", + "productName": "Betaflight App", + "version": "2025.12.0", + "identifier": "com.betaflight.app", "build": { "beforeDevCommand": "yarn dev", "beforeBuildCommand": "yarn build", @@ -14,7 +14,7 @@ }, "windows": [ { - "title": "Betaflight Configurator", + "title": "Betaflight App", "width": 1024, "height": 550, "resizable": true, diff --git a/src/js/utils/checkBrowserCompatibility.js b/src/js/utils/checkBrowserCompatibility.js index da3e0fdc20..b3c6f3c6bd 100644 --- a/src/js/utils/checkBrowserCompatibility.js +++ b/src/js/utils/checkBrowserCompatibility.js @@ -60,13 +60,17 @@ export function isCapacitorWeb() { return false; } +export function isTauri() { + return "__TAURI_INTERNALS__" in window; +} + export function checkBrowserCompatibility() { const isWebSerial = checkWebSerialSupport(); const isWebBluetooth = checkWebBluetoothSupport(); const isWebUSB = checkWebUSBSupport(); const isChromium = isChromiumBrowser(); - const isNative = Capacitor.isNativePlatform(); + const isNative = Capacitor.isNativePlatform() || isTauri(); // Check if running in a test environment const isTestEnvironment = diff --git a/yarn.lock b/yarn.lock index f509f18ee7..9660071c9b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2200,72 +2200,82 @@ version "2.3.0" resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-2.3.0.tgz#8ced2a5e5f1d30d585a22b11dff2cbdfa3f9eab2" integrity sha512-33Z+0lX2wgZbx1SPFfqvzI6su63hCBkbzv+5NexeYjIx7WA9htdOKoRR7Dh3dJyltqS5/J8vQFyybiRoaL0hlA== - -"@tauri-apps/cli-darwin-arm64@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.3.1.tgz#e76c01fdd484a6282a1eb285c2eacf150e8166c9" - integrity sha512-TOhSdsXYt+f+asRU+Dl+Wufglj/7+CX9h8RO4hl5k7D6lR4L8yTtdhpS7btaclOMmjYC4piNfJE70GoxhOoYWw== - -"@tauri-apps/cli-darwin-x64@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.3.1.tgz#a8dda7fb9abaa6ea1eeeaf6c7b59562f7f36686a" - integrity sha512-LDwGg3AuBQ3aCeMAFaFwt0MSGOVFoXuXEe0z4QxQ7jZE5tdAOhKABaq4i569V5lShCgQZ6nLD/tmA5+GipvHnA== - -"@tauri-apps/cli-linux-arm-gnueabihf@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.3.1.tgz#805753a2fb6662c11a601ce3f56bb141b453bd90" - integrity sha512-hu3HpbbtJBvHXw5i54QHwLxOUoXWqhf7CL2YYSPOrWEEQo10NKddulP61L5gfr5z+bSSaitfLwqgTidgnaNJCA== - -"@tauri-apps/cli-linux-arm64-gnu@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.3.1.tgz#497e81aebee7a0f5d211c98a93a197779a87bf1f" - integrity sha512-mEGgwkiGSKYXWHhGodo7zU9PCd2I/d6KkR+Wp1nzK+DxsCrEK6yJ5XxYLSQSDcKkM4dCxpVEPUiVMbDhmn08jg== - -"@tauri-apps/cli-linux-arm64-musl@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.1.tgz#c78e351deb8ae5c4ea6d69ca14a68cd3fe9e0560" - integrity sha512-tqQkafikGfnc7ISnGjSYkbpnzJKEyO8XSa0YOXTAL3J8R5Pss5ZIZY7G8kq1mwQSR/dPVR1ZLTVXgZGuysjP8w== - -"@tauri-apps/cli-linux-x64-gnu@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.3.1.tgz#351894786928fa4dfef59693b9f7203c07ccab7c" - integrity sha512-I3puDJ2wGEauXlXbzIHn2etz78TaWs1cpN6zre02maHr6ZR7nf7euTCOGPhhfoMG0opA5mT/eLuYpVw648/VAA== - -"@tauri-apps/cli-linux-x64-musl@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.1.tgz#cee486acacaada50eff6b37c31449f4595e1c9e9" - integrity sha512-rbWiCOBuQN7tPySkUyBs914uUikE3mEUOqV/IFospvKESw4UC3G1DL5+ybfXH7Orb8/in3JpJuVzYQjo+OSbBA== - -"@tauri-apps/cli-win32-arm64-msvc@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.3.1.tgz#d5a5b865fede9b8d13338da38a3cc5fe9e3cfb53" - integrity sha512-PdTmUzSeTHjJuBpCV7L+V29fPhPtToU+NZU46slHKSA1aT38MiFDXBZ/6P5Zudrt9QPMfIubqnJKbK8Ivvv7Ww== - -"@tauri-apps/cli-win32-ia32-msvc@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.3.1.tgz#5d9fa6d3ffd705d5b8e435082591efbd32f7bad5" - integrity sha512-K/Xa97kspWT4UWj3t26lL2D3QsopTAxS7kWi5kObdqtAGn3qD52qBi24FH38TdvHYz4QlnLIb30TukviCgh4gw== - -"@tauri-apps/cli-win32-x64-msvc@2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.3.1.tgz#996ba5720b1b552014425570d95b3b905f89ff59" - integrity sha512-RgwzXbP8gAno3kQEsybMtgLp6D1Z1Nec2cftryYbPTJmoMJs6e4qgtxuTSbUz5SKnHe8rGgMiFSvEGoHvbG72Q== - -"@tauri-apps/cli@^2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-2.3.1.tgz#e049127bb083ad158afb34fc3c41d1f0400ff42f" - integrity sha512-xewcw/ZsCqgilTy2h7+pp2Baxoy7zLR2wXOV7SZLzkb6SshHVbm1BFAjn8iFATURRW85KLzl6wSGJ2dQHjVHqw== +"@tauri-apps/api@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-2.8.0.tgz#0348a2b3ba5982ec67a7d569f329b4a55d7d5f1e" + integrity sha512-ga7zdhbS2GXOMTIZRT0mYjKJtR9fivsXzsyq5U3vjDL0s6DTMwYRm0UHNjzTY5dh4+LSC68Sm/7WEiimbQNYlw== + +"@tauri-apps/cli-darwin-arm64@2.8.4": + version "2.8.4" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.8.4.tgz#ec09c0673dd1816e89910cf31ddc7d94c5cf077f" + integrity sha512-BKu8HRkYV01SMTa7r4fLx+wjgtRK8Vep7lmBdHDioP6b8XH3q2KgsAyPWfEZaZIkZ2LY4SqqGARaE9oilNe0oA== + +"@tauri-apps/cli-darwin-x64@2.8.4": + version "2.8.4" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.8.4.tgz#b9c274fedce570da1910559add68657d264019db" + integrity sha512-imb9PfSd/7G6VAO7v1bQ2A3ZH4NOCbhGJFLchxzepGcXf9NKkfun157JH9mko29K6sqAwuJ88qtzbKCbWJTH9g== + +"@tauri-apps/cli-linux-arm-gnueabihf@2.8.4": + version "2.8.4" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.8.4.tgz#657131a05f422b9141277f0668d370e8d671bdc0" + integrity sha512-Ml215UnDdl7/fpOrF1CNovym/KjtUbCuPgrcZ4IhqUCnhZdXuphud/JT3E8X97Y03TZ40Sjz8raXYI2ET0exzw== + +"@tauri-apps/cli-linux-arm64-gnu@2.8.4": + version "2.8.4" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.8.4.tgz#35a14541e09b6548b811626d1a5d2574932116ef" + integrity sha512-pbcgBpMyI90C83CxE5REZ9ODyIlmmAPkkJXtV398X3SgZEIYy5TACYqlyyv2z5yKgD8F8WH4/2fek7+jH+ZXAw== + +"@tauri-apps/cli-linux-arm64-musl@2.8.4": + version "2.8.4" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.8.4.tgz#bdd9deea17e0c2e4edf511a071c87670616af8a3" + integrity sha512-zumFeaU1Ws5Ay872FTyIm7z8kfzEHu8NcIn8M6TxbJs0a7GRV21KBdpW1zNj2qy7HynnpQCqjAYXTUUmm9JAOw== + +"@tauri-apps/cli-linux-riscv64-gnu@2.8.4": + version "2.8.4" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.8.4.tgz#ac3c751ce5727fbd1da280f0aa2fb444fcd706b5" + integrity sha512-qiqbB3Zz6IyO201f+1ojxLj65WYj8mixL5cOMo63nlg8CIzsP23cPYUrx1YaDPsCLszKZo7tVs14pc7BWf+/aQ== + +"@tauri-apps/cli-linux-x64-gnu@2.8.4": + version "2.8.4" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.8.4.tgz#7b2000b5e6597dc62f48cb67ee98f61b54493a19" + integrity sha512-TaqaDd9Oy6k45Hotx3pOf+pkbsxLaApv4rGd9mLuRM1k6YS/aw81YrsMryYPThrxrScEIUcmNIHaHsLiU4GMkw== + +"@tauri-apps/cli-linux-x64-musl@2.8.4": + version "2.8.4" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.8.4.tgz#5dd9f6e666e004e00313d86a5d71480f7ac1269a" + integrity sha512-ot9STAwyezN8w+bBHZ+bqSQIJ0qPZFlz/AyscpGqB/JnJQVDFQcRDmUPFEaAtt2UUHSWzN3GoTJ5ypqLBp2WQA== + +"@tauri-apps/cli-win32-arm64-msvc@2.8.4": + version "2.8.4" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.8.4.tgz#75eadbad9ae5726cc53139bbeae4c4a8fc4a92be" + integrity sha512-+2aJ/g90dhLiOLFSD1PbElXX3SoMdpO7HFPAZB+xot3CWlAZD1tReUFy7xe0L5GAR16ZmrxpIDM9v9gn5xRy/w== + +"@tauri-apps/cli-win32-ia32-msvc@2.8.4": + version "2.8.4" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.8.4.tgz#60e6cdad4fb59d91a194652581742d08c952f0a7" + integrity sha512-yj7WDxkL1t9Uzr2gufQ1Hl7hrHuFKTNEOyascbc109EoiAqCp0tgZ2IykQqOZmZOHU884UAWI1pVMqBhS/BfhA== + +"@tauri-apps/cli-win32-x64-msvc@2.8.4": + version "2.8.4" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.8.4.tgz#44461625197c531537ccba84b64c804a0d7228ae" + integrity sha512-XuvGB4ehBdd7QhMZ9qbj/8icGEatDuBNxyYHbLKsTYh90ggUlPa/AtaqcC1Fo69lGkTmq9BOKrs1aWSi7xDonA== + +"@tauri-apps/cli@^2.8.0": + version "2.8.4" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-2.8.4.tgz#ff8347e43164f73922356c10ba5cdbaf567ffe98" + integrity sha512-ejUZBzuQRcjFV+v/gdj/DcbyX/6T4unZQjMSBZwLzP/CymEjKcc2+Fc8xTORThebHDUvqoXMdsCZt8r+hyN15g== optionalDependencies: - "@tauri-apps/cli-darwin-arm64" "2.3.1" - "@tauri-apps/cli-darwin-x64" "2.3.1" - "@tauri-apps/cli-linux-arm-gnueabihf" "2.3.1" - "@tauri-apps/cli-linux-arm64-gnu" "2.3.1" - "@tauri-apps/cli-linux-arm64-musl" "2.3.1" - "@tauri-apps/cli-linux-x64-gnu" "2.3.1" - "@tauri-apps/cli-linux-x64-musl" "2.3.1" - "@tauri-apps/cli-win32-arm64-msvc" "2.3.1" - "@tauri-apps/cli-win32-ia32-msvc" "2.3.1" - "@tauri-apps/cli-win32-x64-msvc" "2.3.1" + "@tauri-apps/cli-darwin-arm64" "2.8.4" + "@tauri-apps/cli-darwin-x64" "2.8.4" + "@tauri-apps/cli-linux-arm-gnueabihf" "2.8.4" + "@tauri-apps/cli-linux-arm64-gnu" "2.8.4" + "@tauri-apps/cli-linux-arm64-musl" "2.8.4" + "@tauri-apps/cli-linux-riscv64-gnu" "2.8.4" + "@tauri-apps/cli-linux-x64-gnu" "2.8.4" + "@tauri-apps/cli-linux-x64-musl" "2.8.4" + "@tauri-apps/cli-win32-arm64-msvc" "2.8.4" + "@tauri-apps/cli-win32-ia32-msvc" "2.8.4" + "@tauri-apps/cli-win32-x64-msvc" "2.8.4" "@types/estree@*", "@types/estree@1.0.6", "@types/estree@^1.0.0", "@types/estree@^1.0.6": version "1.0.6" From 42aeeec20b418b76edbd59d942dac7b68bda1429 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sat, 6 Sep 2025 01:13:32 +0200 Subject: [PATCH 03/68] Add Tauri v2 shell:allow-open capability --- package.json | 4 +- src-tauri/capabilities/default.json | 10 ++ src-tauri/tauri.conf.json | 9 +- yarn.lock | 190 ++++++++++++---------------- 4 files changed, 99 insertions(+), 114 deletions(-) create mode 100644 src-tauri/capabilities/default.json diff --git a/package.json b/package.json index ae6678fb92..4c65b2991d 100644 --- a/package.json +++ b/package.json @@ -46,8 +46,8 @@ "@capacitor/android": "^7.0.1", "@capacitor/core": "^7.0.1", "@fortawesome/fontawesome-free": "^6.5.2", - "@tauri-apps/api": "^2.3.0", - "@tauri-apps/cli": "^2.3.1", + "@tauri-apps/api": "^2.9.0", + "@tauri-apps/cli": "^2.9.1", "@vitejs/plugin-vue": "^6.0.1", "crypto-es": "^2.1.0", "d3": "^7.9.0", diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json new file mode 100644 index 0000000000..6951536ce8 --- /dev/null +++ b/src-tauri/capabilities/default.json @@ -0,0 +1,10 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Default capability for all windows, allows core and shell open permissions.", + "windows": ["*"], + "permissions": [ + "core:default", + "shell:allow-open" + ] +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 3e5f40713b..447206cd64 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -10,7 +10,10 @@ }, "app": { "security": { - "csp": null + "csp": null, + "capabilities": [ + { "path": "./capabilities/default.json" } + ] }, "windows": [ { @@ -29,7 +32,9 @@ }, "plugins": { "shell": { - "open": true + "open": { + "allowlist": ["^https://.*"] + } } } } diff --git a/yarn.lock b/yarn.lock index 9660071c9b..f8a3a8b601 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2183,6 +2183,83 @@ magic-string "^0.25.0" string.prototype.matchall "^4.0.6" +"@tauri-apps/api@^2.9.0": + version "2.9.0" + resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-2.9.0.tgz#047fcbfec05a719b0cec997eee244cee453fb2fc" + integrity sha512-qD5tMjh7utwBk9/5PrTA/aGr3i5QaJ/Mlt7p8NilQ45WgbifUNPyKWsA63iQ8YfQq6R8ajMapU+/Q8nMcPRLNw== + +"@tauri-apps/cli-darwin-arm64@2.9.1": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.9.1.tgz#60bbf0a34098c1feb865d7483433c6e4a0208142" + integrity sha512-sdwhtsE/6njD0AjgfYEj1JyxZH4SBmCJSXpRm6Ph5fQeuZD6MyjzjdVOrrtFguyREVQ7xn0Ujkwvbo01ULthNg== + +"@tauri-apps/cli-darwin-x64@2.9.1": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.9.1.tgz#e0bdb2e29201dd0b46bffa61cc7dccb5f0c6ae29" + integrity sha512-c86g+67wTdI4TUCD7CaSd/13+oYuLQxVST4ZNJ5C+6i1kdnU3Us1L68N9MvbDLDQGJc9eo0pvuK6sCWkee+BzA== + +"@tauri-apps/cli-linux-arm-gnueabihf@2.9.1": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.9.1.tgz#15ad573c32b8941d10c2ebd2ecfe399ea85ed023" + integrity sha512-IrB3gFQmueQKJjjisOcMktW/Gh6gxgqYO419doA3YZ7yIV5rbE8ZW52Q3I4AO+SlFEyVYer5kpi066p0JBlLGw== + +"@tauri-apps/cli-linux-arm64-gnu@2.9.1": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.9.1.tgz#f7a5dd6f46c5a2b52f20a61308cd61dd04694435" + integrity sha512-Ke7TyXvu6HbWSkmVkFbbH19D3cLsd117YtXP/u9NIvSpYwKeFtnbpirrIUfPm44Q+PZFZ2Hvg8X9qoUiAK0zKw== + +"@tauri-apps/cli-linux-arm64-musl@2.9.1": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.9.1.tgz#011caad0d6222f5c18221d7b413e1b4750eef5f4" + integrity sha512-sGvy75sv55oeMulR5ArwPD28DsDQxqTzLhXCrpU9/nbFg/JImmI7k994YE9fr3V0qE3Cjk5gjLldRNv7I9sjwQ== + +"@tauri-apps/cli-linux-riscv64-gnu@2.9.1": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.9.1.tgz#0328624bf798d653c49bc0455d1cc111e631846b" + integrity sha512-tEKbJydV3BdIxpAx8aGHW6VDg1xW4LlQuRD/QeFZdZNTreHJpMbJEcdvAcI+Hg6vgQpVpaoEldR9W4F6dYSLqQ== + +"@tauri-apps/cli-linux-x64-gnu@2.9.1": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.9.1.tgz#25e0f95615ddede953af4d29ad1c0d1f7c160c3f" + integrity sha512-mg5msXHagtHpyCVWgI01M26JeSrgE/otWyGdYcuTwyRYZYEJRTbcNt7hscOkdNlPBe7isScW7PVKbxmAjJJl4g== + +"@tauri-apps/cli-linux-x64-musl@2.9.1": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.9.1.tgz#ccb819101a225947f42ebb4f1f6902514aa902e3" + integrity sha512-lFZEXkpDreUe3zKilvnMsrnKP9gwQudaEjDnOz/GMzbzNceIuPfFZz0cR/ky1Aoq4eSvZonPKHhROq4owz4fzg== + +"@tauri-apps/cli-win32-arm64-msvc@2.9.1": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.9.1.tgz#c0be0555d2b3686d4b3ea702039d41ed6017e4eb" + integrity sha512-ejc5RAp/Lm1Aj0EQHaT+Wdt5PHfdgQV5hIDV00MV6HNbIb5W4ZUFxMDaRkAg65gl9MvY2fH396riePW3RoKXDw== + +"@tauri-apps/cli-win32-ia32-msvc@2.9.1": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.9.1.tgz#b637cd436f129ef3ff6e83a4095c37b85f308a27" + integrity sha512-fSATtJDc0fNjVB6ystyi8NbwhNFk8i8E05h6KrsC8Fio5eaJIJvPCbC9pdrPl6kkxN1X7fj25ErBbgfqgcK8Fg== + +"@tauri-apps/cli-win32-x64-msvc@2.9.1": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.9.1.tgz#d7c8512dd70f9aa8203f2011322542ec11f76b66" + integrity sha512-/JHlOzpUDhjBOO9w167bcYxfJbcMQv7ykS/Y07xjtcga8np0rzUzVGWYmLMH7orKcDMC7wjhheEW1x8cbGma/Q== + +"@tauri-apps/cli@^2.9.1": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-2.9.1.tgz#cdc1cc6a005fef017b2a8f1a96d32537afc74579" + integrity sha512-kKi2/WWsNXKoMdatBl4xrT7e1Ce27JvsetBVfWuIb6D3ep/Y0WO5SIr70yarXOSWam8NyDur4ipzjZkg6m7VDg== + optionalDependencies: + "@tauri-apps/cli-darwin-arm64" "2.9.1" + "@tauri-apps/cli-darwin-x64" "2.9.1" + "@tauri-apps/cli-linux-arm-gnueabihf" "2.9.1" + "@tauri-apps/cli-linux-arm64-gnu" "2.9.1" + "@tauri-apps/cli-linux-arm64-musl" "2.9.1" + "@tauri-apps/cli-linux-riscv64-gnu" "2.9.1" + "@tauri-apps/cli-linux-x64-gnu" "2.9.1" + "@tauri-apps/cli-linux-x64-musl" "2.9.1" + "@tauri-apps/cli-win32-arm64-msvc" "2.9.1" + "@tauri-apps/cli-win32-ia32-msvc" "2.9.1" + "@tauri-apps/cli-win32-x64-msvc" "2.9.1" + "@types/chai@^5.2.2": version "5.2.2" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.2.tgz#6f14cea18180ffc4416bc0fd12be05fdd73bdd6b" @@ -2196,88 +2273,6 @@ integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== "@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.6": -"@tauri-apps/api@^2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-2.3.0.tgz#8ced2a5e5f1d30d585a22b11dff2cbdfa3f9eab2" - integrity sha512-33Z+0lX2wgZbx1SPFfqvzI6su63hCBkbzv+5NexeYjIx7WA9htdOKoRR7Dh3dJyltqS5/J8vQFyybiRoaL0hlA== -"@tauri-apps/api@^2.8.0": - version "2.8.0" - resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-2.8.0.tgz#0348a2b3ba5982ec67a7d569f329b4a55d7d5f1e" - integrity sha512-ga7zdhbS2GXOMTIZRT0mYjKJtR9fivsXzsyq5U3vjDL0s6DTMwYRm0UHNjzTY5dh4+LSC68Sm/7WEiimbQNYlw== - -"@tauri-apps/cli-darwin-arm64@2.8.4": - version "2.8.4" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.8.4.tgz#ec09c0673dd1816e89910cf31ddc7d94c5cf077f" - integrity sha512-BKu8HRkYV01SMTa7r4fLx+wjgtRK8Vep7lmBdHDioP6b8XH3q2KgsAyPWfEZaZIkZ2LY4SqqGARaE9oilNe0oA== - -"@tauri-apps/cli-darwin-x64@2.8.4": - version "2.8.4" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.8.4.tgz#b9c274fedce570da1910559add68657d264019db" - integrity sha512-imb9PfSd/7G6VAO7v1bQ2A3ZH4NOCbhGJFLchxzepGcXf9NKkfun157JH9mko29K6sqAwuJ88qtzbKCbWJTH9g== - -"@tauri-apps/cli-linux-arm-gnueabihf@2.8.4": - version "2.8.4" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.8.4.tgz#657131a05f422b9141277f0668d370e8d671bdc0" - integrity sha512-Ml215UnDdl7/fpOrF1CNovym/KjtUbCuPgrcZ4IhqUCnhZdXuphud/JT3E8X97Y03TZ40Sjz8raXYI2ET0exzw== - -"@tauri-apps/cli-linux-arm64-gnu@2.8.4": - version "2.8.4" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.8.4.tgz#35a14541e09b6548b811626d1a5d2574932116ef" - integrity sha512-pbcgBpMyI90C83CxE5REZ9ODyIlmmAPkkJXtV398X3SgZEIYy5TACYqlyyv2z5yKgD8F8WH4/2fek7+jH+ZXAw== - -"@tauri-apps/cli-linux-arm64-musl@2.8.4": - version "2.8.4" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.8.4.tgz#bdd9deea17e0c2e4edf511a071c87670616af8a3" - integrity sha512-zumFeaU1Ws5Ay872FTyIm7z8kfzEHu8NcIn8M6TxbJs0a7GRV21KBdpW1zNj2qy7HynnpQCqjAYXTUUmm9JAOw== - -"@tauri-apps/cli-linux-riscv64-gnu@2.8.4": - version "2.8.4" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.8.4.tgz#ac3c751ce5727fbd1da280f0aa2fb444fcd706b5" - integrity sha512-qiqbB3Zz6IyO201f+1ojxLj65WYj8mixL5cOMo63nlg8CIzsP23cPYUrx1YaDPsCLszKZo7tVs14pc7BWf+/aQ== - -"@tauri-apps/cli-linux-x64-gnu@2.8.4": - version "2.8.4" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.8.4.tgz#7b2000b5e6597dc62f48cb67ee98f61b54493a19" - integrity sha512-TaqaDd9Oy6k45Hotx3pOf+pkbsxLaApv4rGd9mLuRM1k6YS/aw81YrsMryYPThrxrScEIUcmNIHaHsLiU4GMkw== - -"@tauri-apps/cli-linux-x64-musl@2.8.4": - version "2.8.4" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.8.4.tgz#5dd9f6e666e004e00313d86a5d71480f7ac1269a" - integrity sha512-ot9STAwyezN8w+bBHZ+bqSQIJ0qPZFlz/AyscpGqB/JnJQVDFQcRDmUPFEaAtt2UUHSWzN3GoTJ5ypqLBp2WQA== - -"@tauri-apps/cli-win32-arm64-msvc@2.8.4": - version "2.8.4" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.8.4.tgz#75eadbad9ae5726cc53139bbeae4c4a8fc4a92be" - integrity sha512-+2aJ/g90dhLiOLFSD1PbElXX3SoMdpO7HFPAZB+xot3CWlAZD1tReUFy7xe0L5GAR16ZmrxpIDM9v9gn5xRy/w== - -"@tauri-apps/cli-win32-ia32-msvc@2.8.4": - version "2.8.4" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.8.4.tgz#60e6cdad4fb59d91a194652581742d08c952f0a7" - integrity sha512-yj7WDxkL1t9Uzr2gufQ1Hl7hrHuFKTNEOyascbc109EoiAqCp0tgZ2IykQqOZmZOHU884UAWI1pVMqBhS/BfhA== - -"@tauri-apps/cli-win32-x64-msvc@2.8.4": - version "2.8.4" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.8.4.tgz#44461625197c531537ccba84b64c804a0d7228ae" - integrity sha512-XuvGB4ehBdd7QhMZ9qbj/8icGEatDuBNxyYHbLKsTYh90ggUlPa/AtaqcC1Fo69lGkTmq9BOKrs1aWSi7xDonA== - -"@tauri-apps/cli@^2.8.0": - version "2.8.4" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-2.8.4.tgz#ff8347e43164f73922356c10ba5cdbaf567ffe98" - integrity sha512-ejUZBzuQRcjFV+v/gdj/DcbyX/6T4unZQjMSBZwLzP/CymEjKcc2+Fc8xTORThebHDUvqoXMdsCZt8r+hyN15g== - optionalDependencies: - "@tauri-apps/cli-darwin-arm64" "2.8.4" - "@tauri-apps/cli-darwin-x64" "2.8.4" - "@tauri-apps/cli-linux-arm-gnueabihf" "2.8.4" - "@tauri-apps/cli-linux-arm64-gnu" "2.8.4" - "@tauri-apps/cli-linux-arm64-musl" "2.8.4" - "@tauri-apps/cli-linux-riscv64-gnu" "2.8.4" - "@tauri-apps/cli-linux-x64-gnu" "2.8.4" - "@tauri-apps/cli-linux-x64-musl" "2.8.4" - "@tauri-apps/cli-win32-arm64-msvc" "2.8.4" - "@tauri-apps/cli-win32-ia32-msvc" "2.8.4" - "@tauri-apps/cli-win32-x64-msvc" "2.8.4" - -"@types/estree@*", "@types/estree@1.0.6", "@types/estree@^1.0.0", "@types/estree@^1.0.6": version "1.0.6" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== @@ -9570,7 +9565,7 @@ string-argv@^0.3.2: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== -"string-width-cjs@npm:string-width@^4.2.0": +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9588,15 +9583,6 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string-width@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" @@ -9702,7 +9688,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -9730,13 +9716,6 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -11009,7 +10988,7 @@ workbox-window@7.3.0, workbox-window@^7.3.0: "@types/trusted-types" "^2.0.2" workbox-core "7.3.0" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -11035,15 +11014,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From acd61f4f07238f58bc6d0aae25b6fa360ceca73f Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Fri, 24 Oct 2025 01:31:53 +0200 Subject: [PATCH 04/68] Update --- src-tauri/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index f4e9deb879..bd2384dcd5 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -8,10 +8,10 @@ repository = "https://github.com/betaflight/betaflight-configurator" edition = "2021" [build-dependencies] -tauri-build = { version = "2.0.6", features = [] } +tauri-build = { version = "2.9.0", features = [] } [dependencies] -tauri = { version = "2.0.6", features = [] } +tauri = { version = "2.9.0", features = [] } tauri-plugin-shell = "2.0.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" From 84ede3cbc80a8ca31f04edca29950b5a530849cf Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Fri, 24 Oct 2025 01:33:20 +0200 Subject: [PATCH 05/68] Add DockerFile (needs testing) --- DOCKER.MD | 42 +++++++++++++++++++++++++++++ DockerFile | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 DOCKER.MD create mode 100644 DockerFile diff --git a/DOCKER.MD b/DOCKER.MD new file mode 100644 index 0000000000..671a69c670 --- /dev/null +++ b/DOCKER.MD @@ -0,0 +1,42 @@ +🐳 Development Environment with Docker + +To ensure all developers use a consistent environment, especially for cross-platform compilation (Rust, Node.js, Android SDK/NDK), we provide a Dockerfile. + +1. Build the Docker Image + +Build the container image from the Dockerfile in the project root. This process will download all system dependencies, the Rust toolchain, and the Android SDK/NDK. +Bash + +docker build -t betaflight-tauri-dev . + +2. Run the Development Container + +Run the image and mount your local project directory into the container's /app directory. This allows you to work on your code locally while running all build commands inside the isolated Docker environment. +Bash + +docker run -it --rm \ + -v $(pwd):/app \ + --name betaflight-dev-container \ + betaflight-tauri-dev + + -it: Runs the container in interactive mode with a TTY (shell access). + + --rm: Automatically removes the container when you exit. + + -v $(pwd):/app: Mounts your current directory (the project root) to the /app working directory in the container. + +3. Execute Build/Dev Commands + +Once inside the container's terminal, you can run any of the Tauri commands without needing to worry about local prerequisites. + +Command | Purpose +--- | --- +bun install | Installs the frontend dependencies. +bun tauri dev | Runs the desktop development server. +bun tauri android dev | Runs the app on a connected Android device or emulator (must be running outside of the container). +bun tauri android build | Builds a release APK for Android. + +You may need to start an Android emulator on your host machine before running bun tauri android dev. + +You can watch this video for a practical demonstration of setting up a dev container for Tauri and Android development. +https://www.youtube.com/watch?v=X3EThnruPA4 diff --git a/DockerFile b/DockerFile new file mode 100644 index 0000000000..07fe5d9e5c --- /dev/null +++ b/DockerFile @@ -0,0 +1,77 @@ +# Use a base image that supports the necessary build tools +FROM debian:bookworm-slim + +# Set environment variables for non-interactive installs and Android components +# You may need to update these versions over time +ENV DEBIAN_FRONTEND=noninteractive +ENV RUSTUP_HOME=/usr/local/rustup \ + CARGO_HOME=/usr/local/cargo \ + ANDROID_SDK_ROOT=/usr/local/android-sdk \ + NDK_VERSION=26.3.11579204 \ + SDK_PLATFORM_VERSION=34 \ + SDK_BUILD_TOOLS_VERSION=34.0.0 +ENV PATH=$CARGO_HOME/bin:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$PATH + +# --- Install System Dependencies (Rust, Node.js, and Build Tools) --- +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + curl \ + wget \ + xz-utils \ + unzip \ + git \ + build-essential \ + libwebkit2gtk-4.1-dev \ + libssl-dev \ + libayatana-appindicator3-dev \ + librsvg2-dev \ + libxdo-dev \ + # Dependencies for Android build targets (needed for the linker) + clang \ + llvm \ + g++-multilib \ + openjdk-17-jdk \ + && rm -rf /var/lib/apt/lists/* + +# Install Rust +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable + +# Add Rust targets for Android +RUN $CARGO_HOME/bin/rustup target add \ + aarch64-linux-android \ + armv7-linux-androideabi \ + i686-linux-android \ + x86_64-linux-android + +# Install a Node.js runtime (e.g., Bun, or use Node/NPM if preferred) +# Replace this section with your preferred runtime installation (npm, yarn, pnpm) +RUN curl -fsSL https://bun.sh/install | bash +ENV PATH="/root/.bun/bin:$PATH" + +# --- Install Android SDK/NDK --- +# Download the Android SDK command line tools +RUN mkdir -p $ANDROID_SDK_ROOT/cmdline-tools && \ + wget -q https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -O cmdline-tools.zip && \ + unzip -q cmdline-tools.zip -d $ANDROID_SDK_ROOT/cmdline-tools && \ + mv $ANDROID_SDK_ROOT/cmdline-tools/cmdline-tools $ANDROID_SDK_ROOT/cmdline-tools/latest && \ + rm cmdline-tools.zip + +# Accept licenses and install platform tools, platforms, and NDK +RUN yes | sdkmanager --licenses && \ + sdkmanager \ + "platform-tools" \ + "platforms;android-${SDK_PLATFORM_VERSION}" \ + "build-tools;${SDK_BUILD_TOOLS_VERSION}" \ + "ndk;${NDK_VERSION}" + +# Set the NDK_HOME environment variable +ENV NDK_HOME=$ANDROID_SDK_ROOT/ndk/${NDK_VERSION} + +# Create a non-root user and set it as the working user +# This is a security best practice +RUN useradd -ms /bin/bash developer && chown -R developer:developer /usr/local/ +USER developer +WORKDIR /app + +# The ENTRYPOINT should be set to your shell to allow running commands +ENTRYPOINT ["/bin/bash"] From 490289045a7b0eb88cc68d217b183ba2515d11ce Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Fri, 24 Oct 2025 01:37:26 +0200 Subject: [PATCH 06/68] Update edition --- src-tauri/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index bd2384dcd5..ea1e0e4bb7 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -5,7 +5,7 @@ description = "Betaflight App" authors = ["Betaflight Team"] license = "GPL-3.0" repository = "https://github.com/betaflight/betaflight-configurator" -edition = "2021" +edition = "2024" [build-dependencies] tauri-build = { version = "2.9.0", features = [] } From f151b51d706cba446c4b38c67977594e3f0ebc9a Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Fri, 24 Oct 2025 02:09:30 +0200 Subject: [PATCH 07/68] Update DOCKER.MD --- DOCKER.MD | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/DOCKER.MD b/DOCKER.MD index 671a69c670..d040ecc3e4 100644 --- a/DOCKER.MD +++ b/DOCKER.MD @@ -1,20 +1,21 @@ -🐳 Development Environment with Docker +# 🐳 Development Environment with Docker To ensure all developers use a consistent environment, especially for cross-platform compilation (Rust, Node.js, Android SDK/NDK), we provide a Dockerfile. -1. Build the Docker Image +## 1. Build the Docker Image Build the container image from the Dockerfile in the project root. This process will download all system dependencies, the Rust toolchain, and the Android SDK/NDK. -Bash -docker build -t betaflight-tauri-dev . +```bash + docker build -t betaflight-tauri-dev . +``` -2. Run the Development Container +## 2. Run the Development Container Run the image and mount your local project directory into the container's /app directory. This allows you to work on your code locally while running all build commands inside the isolated Docker environment. -Bash -docker run -it --rm \ +```bash + docker run -it --rm \ -v $(pwd):/app \ --name betaflight-dev-container \ betaflight-tauri-dev @@ -24,8 +25,9 @@ docker run -it --rm \ --rm: Automatically removes the container when you exit. -v $(pwd):/app: Mounts your current directory (the project root) to the /app working directory in the container. +``` -3. Execute Build/Dev Commands +## 3. Execute Build/Dev Commands Once inside the container's terminal, you can run any of the Tauri commands without needing to worry about local prerequisites. From 00549216f9aa9acbf7161af78baa39c8a4b17f90 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Fri, 24 Oct 2025 18:59:00 +0200 Subject: [PATCH 08/68] Fix app security capabilities --- src-tauri/tauri.conf.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 447206cd64..36357f9bf0 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -12,7 +12,7 @@ "security": { "csp": null, "capabilities": [ - { "path": "./capabilities/default.json" } + "default" ] }, "windows": [ From a3306b836e41de398ffffbab6f306e0f3f6adc62 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Fri, 24 Oct 2025 19:14:29 +0200 Subject: [PATCH 09/68] Fix outdated versions --- package.json | 4 +- src-tauri/Cargo.lock | 703 ++++++++++++++++++++----------------------- src-tauri/Cargo.toml | 6 +- yarn.lock | 4 +- 4 files changed, 339 insertions(+), 378 deletions(-) diff --git a/package.json b/package.json index 4c65b2991d..d2b4d80ab1 100644 --- a/package.json +++ b/package.json @@ -46,8 +46,8 @@ "@capacitor/android": "^7.0.1", "@capacitor/core": "^7.0.1", "@fortawesome/fontawesome-free": "^6.5.2", - "@tauri-apps/api": "^2.9.0", - "@tauri-apps/cli": "^2.9.1", + "@tauri-apps/api": "^2.5.0", + "@tauri-apps/cli": "^2.5.0", "@vitejs/plugin-vue": "^6.0.1", "crypto-es": "^2.1.0", "d3": "^7.9.0", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 7e873f2bcb..ba94d513b6 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -173,9 +173,9 @@ dependencies = [ [[package]] name = "brotli" -version = "7.0.0" +version = "8.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -184,9 +184,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.2" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -278,12 +278,12 @@ dependencies = [ [[package]] name = "cargo_toml" -version = "0.21.0" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fbd1fe9db3ebf71b89060adaf7b0504c2d6a425cf061313099547e382c2e472" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" dependencies = [ "serde", - "toml", + "toml 0.9.8", ] [[package]] @@ -344,7 +344,7 @@ dependencies = [ "iana-time-zone", "num-traits", "serde", - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -458,15 +458,15 @@ dependencies = [ [[package]] name = "cssparser" -version = "0.27.2" +version = "0.29.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" dependencies = [ "cssparser-macros", "dtoa-short", - "itoa 0.4.8", + "itoa", "matches", - "phf 0.8.0", + "phf 0.10.1", "proc-macro2", "quote", "smallvec", @@ -601,9 +601,9 @@ dependencies = [ [[package]] name = "dlopen2" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1297103d2bbaea85724fcee6294c2d50b1081f9ad47d0f6f6f61eda65315a6" +checksum = "b54f373ccf864bf587a89e880fb7610f8d73f3045f13580948ccbcaff26febff" dependencies = [ "dlopen2_derive", "libc", @@ -667,7 +667,7 @@ dependencies = [ "cc", "memchr", "rustc_version", - "toml", + "toml 0.8.20", "vswhom", "winreg", ] @@ -992,10 +992,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", ] [[package]] @@ -1172,9 +1170,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" [[package]] name = "heck" @@ -1196,16 +1194,14 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "html5ever" -version = "0.26.0" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" +checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" dependencies = [ "log", "mac", "markup5ever", - "proc-macro2", - "quote", - "syn 1.0.109", + "match_token", ] [[package]] @@ -1216,7 +1212,7 @@ checksum = "0a761d192fbf18bdef69f5ceedd0d1333afcbda0ee23840373b8317570d23c65" dependencies = [ "bytes", "fnv", - "itoa 1.0.15", + "itoa", ] [[package]] @@ -1260,31 +1256,13 @@ dependencies = [ "http", "http-body", "httparse", - "itoa 1.0.15", + "itoa", "pin-project-lite", "smallvec", "tokio", "want", ] -[[package]] -name = "hyper-rustls" -version = "0.27.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" -dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", - "webpki-roots", -] - [[package]] name = "hyper-util" version = "0.1.10" @@ -1495,13 +1473,14 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.8.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.16.0", "serde", + "serde_core", ] [[package]] @@ -1538,12 +1517,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - [[package]] name = "itoa" version = "1.0.15" @@ -1640,14 +1613,13 @@ dependencies = [ [[package]] name = "kuchikiki" -version = "0.8.2" +version = "0.8.8-speedreader" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8" +checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" dependencies = [ "cssparser", "html5ever", - "indexmap 1.9.3", - "matches", + "indexmap 2.12.0", "selectors", ] @@ -1737,18 +1709,29 @@ checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" [[package]] name = "markup5ever" -version = "0.11.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" +checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" dependencies = [ "log", - "phf 0.10.1", - "phf_codegen 0.10.0", + "phf 0.11.3", + "phf_codegen 0.11.3", "string_cache", "string_cache_codegen", "tendril", ] +[[package]] +name = "match_token" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "matches" version = "0.1.10" @@ -1799,9 +1782,9 @@ dependencies = [ [[package]] name = "muda" -version = "0.16.1" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4de14a9b5d569ca68d7c891d613b390cf5ab4f851c77aaa2f9e435555d3d9492" +checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" dependencies = [ "crossbeam-channel", "dpi", @@ -1815,7 +1798,7 @@ dependencies = [ "png", "serde", "thiserror 2.0.12", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -2082,6 +2065,17 @@ dependencies = [ "objc2-foundation 0.3.0", ] +[[package]] +name = "objc2-security" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3126341c65c5d5728423ae95d788e1b660756486ad0592307ab87ba02d9a7268" +dependencies = [ + "bitflags 2.9.0", + "objc2 0.6.0", + "objc2-core-foundation", +] + [[package]] name = "objc2-ui-kit" version = "0.3.0" @@ -2106,6 +2100,7 @@ dependencies = [ "objc2-app-kit", "objc2-core-foundation", "objc2-foundation 0.3.0", + "objc2-security", ] [[package]] @@ -2217,9 +2212,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" dependencies = [ - "phf_macros 0.8.0", "phf_shared 0.8.0", - "proc-macro-hack", ] [[package]] @@ -2228,7 +2221,9 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" dependencies = [ + "phf_macros 0.10.0", "phf_shared 0.10.0", + "proc-macro-hack", ] [[package]] @@ -2253,12 +2248,12 @@ dependencies = [ [[package]] name = "phf_codegen" -version = "0.10.0" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", + "phf_generator 0.11.3", + "phf_shared 0.11.3", ] [[package]] @@ -2293,12 +2288,12 @@ dependencies = [ [[package]] name = "phf_macros" -version = "0.8.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" dependencies = [ - "phf_generator 0.8.0", - "phf_shared 0.8.0", + "phf_generator 0.10.0", + "phf_shared 0.10.0", "proc-macro-hack", "proc-macro2", "quote", @@ -2370,7 +2365,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" dependencies = [ "base64 0.22.1", - "indexmap 2.8.0", + "indexmap 2.12.0", "quick-xml", "serde", "time", @@ -2486,58 +2481,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "quinn" -version = "0.11.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" -dependencies = [ - "bytes", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "socket2", - "thiserror 2.0.12", - "tokio", - "tracing", -] - -[[package]] -name = "quinn-proto" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" -dependencies = [ - "bytes", - "getrandom 0.2.15", - "rand 0.8.5", - "ring", - "rustc-hash", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.12", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e46f3055866785f6b92bc6164b76be02ca8f2eb4b002c0354b28cf4c119e5944" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.59.0", -] - [[package]] name = "quote" version = "1.0.39" @@ -2697,7 +2640,6 @@ dependencies = [ "http-body", "http-body-util", "hyper", - "hyper-rustls", "hyper-util", "ipnet", "js-sys", @@ -2706,16 +2648,11 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "quinn", - "rustls", - "rustls-pemfile", - "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", "tokio", - "tokio-rustls", "tokio-util", "tower", "tower-service", @@ -2724,36 +2661,15 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots", "windows-registry", ] -[[package]] -name = "ring" -version = "0.17.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ac5d832aa16abd7d1def883a8545280c20a60f523a370aa3a9617c2b8550ee" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.15", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - [[package]] name = "rustc-demangle" version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" -[[package]] -name = "rustc-hash" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" - [[package]] name = "rustc_version" version = "0.4.1" @@ -2763,49 +2679,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustls" -version = "0.23.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" -dependencies = [ - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" -dependencies = [ - "web-time", -] - -[[package]] -name = "rustls-webpki" -version = "0.102.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", -] - [[package]] name = "rustversion" version = "1.0.20" @@ -2862,22 +2735,20 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "selectors" -version = "0.22.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" dependencies = [ "bitflags 1.3.2", "cssparser", "derive_more", "fxhash", "log", - "matches", "phf 0.8.0", "phf_codegen 0.8.0", "precomputed-hash", "servo_arc", "smallvec", - "thin-slice", ] [[package]] @@ -2891,10 +2762,11 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] @@ -2909,11 +2781,20 @@ dependencies = [ "typeid", ] +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -2937,7 +2818,7 @@ version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ - "itoa 1.0.15", + "itoa", "memchr", "ryu", "serde", @@ -2963,6 +2844,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" +dependencies = [ + "serde_core", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -2970,7 +2860,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.15", + "itoa", "ryu", "serde", ] @@ -2985,7 +2875,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.8.0", + "indexmap 2.12.0", "serde", "serde_derive", "serde_json", @@ -3007,9 +2897,9 @@ dependencies = [ [[package]] name = "serialize-to-javascript" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" dependencies = [ "serde", "serde_json", @@ -3018,20 +2908,20 @@ dependencies = [ [[package]] name = "serialize-to-javascript-impl" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.100", ] [[package]] name = "servo_arc" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" dependencies = [ "nodrop", "stable_deref_trait", @@ -3192,12 +3082,6 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - [[package]] name = "swift-rs" version = "1.0.7" @@ -3260,17 +3144,18 @@ dependencies = [ "cfg-expr", "heck 0.5.0", "pkg-config", - "toml", + "toml 0.8.20", "version-compare", ] [[package]] name = "tao" -version = "0.32.8" +version = "0.34.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63c8b1020610b9138dd7b1e06cf259ae91aa05c30f3bd0d6b42a03997b92dec1" +checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" dependencies = [ "bitflags 2.9.0", + "block2 0.6.0", "core-foundation", "core-graphics", "crossbeam-channel", @@ -3298,7 +3183,7 @@ dependencies = [ "unicode-segmentation", "url", "windows", - "windows-core 0.60.1", + "windows-core 0.61.2", "windows-version", "x11-dl", ] @@ -3322,17 +3207,17 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.3.1" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be747b26bf28674977fac47bdf6963fd9c7578271c3fbeb25d8686de6596f35" +checksum = "c9871670c6711f50fddd4e20350be6b9dd6e6c2b5d77d8ee8900eb0d58cd837a" dependencies = [ "anyhow", "bytes", + "cookie", "dirs", "dunce", "embed_plist", - "futures-util", - "getrandom 0.2.15", + "getrandom 0.3.1", "glob", "gtk", "heck 0.5.0", @@ -3345,6 +3230,8 @@ dependencies = [ "objc2 0.6.0", "objc2-app-kit", "objc2-foundation 0.3.0", + "objc2-ui-kit", + "objc2-web-kit", "percent-encoding", "plist", "raw-window-handle", @@ -3363,7 +3250,6 @@ dependencies = [ "tokio", "tray-icon", "url", - "urlpattern", "webkit2gtk", "webview2-com", "window-vibrancy", @@ -3372,9 +3258,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.0.6" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51a2e96f3c0baa0581656bb58e6fdd0f7c9c31eaf6721a0c08689d938fe85f2d" +checksum = "a924b6c50fe83193f0f8b14072afa7c25b7a72752a2a73d9549b463f5fe91a38" dependencies = [ "anyhow", "cargo_toml", @@ -3388,15 +3274,15 @@ dependencies = [ "serde_json", "tauri-utils", "tauri-winres", - "toml", + "toml 0.9.8", "walkdir", ] [[package]] name = "tauri-codegen" -version = "2.0.5" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e357ec3daf8faad1029bc7109e7f5b308ceb63b6073d110d7388923a4cce5e55" +checksum = "6c1fe64c74cc40f90848281a90058a6db931eb400b60205840e09801ee30f190" dependencies = [ "base64 0.22.1", "brotli", @@ -3421,9 +3307,9 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.0.5" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447ee4dd94690d77f1422f2b57e783c654ba75c535ad6f6e727887330804fff2" +checksum = "260c5d2eb036b76206b9fca20b7be3614cfd21046c5396f7959e0e64a4b07f2f" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -3435,9 +3321,9 @@ dependencies = [ [[package]] name = "tauri-plugin" -version = "2.0.5" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad3021d8e60ec7672f51ecb67c5e1a514a4d7a9a5ffc9d85090739378047502" +checksum = "076c78a474a7247c90cad0b6e87e593c4c620ed4efdb79cbe0214f0021f6c39d" dependencies = [ "anyhow", "glob", @@ -3446,15 +3332,15 @@ dependencies = [ "serde", "serde_json", "tauri-utils", - "toml", + "toml 0.9.8", "walkdir", ] [[package]] name = "tauri-plugin-shell" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2c50a63e60fb8925956cc5b7569f4b750ac197a4d39f13b8dd46ea8e2bad79" +checksum = "54777d0c0d8add34eea3ced84378619ef5b97996bd967d3038c668feefd21071" dependencies = [ "encoding_rs", "log", @@ -3473,28 +3359,34 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "2.4.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e758a405ab39e25f4d1235c5f06fe563f44b01ee18bbe38ddec5356d4f581908" +checksum = "9368f09358496f2229313fccb37682ad116b7f46fa76981efe116994a0628926" dependencies = [ + "cookie", "dpi", "gtk", "http", "jni", + "objc2 0.6.0", + "objc2-ui-kit", + "objc2-web-kit", "raw-window-handle", "serde", "serde_json", "tauri-utils", "thiserror 2.0.12", "url", + "webkit2gtk", + "webview2-com", "windows", ] [[package]] name = "tauri-runtime-wry" -version = "2.4.1" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b2beb90decade4c71e8b09c9e4a9245837a8a97693f945b77e32baf13f51fec" +checksum = "929f5df216f5c02a9e894554401bcdab6eec3e39ec6a4a7731c7067fc8688a93" dependencies = [ "gtk", "http", @@ -3519,10 +3411,11 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.2.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "107a959dbd5ff53d89a98f6f2e3e987c611334141a43630caae1d80e79446dd6" +checksum = "f6b8bbe426abdbf52d050e52ed693130dbd68375b9ad82a3fb17efb4c8d85673" dependencies = [ + "anyhow", "brotli", "cargo_metadata", "ctor", @@ -3547,7 +3440,7 @@ dependencies = [ "serde_with", "swift-rs", "thiserror 2.0.12", - "toml", + "toml 0.9.8", "url", "urlpattern", "uuid", @@ -3561,7 +3454,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56eaa45f707bedf34d19312c26d350bc0f3c59a47e58e8adbeecdc850d2c13a0" dependencies = [ "embed-resource", - "toml", + "toml 0.8.20", ] [[package]] @@ -3575,12 +3468,6 @@ dependencies = [ "utf-8", ] -[[package]] -name = "thin-slice" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" - [[package]] name = "thiserror" version = "1.0.69" @@ -3628,7 +3515,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dad298b01a40a23aac4580b67e3dbedb7cc8402f3592d7f49469de2ea4aecdd8" dependencies = [ "deranged", - "itoa 1.0.15", + "itoa", "num-conv", "powerfmt", "serde", @@ -3662,21 +3549,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "tinyvec" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "tokio" version = "1.44.0" @@ -3692,16 +3564,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "tokio-rustls" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" -dependencies = [ - "rustls", - "tokio", -] - [[package]] name = "tokio-util" version = "0.7.13" @@ -3722,11 +3584,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" dependencies = [ "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.8", + "toml_datetime 0.6.8", "toml_edit 0.22.24", ] +[[package]] +name = "toml" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" +dependencies = [ + "indexmap 2.12.0", + "serde_core", + "serde_spanned 1.0.3", + "toml_datetime 0.7.3", + "toml_parser", + "toml_writer", + "winnow 0.7.13", +] + [[package]] name = "toml_datetime" version = "0.6.8" @@ -3736,14 +3613,23 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +dependencies = [ + "serde_core", +] + [[package]] name = "toml_edit" version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.8.0", - "toml_datetime", + "indexmap 2.12.0", + "toml_datetime 0.6.8", "winnow 0.5.40", ] @@ -3753,8 +3639,8 @@ version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ - "indexmap 2.8.0", - "toml_datetime", + "indexmap 2.12.0", + "toml_datetime 0.6.8", "winnow 0.5.40", ] @@ -3764,13 +3650,28 @@ version = "0.22.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" dependencies = [ - "indexmap 2.8.0", + "indexmap 2.12.0", "serde", - "serde_spanned", - "toml_datetime", - "winnow 0.7.3", + "serde_spanned 0.6.8", + "toml_datetime 0.6.8", + "winnow 0.7.13", +] + +[[package]] +name = "toml_parser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +dependencies = [ + "winnow 0.7.13", ] +[[package]] +name = "toml_writer" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" + [[package]] name = "tower" version = "0.5.2" @@ -3819,9 +3720,9 @@ dependencies = [ [[package]] name = "tray-icon" -version = "0.20.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d433764348e7084bad2c5ea22c96c71b61b17afe3a11645710f533bd72b6a2b5" +checksum = "e3d5572781bee8e3f994d7467084e1b1fd7a93ce66bd480f8156ba89dee55a2b" dependencies = [ "crossbeam-channel", "dirs", @@ -3836,7 +3737,7 @@ dependencies = [ "png", "serde", "thiserror 2.0.12", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -3910,12 +3811,6 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - [[package]] name = "url" version = "2.5.4" @@ -4134,16 +4029,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "webkit2gtk" version = "2.0.1" @@ -4188,25 +4073,16 @@ dependencies = [ "system-deps", ] -[[package]] -name = "webpki-roots" -version = "0.26.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "webview2-com" -version = "0.36.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0d606f600e5272b514dbb66539dd068211cc20155be8d3958201b4b5bd79ed3" +checksum = "d4ba622a989277ef3886dd5afb3e280e3dd6d974b766118950a08f8f678ad6a4" dependencies = [ "webview2-com-macros", "webview2-com-sys", "windows", - "windows-core 0.60.1", + "windows-core 0.61.2", "windows-implement", "windows-interface", ] @@ -4224,13 +4100,13 @@ dependencies = [ [[package]] name = "webview2-com-sys" -version = "0.36.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb27fccd3c27f68e9a6af1bcf48c2d82534b8675b83608a4d81446d095a17ac" +checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" dependencies = [ "thiserror 2.0.12", "windows", - "windows-core 0.60.1", + "windows-core 0.61.2", ] [[package]] @@ -4281,24 +4157,24 @@ dependencies = [ [[package]] name = "windows" -version = "0.60.0" +version = "0.61.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddf874e74c7a99773e62b1c671427abf01a425e77c3d3fb9fb1e4883ea934529" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" dependencies = [ "windows-collections", - "windows-core 0.60.1", + "windows-core 0.61.2", "windows-future", - "windows-link", + "windows-link 0.1.3", "windows-numerics", ] [[package]] name = "windows-collections" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5467f79cc1ba3f52ebb2ed41dbb459b8e7db636cc3429458d9a852e15bc24dec" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" dependencies = [ - "windows-core 0.60.1", + "windows-core 0.61.2", ] [[package]] @@ -4312,32 +4188,33 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.60.1" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca21a92a9cae9bf4ccae5cf8368dce0837100ddf6e6d57936749e85f152f6247" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ "windows-implement", "windows-interface", - "windows-link", - "windows-result 0.3.1", - "windows-strings 0.3.1", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] name = "windows-future" -version = "0.1.1" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a787db4595e7eb80239b74ce8babfb1363d8e343ab072f2ffe901400c03349f0" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ - "windows-core 0.60.1", - "windows-link", + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", ] [[package]] name = "windows-implement" -version = "0.59.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83577b051e2f49a058c308f17f273b570a6a758386fc291b5f6a934dd84e48c1" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", @@ -4346,9 +4223,9 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.59.0" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb26fd936d991781ea39e87c3a27285081e3c0da5ca0fcbc02d368cc6f52ff01" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", @@ -4357,18 +4234,24 @@ dependencies = [ [[package]] name = "windows-link" -version = "0.1.0" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-numerics" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "005dea54e2f6499f2cee279b8f703b3cf3b5734a2d8d21867c8f44003182eeed" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" dependencies = [ - "windows-core 0.60.1", - "windows-link", + "windows-core 0.61.2", + "windows-link 0.1.3", ] [[package]] @@ -4393,11 +4276,11 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06374efe858fab7e4f881500e6e86ec8bc28f9462c47e5a9941a0142ad86b189" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -4412,11 +4295,11 @@ dependencies = [ [[package]] name = "windows-strings" -version = "0.3.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -4455,6 +4338,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -4494,20 +4386,46 @@ 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", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + [[package]] name = "windows-version" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7bfbcc4996dd183ff1376a20ade1242da0d2dcaff83cc76710a588d24fd4c5db" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -4528,6 +4446,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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -4546,6 +4470,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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -4564,12 +4494,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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + [[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -4588,6 +4530,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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -4606,6 +4554,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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -4624,6 +4578,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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -4642,6 +4602,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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + [[package]] name = "winnow" version = "0.5.40" @@ -4653,9 +4619,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.3" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7f4ea97f6f78012141bcdb6a216b2609f0979ada50b20ca5b52dde2eac2bb1" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] @@ -4693,14 +4659,15 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "wry" -version = "0.50.4" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804a7d1613bd699beccaa60f3b3c679acee21cebba1945a693f5eab95c08d1fa" +checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" dependencies = [ "base64 0.22.1", "block2 0.6.0", "cookie", "crossbeam-channel", + "dirs", "dpi", "dunce", "gdkx11", @@ -4730,7 +4697,7 @@ dependencies = [ "webkit2gtk-sys", "webview2-com", "windows", - "windows-core 0.60.1", + "windows-core 0.61.2", "windows-version", "x11-dl", ] @@ -4821,12 +4788,6 @@ dependencies = [ "synstructure", ] -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" - [[package]] name = "zerovec" version = "0.10.4" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index ea1e0e4bb7..8a2d99f757 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -8,11 +8,11 @@ repository = "https://github.com/betaflight/betaflight-configurator" edition = "2024" [build-dependencies] -tauri-build = { version = "2.9.0", features = [] } +tauri-build = { version = "2.5", features = [] } [dependencies] -tauri = { version = "2.9.0", features = [] } -tauri-plugin-shell = "2.0.0" +tauri = { version = "2.5", features = [] } +tauri-plugin-shell = "2.3" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" diff --git a/yarn.lock b/yarn.lock index f8a3a8b601..bb8ac4ea22 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2183,7 +2183,7 @@ magic-string "^0.25.0" string.prototype.matchall "^4.0.6" -"@tauri-apps/api@^2.9.0": +"@tauri-apps/api@^2.5.0": version "2.9.0" resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-2.9.0.tgz#047fcbfec05a719b0cec997eee244cee453fb2fc" integrity sha512-qD5tMjh7utwBk9/5PrTA/aGr3i5QaJ/Mlt7p8NilQ45WgbifUNPyKWsA63iQ8YfQq6R8ajMapU+/Q8nMcPRLNw== @@ -2243,7 +2243,7 @@ resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.9.1.tgz#d7c8512dd70f9aa8203f2011322542ec11f76b66" integrity sha512-/JHlOzpUDhjBOO9w167bcYxfJbcMQv7ykS/Y07xjtcga8np0rzUzVGWYmLMH7orKcDMC7wjhheEW1x8cbGma/Q== -"@tauri-apps/cli@^2.9.1": +"@tauri-apps/cli@^2.5.0": version "2.9.1" resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-2.9.1.tgz#cdc1cc6a005fef017b2a8f1a96d32537afc74579" integrity sha512-kKi2/WWsNXKoMdatBl4xrT7e1Ce27JvsetBVfWuIb6D3ep/Y0WO5SIr70yarXOSWam8NyDur4ipzjZkg6m7VDg== From 03cac0867b346816e410213899189874a7a441be Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Fri, 24 Oct 2025 19:38:33 +0200 Subject: [PATCH 10/68] Fix shell open --- src-tauri/tauri.conf.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 36357f9bf0..bec5ac704e 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -32,9 +32,7 @@ }, "plugins": { "shell": { - "open": { - "allowlist": ["^https://.*"] - } + "open": true } } } From c92fa42355453a432e6d9ffc8a2d8f90c447d6c5 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Fri, 24 Oct 2025 19:43:22 +0200 Subject: [PATCH 11/68] Add android commands --- package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index d2b4d80ab1..eb1db82fe2 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,9 @@ "storybook": "start-storybook -p 6006", "prepare": "husky install", "tauri:dev": "tauri dev", - "tauri:build": "tauri build" + "tauri:build": "tauri build", + "tauri:android:dev": "tauri android dev", + "tauri:android:build": "tauri android build" }, "window": { "icon": "images/bf_icon_128.png", From 4853c588a04fb0f1c83c7824c7d292ae19f7698e Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Fri, 24 Oct 2025 19:58:19 +0200 Subject: [PATCH 12/68] Use yarn for docker --- DockerFile | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/DockerFile b/DockerFile index 07fe5d9e5c..3d86da2be1 100644 --- a/DockerFile +++ b/DockerFile @@ -43,10 +43,13 @@ RUN $CARGO_HOME/bin/rustup target add \ i686-linux-android \ x86_64-linux-android -# Install a Node.js runtime (e.g., Bun, or use Node/NPM if preferred) -# Replace this section with your preferred runtime installation (npm, yarn, pnpm) -RUN curl -fsSL https://bun.sh/install | bash -ENV PATH="/root/.bun/bin:$PATH" +# Install Node.js 22 LTS and Yarn (global) +# Use NodeSource for up-to-date Node on Debian; then install Yarn 1.x globally +RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \ + && apt-get update \ + && apt-get install -y --no-install-recommends nodejs \ + && npm i -g yarn@1.22.22 \ + && rm -rf /var/lib/apt/lists/* # --- Install Android SDK/NDK --- # Download the Android SDK command line tools From d77ffcd255fc3269d8205b369257adc6e2a042dc Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Fri, 24 Oct 2025 20:27:56 +0200 Subject: [PATCH 13/68] Use cargo --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index eb1db82fe2..cb9f26dc55 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,8 @@ "prepare": "husky install", "tauri:dev": "tauri dev", "tauri:build": "tauri build", - "tauri:android:dev": "tauri android dev", - "tauri:android:build": "tauri android build" + "tauri:dev:android": "cargo tauri android dev", + "tauri:build:android": "cargo tauri android build" }, "window": { "icon": "images/bf_icon_128.png", From 7522fcd7f3200231167aac969a5c932883660015 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Fri, 24 Oct 2025 21:59:50 +0200 Subject: [PATCH 14/68] Fix yarn tauri:android:dev --- android-env.sh | 45 +++++++++++++++++++++++ package.json | 4 +- src-tauri/Cargo.toml | 5 +++ src-tauri/src/lib.rs | 8 ++++ src/js/utils/checkBrowserCompatibility.js | 6 +-- 5 files changed, 63 insertions(+), 5 deletions(-) create mode 100755 android-env.sh create mode 100644 src-tauri/src/lib.rs diff --git a/android-env.sh b/android-env.sh new file mode 100755 index 0000000000..dfd667f7eb --- /dev/null +++ b/android-env.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +# Android SDK and NDK environment setup script for Tauri Android development + +# Set Android SDK path (adjust if your SDK is in a different location) +export ANDROID_HOME="$HOME/Android/Sdk" +export ANDROID_SDK_ROOT="$ANDROID_HOME" + +# Find the NDK version automatically (uses the first one found) +if [ -d "$ANDROID_HOME/ndk" ]; then + NDK_VERSION=$(ls -1 "$ANDROID_HOME/ndk" | head -n 1) + if [ -n "$NDK_VERSION" ]; then + export NDK_HOME="$ANDROID_HOME/ndk/$NDK_VERSION" + echo "Found NDK version: $NDK_VERSION" + else + echo "Warning: No NDK version found in $ANDROID_HOME/ndk" + echo "Please install NDK from Android Studio SDK Manager" + fi +else + echo "Warning: NDK directory not found at $ANDROID_HOME/ndk" + echo "Please install NDK from Android Studio SDK Manager" +fi + +# Add Android tools to PATH +export PATH="$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools" +if [ -n "$NDK_HOME" ]; then + export PATH="$PATH:$NDK_HOME" +fi + +# Verify the setup +echo "" +echo "Android environment variables set:" +echo "ANDROID_HOME=$ANDROID_HOME" +echo "ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT" +echo "NDK_HOME=$NDK_HOME" +echo "" + +# Check if SDK exists +if [ ! -d "$ANDROID_HOME" ]; then + echo "ERROR: Android SDK not found at $ANDROID_HOME" + echo "Please install Android SDK or update the ANDROID_HOME path in this script" + return 1 2>/dev/null || exit 1 +fi + +echo "Setup complete! You can now run: yarn tauri:dev:android" diff --git a/package.json b/package.json index cb9f26dc55..ea9608fbb9 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,8 @@ "prepare": "husky install", "tauri:dev": "tauri dev", "tauri:build": "tauri build", - "tauri:dev:android": "cargo tauri android dev", - "tauri:build:android": "cargo tauri android build" + "tauri:dev:android": "tauri android dev", + "tauri:build:android": "tauri android build" }, "window": { "icon": "images/bf_icon_128.png", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 8a2d99f757..5e9d2f47fb 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -7,6 +7,11 @@ license = "GPL-3.0" repository = "https://github.com/betaflight/betaflight-configurator" edition = "2024" +[lib] +name = "betaflight_app" +path = "src/lib.rs" +crate-type = ["staticlib", "cdylib"] + [build-dependencies] tauri-build = { version = "2.5", features = [] } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs new file mode 100644 index 0000000000..84ca3eba68 --- /dev/null +++ b/src-tauri/src/lib.rs @@ -0,0 +1,8 @@ +#[cfg(any(target_os = "android", target_os = "ios"))] +#[tauri::mobile_entry_point] +fn mobile_entry() { + tauri::Builder::default() + .plugin(tauri_plugin_shell::init()) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/src/js/utils/checkBrowserCompatibility.js b/src/js/utils/checkBrowserCompatibility.js index b3c6f3c6bd..5d41e966d7 100644 --- a/src/js/utils/checkBrowserCompatibility.js +++ b/src/js/utils/checkBrowserCompatibility.js @@ -88,9 +88,9 @@ export function checkBrowserCompatibility() { console.log("iOS: ", isIOS()); console.log("Capacitor web: ", isCapacitorWeb()); - if (compatible) { - return true; - } + // if (compatible) { + return true; + // } let errorMessage = ""; if (!isChromium) { From 35c46eb7cda00cde27431ee8749dfcbc4c15f968 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Fri, 24 Oct 2025 22:40:28 +0200 Subject: [PATCH 15/68] isTauri does not work with Android --- package.json | 4 ++++ src/js/utils/checkBrowserCompatibility.js | 15 +++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index ea9608fbb9..b5eca2d0de 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,10 @@ "android:run": "vite build && node capacitor.config.generator.mjs && npx cap run android", "android:sync": "vite build && node capacitor.config.generator.mjs && npx cap sync android", "android:release": "vite build && node capacitor.config.generator.mjs && npx cap build android --release", + "android:emu:list": "$ANDROID_HOME/emulator/emulator -list-avds", + "android:emu:check": "adb devices | grep -q emulator && echo 'Emulator running' || echo 'No emulator'", + "android:emu:start": "QT_QPA_PLATFORM=xcb $ANDROID_HOME/emulator/emulator -avd ${AVD:-Medium_Phone_API_35} -gpu swiftshader_indirect -no-snapshot-load &", + "android:emu:start:host": "QT_QPA_PLATFORM=xcb $ANDROID_HOME/emulator/emulator -avd ${AVD:-Medium_Phone_API_35} -gpu host -no-snapshot-load &", "format": "prettier --write {src,test}/**/*.{js,vue,css,less}", "storybook": "start-storybook -p 6006", "prepare": "husky install", diff --git a/src/js/utils/checkBrowserCompatibility.js b/src/js/utils/checkBrowserCompatibility.js index 5d41e966d7..6355cab033 100644 --- a/src/js/utils/checkBrowserCompatibility.js +++ b/src/js/utils/checkBrowserCompatibility.js @@ -1,4 +1,5 @@ import { Capacitor } from "@capacitor/core"; +import { isTauri } from "@tauri-apps/api/core"; // Detects OS using modern userAgentData API with fallback to legacy platform // Returns standardized OS name string or "unknown" @@ -60,17 +61,14 @@ export function isCapacitorWeb() { return false; } -export function isTauri() { - return "__TAURI_INTERNALS__" in window; -} - export function checkBrowserCompatibility() { const isWebSerial = checkWebSerialSupport(); const isWebBluetooth = checkWebBluetoothSupport(); const isWebUSB = checkWebUSBSupport(); const isChromium = isChromiumBrowser(); - const isNative = Capacitor.isNativePlatform() || isTauri(); + const tauriDetected = isTauri(); + const isNative = Capacitor.isNativePlatform() || tauriDetected; // Check if running in a test environment const isTestEnvironment = @@ -79,6 +77,7 @@ export function checkBrowserCompatibility() { const compatible = isTestEnvironment || isNative || (isChromium && (isWebSerial || isWebBluetooth || isWebUSB)); console.log("User Agent: ", navigator.userAgentData); + console.log("Tauri detected: ", tauriDetected); console.log("Native: ", isNative); console.log("Chromium: ", isChromium); console.log("Web Serial: ", isWebSerial); @@ -88,9 +87,9 @@ export function checkBrowserCompatibility() { console.log("iOS: ", isIOS()); console.log("Capacitor web: ", isCapacitorWeb()); - // if (compatible) { - return true; - // } + if (compatible) { + return true; + } let errorMessage = ""; if (!isChromium) { From a101a60f75a8c5b871400f0402b781dc69f2cfd8 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Fri, 24 Oct 2025 22:44:30 +0200 Subject: [PATCH 16/68] Update path for ADB --- ANDROID.md | 363 +++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 364 insertions(+), 1 deletion(-) create mode 100644 ANDROID.md diff --git a/ANDROID.md b/ANDROID.md new file mode 100644 index 0000000000..2a566bce27 --- /dev/null +++ b/ANDROID.md @@ -0,0 +1,363 @@ +# Android Development Guide + +This guide covers the complete setup and workflow for building and running the Betaflight Configurator on Android using Tauri. + +## Prerequisites + +### Required Software +- **Node.js**: v20.x (LTS) +- **Yarn**: v1.22.x +- **Android Studio**: Latest version (for SDK, NDK, and emulator) +- **Rust**: Latest stable version +- **Android SDK**: API Level 34+ +- **Android NDK**: Version 29.0.14033849 +- **Java**: JDK 17+ (bundled with Android Studio) + +### Android SDK Setup +1. Install Android Studio from [developer.android.com](https://developer.android.com/studio) +2. Open Android Studio → SDK Manager +3. Install: + - Android SDK Platform 34+ + - Android SDK Build-Tools 35.0.0 + - Android NDK 29.0.14033849 + - Android SDK Command-line Tools + - Android Emulator + +### Rust Targets +Install Android targets for Rust: +```bash +rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android +``` + +## Environment Configuration + +### 1. Create `android-env.sh` +Create this file in the project root: + +```bash +#!/bin/bash + +# Android SDK path (adjust if needed) +export ANDROID_HOME="$HOME/Android/Sdk" +export ANDROID_SDK_ROOT="$ANDROID_HOME" + +# Find the latest NDK version +NDK_VERSION=$(ls -1 "$ANDROID_HOME/ndk" 2>/dev/null | sort -V | tail -n 1) + +if [ -z "$NDK_VERSION" ]; then + echo "Error: No NDK found in $ANDROID_HOME/ndk" + exit 1 +fi + +export NDK_HOME="$ANDROID_HOME/ndk/$NDK_VERSION" + +echo "Found NDK version: $NDK_VERSION" +echo "" +echo "Android environment variables set:" +echo "ANDROID_HOME=$ANDROID_HOME" +echo "ANDROID_SDK_ROOT=$ANDROID_SDK_ROOT" +echo "NDK_HOME=$NDK_HOME" +echo "" +echo "Setup complete! You can now run: yarn tauri:dev:android" +``` + +Make it executable: +```bash +chmod +x android-env.sh +``` + +### 2. Add Android Tools to PATH +Add these lines to your `~/.bashrc` or `~/.zshrc`: +```bash +export PATH="$PATH:$HOME/Android/Sdk/platform-tools" +export PATH="$PATH:$HOME/Android/Sdk/emulator" +``` + +Then reload: +```bash +source ~/.bashrc # or source ~/.zshrc +``` + +### 3. Source Environment Variables +Before running any Android commands: +```bash +source ./android-env.sh +``` + +## Project Structure + +### Key Files +- **`src-tauri/Cargo.toml`**: Rust library configuration with mobile targets +- **`src-tauri/src/lib.rs`**: Mobile entry point with `#[tauri::mobile_entry_point]` +- **`src-tauri/src/main.rs`**: Desktop entry point +- **`src-tauri/tauri.conf.json`**: Tauri configuration (devUrl, frontendDist, capabilities) +- **`src-tauri/gen/android/`**: Generated Android project files +- **`dist/`**: Built frontend assets (must exist for build to succeed) + +### Important Configuration + +#### `src-tauri/Cargo.toml` +```toml +[lib] +name = "betaflight_app" +path = "src/lib.rs" +crate-type = ["staticlib", "cdylib", "rlib"] +``` + +#### `src-tauri/src/lib.rs` +```rust +#[cfg_attr(mobile, tauri::mobile_entry_point)] +pub fn run() { + tauri::Builder::default() + .plugin(tauri_plugin_shell::init()) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} +``` + +#### `src-tauri/tauri.conf.json` +```json +{ + "build": { + "devUrl": "http://localhost:8000", + "frontendDist": "../dist" + } +} +``` + +#### `src-tauri/gen/android/app/build.gradle.kts` +```kotlin +rust { + rootDirRel = "../../../../" // Important: points to project root for Yarn +} +``` + +## Android Emulator + +### List Available AVDs +```bash +yarn android:emu:list +``` + +### Check if Emulator is Running +```bash +yarn android:emu:check +``` + +### Start Emulator +Default emulator (Medium_Phone_API_35): +```bash +yarn android:emu:start +``` + +Custom AVD: +```bash +AVD=Your_Device_Name yarn android:emu:start +``` + +With host GPU acceleration (if supported): +```bash +yarn android:emu:start:host +``` + +### Emulator Troubleshooting (Linux/Wayland) + +If you encounter EGL or graphics errors: + +1. **Force X11 mode**: The scripts use `QT_QPA_PLATFORM=xcb` automatically +2. **SwiftShader fallback**: Default scripts use `-gpu swiftshader_indirect` +3. **Disable snapshots**: Scripts use `-no-snapshot-load` to avoid boot issues + +For persistent issues: +- Update Mesa drivers: `sudo apt install mesa-vulkan-drivers` +- Use host GPU: `yarn android:emu:start:host` +- Check AVD config in Android Studio → AVD Manager + +## Development Workflow + +### First-Time Setup +1. Install dependencies: + ```bash + yarn install + ``` + +2. Create dist directory placeholder: + ```bash + mkdir -p dist && touch dist/.gitkeep + ``` + +3. Source Android environment: + ```bash + source ./android-env.sh + ``` + +4. Start emulator: + ```bash + yarn android:emu:start + ``` + +5. Wait for emulator to fully boot (check with `adb devices`) + +### Development Mode + +#### Run Android Dev Build +```bash +source ./android-env.sh +yarn tauri:dev:android +``` + +This will: +1. Start Vite dev server at `http://localhost:8000` +2. Build Rust library for Android (x86_64 for emulator) +3. Compile Android APK +4. Install and launch on connected device/emulator + +#### Live Reload Setup +To enable hot module replacement on the emulator: + +1. Ensure Vite dev server is accessible: + ```bash + adb reverse tcp:8000 tcp:8000 + ``` + +2. The app should automatically connect to `http://localhost:8000` (devUrl) + +3. Make code changes in `src/` - Vite will hot-reload automatically + +#### Verify DevUrl Connectivity +Open Chrome on the emulator and navigate to `http://localhost:8000` to verify the dev server is accessible. + +### Production Build + +Build release APK: +```bash +source ./android-env.sh +yarn tauri:build:android +``` + +The APK will be in: `src-tauri/gen/android/app/build/outputs/apk/` + +## Common Issues & Solutions + +### Issue: "Couldn't find a package.json file in src-tauri" + +**Solution**: The Gradle `rootDirRel` is incorrect. Edit `src-tauri/gen/android/app/build.gradle.kts`: +```kotlin +rust { + rootDirRel = "../../../../" +} +``` + +### Issue: "No library targets found in package" + +**Solution**: Add library target to `src-tauri/Cargo.toml`: +```toml +[lib] +name = "betaflight_app" +crate-type = ["staticlib", "cdylib"] +``` + +And create `src-tauri/src/lib.rs` with mobile entry point. + +### Issue: "frontendDist path doesn't exist" + +**Solution**: Create the dist directory: +```bash +mkdir -p dist && touch dist/.gitkeep +``` + +### Issue: Code changes not reflected on Android + +**Causes**: +1. Emulator not connected to devUrl (missing `adb reverse`) +2. App loaded from packaged dist instead of dev server + +**Solutions**: +1. Run `adb reverse tcp:8000 tcp:8000` +2. Verify Vite is running at port 8000 +3. Check browser console in app for devUrl connection + +### Issue: Emulator hangs or EGL errors (Linux) + +**Solutions**: +1. Use provided emulator scripts (includes Qt/GPU fixes) +2. Force X11: `QT_QPA_PLATFORM=xcb` +3. Use SwiftShader: `-gpu swiftshader_indirect` +4. Update graphics drivers + +### Issue: "tauri android dev" waits indefinitely + +**Cause**: No emulator/device detected + +**Solutions**: +1. Start emulator first: `yarn android:emu:start` +2. Check devices: `adb devices` +3. Ensure emulator is fully booted (not just window open) + +### Issue: "adb: command not found" + +**Cause**: Android SDK platform-tools not in PATH + +**Solutions**: +1. Add to your shell profile (`~/.bashrc` or `~/.zshrc`): + ```bash + export PATH="$PATH:$HOME/Android/Sdk/platform-tools" + export PATH="$PATH:$HOME/Android/Sdk/emulator" + ``` +2. Reload: `source ~/.bashrc` +3. Verify: `which adb` should show the path + +## Available Scripts + +### Emulator Management +- `yarn android:emu:list` - List all AVDs +- `yarn android:emu:check` - Check if emulator is running +- `yarn android:emu:start` - Start emulator with SwiftShader +- `yarn android:emu:start:host` - Start with host GPU + +### Tauri Android +- `yarn tauri:dev:android` - Development build with hot reload +- `yarn tauri:build:android` - Production release build + +### Capacitor Android (Alternative) +- `yarn android:dev` - Capacitor dev build +- `yarn android:run` - Capacitor production build +- `yarn android:sync` - Sync web assets to Android +- `yarn android:open` - Open in Android Studio + +## Architecture Notes + +### Tauri Mobile vs Desktop +- **Desktop**: Uses `src-tauri/src/main.rs` directly +- **Mobile**: Uses `src-tauri/src/lib.rs` with `#[tauri::mobile_entry_point]` +- **Shared**: Both call the same `run()` function for consistency + +### Build Process +1. **BeforeDevCommand**: Runs `yarn dev` (Vite) +2. **Rust Compilation**: Builds lib for Android target (e.g., x86_64-linux-android) +3. **Gradle Build**: Invokes Yarn to run `tauri android android-studio-script` +4. **APK Assembly**: Packages Rust lib + assets into APK +5. **Installation**: ADB installs APK on device/emulator + +### DevUrl vs FrontendDist +- **DevUrl** (`http://localhost:8000`): Used in dev mode for hot reload +- **FrontendDist** (`../dist`): Used in production builds (packaged assets) +- **Fallback**: If devUrl unreachable, Tauri falls back to frontendDist + +## Additional Resources + +- [Tauri Mobile Docs](https://v2.tauri.app/develop/mobile/) +- [Android Developer Guide](https://developer.android.com/studio) +- [Rust Android Targets](https://doc.rust-lang.org/nightly/rustc/platform-support.html) + +## Contributing + +When making changes to Android configuration: +1. Test on both emulator and physical device +2. Verify both debug and release builds +3. Document any new environment requirements +4. Update this guide with new troubleshooting steps + +--- + +**Last Updated**: October 24, 2025 diff --git a/package.json b/package.json index b5eca2d0de..274630139a 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "android:sync": "vite build && node capacitor.config.generator.mjs && npx cap sync android", "android:release": "vite build && node capacitor.config.generator.mjs && npx cap build android --release", "android:emu:list": "$ANDROID_HOME/emulator/emulator -list-avds", - "android:emu:check": "adb devices | grep -q emulator && echo 'Emulator running' || echo 'No emulator'", + "android:emu:check": "$ANDROID_HOME/platform-tools/adb devices | grep -q emulator && echo 'Emulator running' || echo 'No emulator'", "android:emu:start": "QT_QPA_PLATFORM=xcb $ANDROID_HOME/emulator/emulator -avd ${AVD:-Medium_Phone_API_35} -gpu swiftshader_indirect -no-snapshot-load &", "android:emu:start:host": "QT_QPA_PLATFORM=xcb $ANDROID_HOME/emulator/emulator -avd ${AVD:-Medium_Phone_API_35} -gpu host -no-snapshot-load &", "format": "prettier --write {src,test}/**/*.{js,vue,css,less}", From 7f512d11e138371f1550380cf33583c8161494e8 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Fri, 24 Oct 2025 22:57:16 +0200 Subject: [PATCH 17/68] Use run-script-os --- package.json | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 274630139a..c3fa380021 100644 --- a/package.json +++ b/package.json @@ -20,16 +20,26 @@ "android:run": "vite build && node capacitor.config.generator.mjs && npx cap run android", "android:sync": "vite build && node capacitor.config.generator.mjs && npx cap sync android", "android:release": "vite build && node capacitor.config.generator.mjs && npx cap build android --release", - "android:emu:list": "$ANDROID_HOME/emulator/emulator -list-avds", - "android:emu:check": "$ANDROID_HOME/platform-tools/adb devices | grep -q emulator && echo 'Emulator running' || echo 'No emulator'", - "android:emu:start": "QT_QPA_PLATFORM=xcb $ANDROID_HOME/emulator/emulator -avd ${AVD:-Medium_Phone_API_35} -gpu swiftshader_indirect -no-snapshot-load &", - "android:emu:start:host": "QT_QPA_PLATFORM=xcb $ANDROID_HOME/emulator/emulator -avd ${AVD:-Medium_Phone_API_35} -gpu host -no-snapshot-load &", + "android:emu:list": "run-script-os", + "android:emu:list:win32": "%ANDROID_HOME%\\emulator\\emulator.exe -list-avds", + "android:emu:list:default": "$ANDROID_HOME/emulator/emulator -list-avds", + "android:emu:check": "run-script-os", + "android:emu:check:win32": "%ANDROID_HOME%\\platform-tools\\adb.exe devices", + "android:emu:check:default": "$ANDROID_HOME/platform-tools/adb devices | grep -q emulator && echo 'Emulator running' || echo 'No emulator'", + "android:emu:start": "run-script-os", + "android:emu:start:win32": "start \"\" \"%ANDROID_HOME%\\emulator\\emulator.exe\" -avd Medium_Phone_API_35 -gpu swiftshader_indirect -no-snapshot-load", + "android:emu:start:default": "QT_QPA_PLATFORM=xcb $ANDROID_HOME/emulator/emulator -avd ${AVD:-Medium_Phone_API_35} -gpu swiftshader_indirect -no-snapshot-load &", + "android:emu:start:host": "run-script-os", + "android:emu:start:host:win32": "start \"\" \"%ANDROID_HOME%\\emulator\\emulator.exe\" -avd Medium_Phone_API_35 -gpu host -no-snapshot-load", + "android:emu:start:host:default": "QT_QPA_PLATFORM=xcb $ANDROID_HOME/emulator/emulator -avd ${AVD:-Medium_Phone_API_35} -gpu host -no-snapshot-load &", "format": "prettier --write {src,test}/**/*.{js,vue,css,less}", "storybook": "start-storybook -p 6006", "prepare": "husky install", "tauri:dev": "tauri dev", "tauri:build": "tauri build", - "tauri:dev:android": "tauri android dev", + "tauri:dev:android": "run-script-os", + "tauri:dev:android:win32": "start \"\" \"%ANDROID_HOME%\\emulator\\emulator.exe\" -avd Medium_Phone_API_35 -gpu swiftshader_indirect -no-snapshot-load && tauri android dev", + "tauri:dev:android:default": "yarn android:emu:start && tauri android dev", "tauri:build:android": "tauri android build" }, "window": { From 387e73e963a00b6c58c0166b12d2d257960f8bdb Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Fri, 24 Oct 2025 23:31:44 +0200 Subject: [PATCH 18/68] Fix HMR on android --- ANDROID.md | 10 +++++ package.json | 11 +++++- src/js/utils/checkBrowserCompatibility.js | 45 +++++++++++++++++++++++ vite.config.js | 9 +++++ 4 files changed, 73 insertions(+), 2 deletions(-) diff --git a/ANDROID.md b/ANDROID.md index 2a566bce27..40d18a1e64 100644 --- a/ANDROID.md +++ b/ANDROID.md @@ -212,6 +212,16 @@ This will: 3. Compile Android APK 4. Install and launch on connected device/emulator +Note: Dev mode does not rebuild the `dist/` folder. Tauri will load from `devUrl` during `tauri android dev` and falls back to `dist/` only if the dev server is unreachable. If you need a fresh fallback, build the web assets first: +```bash +yarn build +yarn tauri:dev:android +``` +Alternatively, use the convenience script to build dist then run dev: +```bash +yarn tauri:dev:android:with-dist +``` + #### Live Reload Setup To enable hot module replacement on the emulator: diff --git a/package.json b/package.json index c3fa380021..f20dfe0d10 100644 --- a/package.json +++ b/package.json @@ -32,14 +32,21 @@ "android:emu:start:host": "run-script-os", "android:emu:start:host:win32": "start \"\" \"%ANDROID_HOME%\\emulator\\emulator.exe\" -avd Medium_Phone_API_35 -gpu host -no-snapshot-load", "android:emu:start:host:default": "QT_QPA_PLATFORM=xcb $ANDROID_HOME/emulator/emulator -avd ${AVD:-Medium_Phone_API_35} -gpu host -no-snapshot-load &", + "android:adb:wait": "run-script-os", + "android:adb:wait:win32": "%ANDROID_HOME%\\platform-tools\\adb.exe wait-for-device", + "android:adb:wait:default": "$ANDROID_HOME/platform-tools/adb wait-for-device && until $ANDROID_HOME/platform-tools/adb shell getprop sys.boot_completed 2>/dev/null | grep -q 1; do sleep 1; done", + "android:adb:reverse": "run-script-os", + "android:adb:reverse:win32": "%ANDROID_HOME%\\platform-tools\\adb.exe reverse tcp:8000 tcp:8000", + "android:adb:reverse:default": "$ANDROID_HOME/platform-tools/adb reverse tcp:8000 tcp:8000", "format": "prettier --write {src,test}/**/*.{js,vue,css,less}", "storybook": "start-storybook -p 6006", "prepare": "husky install", "tauri:dev": "tauri dev", "tauri:build": "tauri build", "tauri:dev:android": "run-script-os", - "tauri:dev:android:win32": "start \"\" \"%ANDROID_HOME%\\emulator\\emulator.exe\" -avd Medium_Phone_API_35 -gpu swiftshader_indirect -no-snapshot-load && tauri android dev", - "tauri:dev:android:default": "yarn android:emu:start && tauri android dev", + "tauri:dev:android:win32": "start \"\" \"%ANDROID_HOME%\\emulator\\emulator.exe\" -avd Medium_Phone_API_35 -gpu swiftshader_indirect -no-snapshot-load && %ANDROID_HOME%\\platform-tools\\adb.exe wait-for-device && %ANDROID_HOME%\\platform-tools\\adb.exe reverse tcp:8000 tcp:8000 && tauri android dev", + "tauri:dev:android:default": "yarn android:emu:start && yarn android:adb:wait && yarn android:adb:reverse && tauri android dev", + "tauri:dev:android:with-dist": "yarn build && yarn tauri:dev:android", "tauri:build:android": "tauri android build" }, "window": { diff --git a/src/js/utils/checkBrowserCompatibility.js b/src/js/utils/checkBrowserCompatibility.js index 6355cab033..edf22c9d62 100644 --- a/src/js/utils/checkBrowserCompatibility.js +++ b/src/js/utils/checkBrowserCompatibility.js @@ -1,6 +1,51 @@ import { Capacitor } from "@capacitor/core"; import { isTauri } from "@tauri-apps/api/core"; +// In dev on Android/WebView, a previously installed service worker can cache assets +// and prevent hot updates from Vite. Proactively unregister all SW and clear caches +// when running in dev or in a native (Capacitor/Tauri) context. +async function disableServiceWorkersForDev() { + try { + const isDev = (() => { + try { + return !!(import.meta && import.meta.env && import.meta.env.DEV); + } catch (_) { + return false; + } + })(); + const isNative = Capacitor?.isNativePlatform?.() === true; + if ((isDev || isNative) && typeof navigator !== "undefined" && "serviceWorker" in navigator) { + const regs = await navigator.serviceWorker.getRegistrations(); + for (const r of regs) { + try { + await r.unregister(); + } catch (_) {} + } + if (typeof caches !== "undefined" && caches?.keys) { + const keys = await caches.keys(); + for (const k of keys) { + try { + await caches.delete(k); + } catch (_) {} + } + } + // Also attempt to stop active controller + if (navigator.serviceWorker.controller) { + try { + navigator.serviceWorker.controller.postMessage({ type: "SKIP_WAITING" }); + } catch (_) {} + } + // Small delay to ensure SW is cleared before app logic proceeds + await new Promise((res) => setTimeout(res, 50)); + } + } catch (_) { + // best-effort; ignore + } +} + +// Fire and forget; we don't block app init +// disableServiceWorkersForDev(); + // Detects OS using modern userAgentData API with fallback to legacy platform // Returns standardized OS name string or "unknown" export function getOS() { diff --git a/vite.config.js b/vite.config.js index 1cd3d57ed9..c6e1b4ca1e 100644 --- a/vite.config.js +++ b/vite.config.js @@ -86,6 +86,9 @@ export default defineConfig({ }), VitePWA({ registerType: "prompt", + devOptions: { + enabled: false, + }, workbox: { globPatterns: ["**/*.{js,css,html,ico,png,svg,json,mcm}"], // 5MB @@ -123,6 +126,12 @@ export default defineConfig({ server: { port: 8000, strictPort: true, + host: true, + hmr: { + protocol: "ws", + host: "localhost", + clientPort: 8000, + }, }, preview: { port: 8080, From 2405e8c35af111a5a0a0f056a507426335b9bf3b Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Fri, 24 Oct 2025 23:40:57 +0200 Subject: [PATCH 19/68] Remove redundant alias --- vite.config.js | 1 - 1 file changed, 1 deletion(-) diff --git a/vite.config.js b/vite.config.js index c6e1b4ca1e..1c13565a5a 100644 --- a/vite.config.js +++ b/vite.config.js @@ -120,7 +120,6 @@ export default defineConfig({ alias: { "/src": path.resolve(process.cwd(), "src"), vue: path.resolve(__dirname, "node_modules/vue/dist/vue.esm-bundler.js"), - "@": resolve(__dirname, "src"), }, }, server: { From f9d0229b47eda62dc691d3a941b8876a29e90ff1 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Fri, 24 Oct 2025 23:44:59 +0200 Subject: [PATCH 20/68] Avoid device offline races --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index f20dfe0d10..721ae672af 100644 --- a/package.json +++ b/package.json @@ -43,9 +43,9 @@ "prepare": "husky install", "tauri:dev": "tauri dev", "tauri:build": "tauri build", - "tauri:dev:android": "run-script-os", - "tauri:dev:android:win32": "start \"\" \"%ANDROID_HOME%\\emulator\\emulator.exe\" -avd Medium_Phone_API_35 -gpu swiftshader_indirect -no-snapshot-load && %ANDROID_HOME%\\platform-tools\\adb.exe wait-for-device && %ANDROID_HOME%\\platform-tools\\adb.exe reverse tcp:8000 tcp:8000 && tauri android dev", - "tauri:dev:android:default": "yarn android:emu:start && yarn android:adb:wait && yarn android:adb:reverse && tauri android dev", + "tauri:dev:android": "run-script-os", + "tauri:dev:android:win32": "yarn android:emu:start && yarn android:adb:wait && yarn android:adb:reverse && tauri android dev", + "tauri:dev:android:default": "yarn android:emu:start && yarn android:adb:wait && yarn android:adb:reverse && tauri android dev", "tauri:dev:android:with-dist": "yarn build && yarn tauri:dev:android", "tauri:build:android": "tauri android build" }, From e5cbca7a580a352b3f84bc7084e3cce145caed72 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Fri, 24 Oct 2025 23:46:45 +0200 Subject: [PATCH 21/68] =?UTF-8?q?=F0=9F=91=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 721ae672af..f34b941956 100644 --- a/package.json +++ b/package.json @@ -43,9 +43,9 @@ "prepare": "husky install", "tauri:dev": "tauri dev", "tauri:build": "tauri build", - "tauri:dev:android": "run-script-os", - "tauri:dev:android:win32": "yarn android:emu:start && yarn android:adb:wait && yarn android:adb:reverse && tauri android dev", - "tauri:dev:android:default": "yarn android:emu:start && yarn android:adb:wait && yarn android:adb:reverse && tauri android dev", + "tauri:dev:android": "run-script-os", + "tauri:dev:android:win32": "yarn android:emu:start && yarn android:adb:wait && yarn android:adb:reverse && tauri android dev", + "tauri:dev:android:default": "yarn android:emu:start && yarn android:adb:wait && yarn android:adb:reverse && tauri android dev", "tauri:dev:android:with-dist": "yarn build && yarn tauri:dev:android", "tauri:build:android": "tauri android build" }, From 9b4b089da37eab0d21ce661056bb8c7ff1ac4388 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sat, 25 Oct 2025 00:06:19 +0200 Subject: [PATCH 22/68] add equivalent boot completion check to Windows version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f34b941956..54adc2fca4 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "android:emu:start:host:win32": "start \"\" \"%ANDROID_HOME%\\emulator\\emulator.exe\" -avd Medium_Phone_API_35 -gpu host -no-snapshot-load", "android:emu:start:host:default": "QT_QPA_PLATFORM=xcb $ANDROID_HOME/emulator/emulator -avd ${AVD:-Medium_Phone_API_35} -gpu host -no-snapshot-load &", "android:adb:wait": "run-script-os", - "android:adb:wait:win32": "%ANDROID_HOME%\\platform-tools\\adb.exe wait-for-device", + "android:adb:wait:win32": "%ANDROID_HOME%\\platform-tools\\adb.exe wait-for-device && %ANDROID_HOME%\\platform-tools\\adb.exe shell \"while [ $(getprop sys.boot_completed) != 1 ]; do sleep 1; done\"", "android:adb:wait:default": "$ANDROID_HOME/platform-tools/adb wait-for-device && until $ANDROID_HOME/platform-tools/adb shell getprop sys.boot_completed 2>/dev/null | grep -q 1; do sleep 1; done", "android:adb:reverse": "run-script-os", "android:adb:reverse:win32": "%ANDROID_HOME%\\platform-tools\\adb.exe reverse tcp:8000 tcp:8000", From 033ed2da858abb70536de0bde29ff989bcdcf14a Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sat, 25 Oct 2025 00:13:47 +0200 Subject: [PATCH 23/68] Fix sonar --- android-env.sh | 12 +++--- src/js/utils/checkBrowserCompatibility.js | 45 ----------------------- 2 files changed, 6 insertions(+), 51 deletions(-) diff --git a/android-env.sh b/android-env.sh index dfd667f7eb..669859f04d 100755 --- a/android-env.sh +++ b/android-env.sh @@ -7,9 +7,9 @@ export ANDROID_HOME="$HOME/Android/Sdk" export ANDROID_SDK_ROOT="$ANDROID_HOME" # Find the NDK version automatically (uses the first one found) -if [ -d "$ANDROID_HOME/ndk" ]; then +if [[ -d "$ANDROID_HOME/ndk" ]]; then NDK_VERSION=$(ls -1 "$ANDROID_HOME/ndk" | head -n 1) - if [ -n "$NDK_VERSION" ]; then + if [[ -n "$NDK_VERSION" ]]; then export NDK_HOME="$ANDROID_HOME/ndk/$NDK_VERSION" echo "Found NDK version: $NDK_VERSION" else @@ -23,7 +23,7 @@ fi # Add Android tools to PATH export PATH="$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools" -if [ -n "$NDK_HOME" ]; then +if [[ -n "$NDK_HOME" ]]; then export PATH="$PATH:$NDK_HOME" fi @@ -36,9 +36,9 @@ echo "NDK_HOME=$NDK_HOME" echo "" # Check if SDK exists -if [ ! -d "$ANDROID_HOME" ]; then - echo "ERROR: Android SDK not found at $ANDROID_HOME" - echo "Please install Android SDK or update the ANDROID_HOME path in this script" +if [[ ! -d "$ANDROID_HOME" ]]; then + echo "ERROR: Android SDK not found at $ANDROID_HOME" >&2 + echo "Please install Android SDK or update the ANDROID_HOME path in this script" >&2 return 1 2>/dev/null || exit 1 fi diff --git a/src/js/utils/checkBrowserCompatibility.js b/src/js/utils/checkBrowserCompatibility.js index edf22c9d62..6355cab033 100644 --- a/src/js/utils/checkBrowserCompatibility.js +++ b/src/js/utils/checkBrowserCompatibility.js @@ -1,51 +1,6 @@ import { Capacitor } from "@capacitor/core"; import { isTauri } from "@tauri-apps/api/core"; -// In dev on Android/WebView, a previously installed service worker can cache assets -// and prevent hot updates from Vite. Proactively unregister all SW and clear caches -// when running in dev or in a native (Capacitor/Tauri) context. -async function disableServiceWorkersForDev() { - try { - const isDev = (() => { - try { - return !!(import.meta && import.meta.env && import.meta.env.DEV); - } catch (_) { - return false; - } - })(); - const isNative = Capacitor?.isNativePlatform?.() === true; - if ((isDev || isNative) && typeof navigator !== "undefined" && "serviceWorker" in navigator) { - const regs = await navigator.serviceWorker.getRegistrations(); - for (const r of regs) { - try { - await r.unregister(); - } catch (_) {} - } - if (typeof caches !== "undefined" && caches?.keys) { - const keys = await caches.keys(); - for (const k of keys) { - try { - await caches.delete(k); - } catch (_) {} - } - } - // Also attempt to stop active controller - if (navigator.serviceWorker.controller) { - try { - navigator.serviceWorker.controller.postMessage({ type: "SKIP_WAITING" }); - } catch (_) {} - } - // Small delay to ensure SW is cleared before app logic proceeds - await new Promise((res) => setTimeout(res, 50)); - } - } catch (_) { - // best-effort; ignore - } -} - -// Fire and forget; we don't block app init -// disableServiceWorkersForDev(); - // Detects OS using modern userAgentData API with fallback to legacy platform // Returns standardized OS name string or "unknown" export function getOS() { From f11154a5883f64f2937ac535bc7c908a917283e2 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sat, 25 Oct 2025 00:26:30 +0200 Subject: [PATCH 24/68] Nitpicks --- android-env.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/android-env.sh b/android-env.sh index 669859f04d..05dea962b7 100755 --- a/android-env.sh +++ b/android-env.sh @@ -2,13 +2,13 @@ # Android SDK and NDK environment setup script for Tauri Android development -# Set Android SDK path (adjust if your SDK is in a different location) -export ANDROID_HOME="$HOME/Android/Sdk" +# Set Android SDK path +export ANDROID_HOME="${ANDROID_SDK_HOME:-$HOME/Android/Sdk}" export ANDROID_SDK_ROOT="$ANDROID_HOME" # Find the NDK version automatically (uses the first one found) if [[ -d "$ANDROID_HOME/ndk" ]]; then - NDK_VERSION=$(ls -1 "$ANDROID_HOME/ndk" | head -n 1) + NDK_VERSION=$(ls -1 "$ANDROID_HOME/ndk" | sort -V | tail -n 1) # Pick highest version if [[ -n "$NDK_VERSION" ]]; then export NDK_HOME="$ANDROID_HOME/ndk/$NDK_VERSION" echo "Found NDK version: $NDK_VERSION" From 456d03b748be34704cc87db9870163c62d4eef04 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sat, 25 Oct 2025 03:35:48 +0200 Subject: [PATCH 25/68] Added support for tauriserial --- eslint.config.js | 15 ++++- package.json | 2 +- src-tauri/Cargo.lock | 96 ++++++++++++++++++++++++++++- src-tauri/Cargo.toml | 1 + src-tauri/capabilities/default.json | 3 +- src-tauri/src/lib.rs | 1 + src-tauri/src/main.rs | 1 + src/js/port_handler.js | 32 +++++++--- src/js/serial.js | 84 +++++++++++++++---------- 9 files changed, 193 insertions(+), 42 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index 2e79cce7c4..00cdfa743d 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -47,13 +47,26 @@ export default defineConfig([ }, ], }, - ignores: ["dist/", "*.json", "*.html", "*.less", "*.css", "package.json"], + ignores: [ + "dist/", + "src/dist/", + "**/dist/**", + "**/src/dist/**", + "*.json", + "*.html", + "*.less", + "*.css", + "package.json", + ], }, { files: ["**/*.vue"], languageOptions: { parser: vueParser, }, + plugins: { + vue: vuePlugin, + }, processor: "vue/vue", }, ]); diff --git a/package.json b/package.json index 54adc2fca4..25266157cc 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "@capacitor/core": "^7.0.1", "@fortawesome/fontawesome-free": "^6.5.2", "@tauri-apps/api": "^2.5.0", - "@tauri-apps/cli": "^2.5.0", + "@tauri-apps/cli": "^2.5.0", "@vitejs/plugin-vue": "^6.0.1", "crypto-es": "^2.1.0", "d3": "^7.9.0", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index ba94d513b6..4e486d2950 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -126,6 +126,7 @@ dependencies = [ "serde_json", "tauri", "tauri-build", + "tauri-plugin-serialplugin", "tauri-plugin-shell", ] @@ -579,7 +580,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -1492,6 +1493,16 @@ dependencies = [ "cfb", ] +[[package]] +name = "io-kit-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617ee6cf8e3f66f3b4ea67a4058564628cde41901316e19f559e14c7c72c5e7b" +dependencies = [ + "core-foundation-sys", + "mach2", +] + [[package]] name = "ipnet" version = "2.11.0" @@ -1679,6 +1690,26 @@ dependencies = [ "libc", ] +[[package]] +name = "libudev" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b324152da65df7bb95acfcaab55e3097ceaab02fb19b228a9eb74d55f135e0" +dependencies = [ + "libc", + "libudev-sys", +] + +[[package]] +name = "libudev-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" +dependencies = [ + "libc", + "pkg-config", +] + [[package]] name = "litemap" version = "0.7.5" @@ -1707,6 +1738,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" +[[package]] +name = "mach2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44" +dependencies = [ + "libc", +] + [[package]] name = "markup5ever" version = "0.14.1" @@ -1837,6 +1877,17 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + [[package]] name = "nodrop" version = "0.1.14" @@ -2917,6 +2968,26 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "serialport" +version = "4.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21f60a586160667241d7702c420fc223939fb3c0bb8d3fac84f78768e8970dee" +dependencies = [ + "bitflags 2.9.0", + "cfg-if", + "core-foundation", + "core-foundation-sys", + "io-kit-sys", + "libudev", + "mach2", + "nix", + "quote", + "scopeguard", + "unescaper", + "windows-sys 0.52.0", +] + [[package]] name = "servo_arc" version = "0.2.0" @@ -3336,6 +3407,20 @@ dependencies = [ "walkdir", ] +[[package]] +name = "tauri-plugin-serialplugin" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99a23ab6d07a643246533ac7ada2921a8d7a858c3245913019ef56d3f4093761" +dependencies = [ + "serde", + "serde_json", + "serialport", + "tauri", + "tauri-plugin", + "thiserror 2.0.12", +] + [[package]] name = "tauri-plugin-shell" version = "2.3.1" @@ -3758,6 +3843,15 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +[[package]] +name = "unescaper" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c01d12e3a56a4432a8b436f293c25f4808bdf9e9f9f98f9260bba1f1bc5a1f26" +dependencies = [ + "thiserror 2.0.12", +] + [[package]] name = "unic-char-property" version = "0.9.0" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 5e9d2f47fb..6f2b9f35e7 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -18,6 +18,7 @@ tauri-build = { version = "2.5", features = [] } [dependencies] tauri = { version = "2.5", features = [] } tauri-plugin-shell = "2.3" +tauri-plugin-serialplugin = "2.11" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index 6951536ce8..48ac37456c 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -5,6 +5,7 @@ "windows": ["*"], "permissions": [ "core:default", - "shell:allow-open" + "shell:allow-open", + "serialplugin:default" ] } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 84ca3eba68..2b96bfbe2c 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -3,6 +3,7 @@ fn mobile_entry() { tauri::Builder::default() .plugin(tauri_plugin_shell::init()) + .plugin(tauri_plugin_serialplugin::init()) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index c5f7db999d..d8d7b7d9a0 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -6,6 +6,7 @@ fn main() { tauri::Builder::default() .plugin(tauri_plugin_shell::init()) + .plugin(tauri_plugin_serialplugin::init()) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/src/js/port_handler.js b/src/js/port_handler.js index 3665bce13b..c3335bf841 100644 --- a/src/js/port_handler.js +++ b/src/js/port_handler.js @@ -3,6 +3,7 @@ import { EventBus } from "../components/eventBus"; import { serial } from "./serial.js"; import WEBUSBDFU from "./protocols/webusbdfu"; import { reactive } from "vue"; +import { isTauri } from "@tauri-apps/api/core"; import { checkBrowserCompatibility, checkWebBluetoothSupport, @@ -37,7 +38,8 @@ const PortHandler = new (function () { checkBrowserCompatibility(); this.showBluetoothOption = checkWebBluetoothSupport(); - this.showSerialOption = checkWebSerialSupport(); + // In Tauri, native serial is available via plugin even if Web Serial API isn't. + this.showSerialOption = checkWebSerialSupport() || isTauri(); this.showUsbOption = checkWebUSBSupport(); console.log(`${this.logHead} Bluetooth available: ${this.showBluetoothOption}`); @@ -47,23 +49,30 @@ const PortHandler = new (function () { this.showVirtualMode = getConfig("showVirtualMode", false).showVirtualMode; this.showManualMode = getConfig("showManualMode", false).showManualMode; this.showAllSerialDevices = getConfig("showAllSerialDevices", false).showAllSerialDevices; + // Decide which serial protocol to prefer at runtime + this.serialProtocol = isTauri() ? "tauriserial" : "webserial"; + console.log(`${this.logHead} ### Using serial protocol: ${this.serialProtocol}`); })(); PortHandler.initialize = function () { EventBus.$on("ports-input:request-permission-bluetooth", () => this.requestDevicePermission("webbluetooth")); - EventBus.$on("ports-input:request-permission-serial", () => this.requestDevicePermission("webserial")); + EventBus.$on("ports-input:request-permission-serial", () => this.requestDevicePermission(this.serialProtocol)); EventBus.$on("ports-input:request-permission-usb", () => this.requestDevicePermission("usb")); EventBus.$on("ports-input:change", this.onChangeSelectedPort.bind(this)); // Use serial for all protocol events serial.addEventListener("addedDevice", (event) => { const detail = event.detail; + const proto = (detail?.protocolType || "").toLowerCase(); - if (detail?.path?.startsWith("bluetooth")) { + if (detail?.path?.startsWith("bluetooth") || proto === "webbluetooth") { this.handleDeviceAdded(detail, "webbluetooth"); + } else if (proto === "tauriserial") { + this.handleDeviceAdded(detail, "tauriserial"); } else { this.handleDeviceAdded(detail, "webserial"); } + console.log(`${this.logHead} #### Device addition event received:`, event.detail, proto); }); serial.addEventListener("removedDevice", (event) => { @@ -81,7 +90,7 @@ PortHandler.initialize = function () { PortHandler.refreshAllDeviceLists = async function () { // Update all device lists in parallel return Promise.all([ - this.updateDeviceList("webserial"), + this.updateDeviceList(this.serialProtocol), this.updateDeviceList("webbluetooth"), this.updateDeviceList("usb"), ]).then(() => { @@ -108,11 +117,12 @@ PortHandler.removedSerialDevice = function (device) { // Get device path safely const devicePath = device?.path || (typeof device === "string" ? device : null); + const proto = (device?.protocolType || "").toLowerCase(); if (!devicePath) { console.warn(`${this.logHead} Device removal event missing path information`, device); // Still update ports, but don't try to use the undefined path - this.updateDeviceList("webserial").then(() => { + this.updateDeviceList(this.serialProtocol).then(() => { this.selectActivePort(); }); return; @@ -121,7 +131,7 @@ PortHandler.removedSerialDevice = function (device) { // Update the appropriate ports list based on the device type const updatePromise = devicePath.startsWith("bluetooth") ? this.updateDeviceList("webbluetooth") - : this.updateDeviceList("webserial"); + : this.updateDeviceList(proto === "tauriserial" ? "tauriserial" : "webserial"); const wasSelectedPort = this.portPicker.selectedPort === devicePath; @@ -274,7 +284,9 @@ PortHandler.handleDeviceAdded = function (device, deviceType) { // Update the appropriate device list const updatePromise = - deviceType === "webbluetooth" ? this.updateDeviceList("webbluetooth") : this.updateDeviceList("webserial"); + deviceType === "webbluetooth" + ? this.updateDeviceList("webbluetooth") + : this.updateDeviceList(deviceType === "tauriserial" ? "tauriserial" : "webserial"); updatePromise.then(() => { const selectedPort = this.selectActivePort(device); @@ -310,6 +322,11 @@ PortHandler.updateDeviceList = async function (deviceType) { ports = await serial.getDevices("webserial"); } break; + case "tauriserial": + if (this.showSerialOption) { + ports = await serial.getDevices("tauriserial"); + } + break; default: console.warn(`${this.logHead} Unknown device type: ${deviceType}`); return []; @@ -331,6 +348,7 @@ PortHandler.updateDeviceList = async function (deviceType) { console.log(`${this.logHead} Found DFU port(s)`, orderedPorts); break; case "webserial": + case "tauriserial": this.portAvailable = orderedPorts.length > 0; this.currentSerialPorts = [...orderedPorts]; console.log(`${this.logHead} Found serial port(s)`, orderedPorts); diff --git a/src/js/serial.js b/src/js/serial.js index d9a1a57047..b555fd9ce6 100644 --- a/src/js/serial.js +++ b/src/js/serial.js @@ -2,6 +2,7 @@ import WebSerial from "./protocols/WebSerial.js"; import WebBluetooth from "./protocols/WebBluetooth.js"; import Websocket from "./protocols/WebSocket.js"; import VirtualSerial from "./protocols/VirtualSerial.js"; +import { isTauri } from "@tauri-apps/api/core"; /** * Base Serial class that manages all protocol implementations @@ -23,8 +24,22 @@ class Serial extends EventTarget { { name: "virtual", instance: new VirtualSerial() }, ]; - // Forward events from all protocols to the Serial class + // Forward events from current protocols this._setupEventForwarding(); + + // Dynamically include the native Tauri serial adapter so web builds don't try to resolve it. + if (isTauri) { + import("./protocols/TauriSerial.js") + .then(({ default: TauriSerial }) => { + const inst = new TauriSerial(); + this._protocols.unshift({ name: "tauriserial", instance: inst }); + // Wire event forwarding for this late-added protocol + this._setupEventForwardingFor("tauriserial", inst); + }) + .catch((err) => { + console.warn(`${this.logHead} Failed to load TauriSerial adapter:`, err); + }); + } } /** @@ -34,35 +49,39 @@ class Serial extends EventTarget { const events = ["addedDevice", "removedDevice", "connect", "disconnect", "receive"]; for (const { name, instance } of this._protocols) { - if (typeof instance?.addEventListener === "function") { - for (const eventType of events) { - instance.addEventListener(eventType, (event) => { - let newDetail; - if (event.type === "receive") { - // For 'receive' events, we need to handle the data differently - newDetail = { - data: event.detail, - protocolType: name, - }; - } else { - // For other events, we can use the detail directly - newDetail = { - ...event.detail, - protocolType: name, - }; - } - - // Dispatch the event with the new detail - this.dispatchEvent( - new CustomEvent(event.type, { - detail: newDetail, - bubbles: event.bubbles, - cancelable: event.cancelable, - }), - ); - }); + this._setupEventForwardingFor(name, instance, events); + } + } + + _setupEventForwardingFor( + name, + instance, + events = ["addedDevice", "removedDevice", "connect", "disconnect", "receive"], + ) { + if (typeof instance?.addEventListener !== "function") return; + for (const eventType of events) { + instance.addEventListener(eventType, (event) => { + let newDetail; + if (event.type === "receive") { + newDetail = { + data: event.detail, + protocolType: name, + }; + } else { + newDetail = { + ...event.detail, + protocolType: name, + }; } - } + + this.dispatchEvent( + new CustomEvent(event.type, { + detail: newDetail, + bubbles: event.bubbles, + cancelable: event.cancelable, + }), + ); + }); } } @@ -74,7 +93,7 @@ class Serial extends EventTarget { // Determine which protocol to use based on port path const isFn = typeof portPath === "function"; const s = typeof portPath === "string" ? portPath : ""; - // Default to webserial for typical serial device identifiers. + // Default to native Tauri serial when available; otherwise Web Serial. if (isFn || s === "virtual") { return this._protocols.find((p) => p.name === "virtual")?.instance; } @@ -84,6 +103,9 @@ class Serial extends EventTarget { if (s.startsWith("bluetooth")) { return this._protocols.find((p) => p.name === "webbluetooth")?.instance; } + // Prefer Tauri plugin if present + const tauriInst = this._protocols.find((p) => p.name === "tauriserial")?.instance; + if (tauriInst) return tauriInst; return this._protocols.find((p) => p.name === "webserial")?.instance; } @@ -141,7 +163,7 @@ class Serial extends EventTarget { /** * Get devices from a specific protocol type or current protocol - * @param {string} protocolType - Optional protocol type ('webserial', 'webbluetooth', 'websocket', 'virtual') + * @param {string} protocolType - Optional protocol type ('tauriserial','webserial','webbluetooth','websocket','virtual') * @returns {Promise} - List of devices */ async getDevices(protocolType = null) { From 0fa40344bac6d71b7114a07f4cb766e782d107c9 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sat, 25 Oct 2025 03:36:54 +0200 Subject: [PATCH 26/68] Added support for tauriserial II --- src/js/protocols/TauriSerial.js | 343 ++++++++++++++++++++++++++++++++ 1 file changed, 343 insertions(+) create mode 100644 src/js/protocols/TauriSerial.js diff --git a/src/js/protocols/TauriSerial.js b/src/js/protocols/TauriSerial.js new file mode 100644 index 0000000000..aa67903eaf --- /dev/null +++ b/src/js/protocols/TauriSerial.js @@ -0,0 +1,343 @@ +import { invoke } from "@tauri-apps/api/core"; +import { serialDevices, vendorIdNames } from "./devices"; + +const logHead = "[TAURI SERIAL]"; + +/** + * Async generator that polls the serial port for incoming data + * Similar to streamAsyncIterable in WebSerial but uses polling instead of streams + */ +async function* pollSerialData(path, keepReadingFlag) { + try { + while (keepReadingFlag()) { + try { + // Non-blocking read with short timeout + const result = await invoke("plugin:serialplugin|read_binary", { + path, + size: 256, + timeout: 10, + }); + + if (result && result.length > 0) { + yield new Uint8Array(result); + } + + // Small delay between polls to avoid overwhelming the system + await new Promise((resolve) => setTimeout(resolve, 5)); + } catch (error) { + // Timeout is expected when no data available + if (!error.toString().includes("no data received")) { + console.warn(`${logHead} Poll error:`, error); + } + // Continue polling + await new Promise((resolve) => setTimeout(resolve, 5)); + } + } + } finally { + console.log(`${logHead} Polling stopped for ${path}`); + } +} + +/** + * TauriSerial protocol implementation using tauri-plugin-serialplugin + */ +class TauriSerial extends EventTarget { + constructor() { + super(); + + this.connected = false; + this.openRequested = false; + this.openCanceled = false; + this.closeRequested = false; + this.transmitting = false; + this.connectionInfo = null; + + this.bitrate = 0; + this.bytesSent = 0; + this.bytesReceived = 0; + this.failed = 0; + + this.ports = []; + this.connectionId = null; + this.reading = false; + + this.connect = this.connect.bind(this); + this.disconnect = this.disconnect.bind(this); + this.handleReceiveBytes = this.handleReceiveBytes.bind(this); + + // Detect if running on macOS with AT32 (needs batch writes) + this.isNeedBatchWrite = false; + + this.loadDevices(); + } + + handleReceiveBytes(info) { + this.bytesReceived += info.detail.byteLength; + } + + getConnectedPort() { + return this.connectionId; + } + + async loadDevices() { + try { + const portsMap = await invoke("plugin:serialplugin|available_ports"); + + // Convert the object map to array + const allPorts = Object.entries(portsMap).map(([path, info]) => { + // The plugin returns vid/pid as decimal strings like "1155", "22336" + let vendorId = undefined; + let productId = undefined; + + if (info.vid) { + vendorId = typeof info.vid === "number" ? info.vid : parseInt(info.vid, 10); + } + if (info.pid) { + productId = typeof info.pid === "number" ? info.pid : parseInt(info.pid, 10); + } + + return { + path, + displayName: this.getDisplayName(path, vendorId, productId), + vendorId, + productId, + serialNumber: info.serial_number, + }; + }); + + // Filter to only known devices + this.ports = allPorts.filter((port) => { + // Only include ports with known vendor IDs (Betaflight-compatible devices) + if (!port.vendorId || !port.productId) { + return false; + } + // Check if this device is in our known devices list + return serialDevices.some((d) => d.vendorId === port.vendorId && d.productId === port.productId); + }); + + console.log(`${logHead} Found ${this.ports.length} serial ports (filtered from ${allPorts.length})`); + return this.ports; + } catch (error) { + console.error(`${logHead} Error loading devices:`, error); + return []; + } + } + + getDisplayName(path, vendorId, productId) { + let displayName = path; + + if (vendorId && productId) { + // Use vendor name if available, otherwise show as hex + const vendorName = vendorIdNames[vendorId] || `VID:${vendorId} PID:${productId}`; + displayName = `Betaflight ${vendorName}`; + } + + return displayName; + } + + async connect(path, options) { + if (this.openRequested) { + console.log(`${logHead} Connection already requested`); + return false; + } + + this.openRequested = true; + + try { + const openOptions = { + path, + baudRate: options.baudRate || 115200, + }; + + console.log(`${logHead} Opening port ${path} at ${openOptions.baudRate} baud`); + + // Open the port + const openResult = await invoke("plugin:serialplugin|open", openOptions); + console.log(`${logHead} Open result:`, openResult); + + // Set a reasonable timeout for read/write operations (100ms) + try { + await invoke("plugin:serialplugin|set_timeout", { + path, + timeout: 100, + }); + } catch (e) { + console.debug(`${logHead} Could not set timeout:`, e); + } + + // Connection successful + this.connected = true; + this.connectionId = path; + this.bitrate = openOptions.baudRate; + this.openRequested = false; + + this.connectionInfo = { + connectionId: path, + bitrate: this.bitrate, + }; + + this.addEventListener("receive", this.handleReceiveBytes); + + // Start reading + this.reading = true; + this.readLoop(); + + this.dispatchEvent(new CustomEvent("connect", { detail: true })); + console.log(`${logHead} Connected to ${path}`); + return true; + } catch (error) { + console.error(`${logHead} Error connecting:`, error); + this.openRequested = false; + this.dispatchEvent(new CustomEvent("connect", { detail: false })); + return false; + } + } + + async readLoop() { + try { + for await (let value of pollSerialData(this.connectionId, () => this.reading)) { + this.dispatchEvent(new CustomEvent("receive", { detail: value })); + } + } catch (error) { + console.error(`${logHead} Error in read loop:`, error); + if (this.connected) { + this.disconnect(); + } + } + } + + async send(data, callback) { + if (!this.connected) { + console.error(`${logHead} Cannot send: port not connected`); + const res = { bytesSent: 0 }; + callback?.(res); + return res; + } + + try { + // Convert data to Uint8Array + let dataArray; + if (data instanceof ArrayBuffer) { + dataArray = new Uint8Array(data); + } else if (data instanceof Uint8Array) { + dataArray = data; + } else if (Array.isArray(data)) { + dataArray = new Uint8Array(data); + } else { + console.error(`${logHead} Unsupported data type:`, data?.constructor?.name); + const res = { bytesSent: 0 }; + callback?.(res); + return res; + } + + this.transmitting = true; + + const writeChunk = async (chunk) => { + await invoke("plugin:serialplugin|write_binary", { + path: this.connectionId, + value: Array.from(chunk), + }); + }; + + if (this.isNeedBatchWrite) { + // Batch write for macOS AT32 compatibility + const batchSize = 63; + for (let offset = 0; offset < dataArray.length; offset += batchSize) { + const chunk = dataArray.slice(offset, offset + batchSize); + await writeChunk(chunk); + } + } else { + await writeChunk(dataArray); + } + + this.transmitting = false; + this.bytesSent += dataArray.length; + + const res = { bytesSent: dataArray.length }; + callback?.(res); + return res; + } catch (error) { + console.error(`${logHead} Error sending data:`, error); + this.transmitting = false; + const res = { bytesSent: 0 }; + callback?.(res); + return res; + } + } + + async disconnect() { + if (!this.connected) { + return true; + } + + // Mark as disconnected immediately + this.connected = false; + this.transmitting = false; + this.reading = false; + + if (this.closeRequested) { + return true; + } + + this.closeRequested = true; + + try { + this.removeEventListener("receive", this.handleReceiveBytes); + + // Small delay to allow read loop to notice state change + await new Promise((resolve) => setTimeout(resolve, 50)); + + // Close the port + if (this.connectionId) { + try { + await invoke("plugin:serialplugin|close", { path: this.connectionId }); + console.log(`${logHead} Port closed`); + } catch (error) { + console.warn(`${logHead} Error closing port:`, error); + } + } + + this.connectionId = null; + this.bitrate = 0; + this.connectionInfo = null; + this.closeRequested = false; + + this.dispatchEvent(new CustomEvent("disconnect", { detail: true })); + return true; + } catch (error) { + console.error(`${logHead} Error disconnecting:`, error); + this.closeRequested = false; + this.dispatchEvent(new CustomEvent("disconnect", { detail: false })); + return false; + } finally { + if (this.openCanceled) { + this.openCanceled = false; + } + } + } + + async getDevices() { + await this.loadDevices(); + return this.ports; + } + + removePort(path) { + const removed = this.ports.find((p) => p.path === path); + this.ports = this.ports.filter((p) => p.path !== path); + if (removed) { + this.dispatchEvent(new CustomEvent("removedDevice", { detail: removed })); + } + } + + addPort(path) { + // Reload devices to get updated port info + this.loadDevices().then(() => { + const added = this.ports.find((p) => p.path === path); + if (added) { + this.dispatchEvent(new CustomEvent("addedDevice", { detail: added })); + } + }); + } +} + +export default TauriSerial; From a34720e3a75ec5a130660a7c09ccfb9256df01c5 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sat, 25 Oct 2025 19:34:27 +0200 Subject: [PATCH 27/68] Update DOCKER.md --- DOCKER.md | 212 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 DOCKER.md diff --git a/DOCKER.md b/DOCKER.md new file mode 100644 index 0000000000..d1173112bd --- /dev/null +++ b/DOCKER.md @@ -0,0 +1,212 @@ +# Docker: Dev/Build Environment for Betaflight Configurator (Tauri) + +This document explains how to build and run a containerized environment for web, desktop (Tauri), and Android builds using the `DockerFile` in this folder. + +Note: The Dockerfile has not been fully validated end-to-end yet. Treat this as a starting point; please report gaps and update after the first successful build. + +## Prerequisites: Install Docker + +- Linux (Ubuntu/Debian): + - Follow the official guide: https://docs.docker.com/engine/install/ + - After install, add your user to the docker group so you can run without sudo, then re-login: + - `sudo usermod -aG docker "$USER" && newgrp docker` +- macOS: + - Install Docker Desktop: https://docs.docker.com/desktop/setup/mac/ +- Windows 10/11: + - Install Docker Desktop (WSL 2 backend strongly recommended): https://docs.docker.com/desktop/setup/windows/ + +Verify installation: + +```bash +docker --version +docker info +``` + +## What’s in the image + +Base: Debian 12 (bookworm-slim) + +The Dockerfile installs: + +- Toolchains + - Rust (stable via rustup) + Android Rust targets: aarch64, armv7, i686, x86_64 + - OpenJDK 17 (for Android builds) + - Node.js 22 (via NodeSource) + Yarn 1.x (1.22.22) + - System deps for Tauri (GTK/WebKit etc.): `libwebkit2gtk-4.1-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev libxdo-dev` + - Build essentials: `clang llvm g++-multilib build-essential git` and more +- Android SDK components + - Command line tools (latest) + - Platform tools + - Android platform 34 + - Build tools 34.0.0 + - NDK 26.3.11579204 +- Environment + - ANDROID_SDK_ROOT=/usr/local/android-sdk + - NDK_HOME=/usr/local/android-sdk/ndk/26.3.11579204 + - PATH includes Android cmdline-tools, Cargo, etc. +- Non-root user + - `developer` user, working directory `/app`, entrypoint `/bin/bash` + +## Build the image + +Run from the repository root so the Docker context includes all needed files: + +```bash +docker build -t bf-configurator:dev -f tauri/betaflight-configurator/DockerFile . +``` + +Optional: cache SDK and toolchains across runs using named volumes (recommended): + +```bash +docker volume create android-sdk + +docker build -t bf-configurator:dev -f tauri/betaflight-configurator/DockerFile . +``` + +## Start a dev shell in the container + +Mount the repo and (optionally) caches. This drops you into `/app` as the `developer` user. + +```bash +docker run --rm -it \ + -v "$PWD":/app \ + -v android-sdk:/usr/local/android-sdk \ + bf-configurator:dev +``` + +If you plan to build repeatedly, you can also persist Rust and Cargo caches: + +```bash +docker volume create rustup-cache + +docker volume create cargo-cache + +docker run --rm -it \ + -v "$PWD":/app \ + -v android-sdk:/usr/local/android-sdk \ + -v rustup-cache:/usr/local/rustup \ + -v cargo-cache:/usr/local/cargo \ + bf-configurator:dev +``` + +## Project layout in the container + +- Repo is mounted at `/app` +- Project folder for Tauri: `/app/tauri/betaflight-configurator` + +Change into it before running yarn/tauri commands: + +```bash +cd /app/tauri/betaflight-configurator +``` + +## Web build (Vite) + +```bash +yarn install +# Development server (not exposed unless you map ports) +yarn dev +# Production build +yarn build +``` + +To access the dev server from host, run the container with port mapping, e.g. `-p 5173:5173`, and include `--host 0.0.0.0` when starting the dev server. + +## Desktop (Tauri) build + +```bash +yarn install +# Build the web assets first +yarn build +# Build the Tauri app (Linux artifacts inside src-tauri/target) +yarn tauri:build +``` + +Notes: +- The image includes WebKit/GTK dependencies commonly required by Tauri on Linux. +- If additional runtime libraries are needed by your distro, adjust the Dockerfile accordingly. + +## Android build (Capacitor + Tauri Android CLI) + +Environment variables are already prepared (ANDROID_SDK_ROOT, NDK_HOME). Typical flows: + +Build release APK/AAB (without launching emulator): + +```bash +yarn install +yarn build +# Sync/android build via Capacitor (release) +yarn android:release +# or build via Tauri Android +# This uses tauri-cli scripts and expects Android SDK/NDK already in place +yarn tauri:build:android +``` + +Running an Android emulator inside a container is possible but not recommended (GPU, X11/Wayland, KVM). Prefer using an emulator or device on the host, then use ADB over TCP/IP or USB passthrough. + +### Using ADB with a USB device (optional, Linux only) + +```bash +docker run --rm -it \ + --privileged \ + -v /dev/bus/usb:/dev/bus/usb \ + -v "$PWD":/app \ + -v android-sdk:/usr/local/android-sdk \ + bf-configurator:dev + +# inside the container +$ANDROID_SDK_ROOT/platform-tools/adb devices +``` + +Alternatively, expose ADB over TCP/IP from the host/emulator and connect from inside the container. + +## Gradle 9 — do we need to install it? + +- This project uses the Gradle Wrapper located under `android/gradle/wrapper/gradle-wrapper.properties`. +- Current wrapper version: `gradle-8.10.2` (as pinned by `distributionUrl`). +- The Docker image does not install a global Gradle; you don’t need it. The wrapper will download the correct Gradle version automatically. + +If you specifically want Gradle 9: + +- Update the wrapper to a Gradle 9.x distribution (only if your Android Gradle Plugin and build are compatible): + +```bash +# inside the container or on your host (JDK 17+) +cd tauri/betaflight-configurator/android +./gradlew wrapper --gradle-version 9.0 --distribution-type all +# commit the updated gradle/wrapper files +``` + +- Then rebuild. If issues arise, revert to the pinned version or update AGP accordingly. + +Recommendation: keep using the wrapper as-is (8.10.2) unless you have a specific need and have validated plugin compatibility. + +## Common pitfalls and tips + +- Node version: The image uses Node 22; `package.json` engines specify Node 20.x. This may produce warnings. If you hit issues, switch the Dockerfile to Node 20.x or set Yarn to ignore engines: + +```bash +yarn config set ignore-engines true +``` + +- Caching: Use the named volumes above to avoid re-downloading SDKs and toolchains every run. +- Permissions: Files created by the `developer` user inside the container will be owned by your host user if your UID/GID differs. Adjust with `--user` if needed. +- Not tested yet: Treat this as a baseline. Please update this doc after first successful Android and desktop builds. + +## Quick start recap + +```bash +# 1) Build image from repo root +docker build -t bf-configurator:dev -f tauri/betaflight-configurator/DockerFile . + +# 2) Start a shell with caches and repo mounted +docker run --rm -it -v "$PWD":/app -v android-sdk:/usr/local/android-sdk bf-configurator:dev + +# 3) Inside the container +cd /app/tauri/betaflight-configurator +yarn install +yarn build # web assets +yarn tauri:build # desktop app +# or +yarn tauri:build:android # Android build +``` From 7a0c83ac482aa093d357ebc9e7e7194e978a396c Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sat, 25 Oct 2025 20:23:43 +0200 Subject: [PATCH 28/68] Update --- DOCKER.MD | 44 ----------------------------- src-tauri/Cargo.toml | 7 +++-- src-tauri/capabilities/default.json | 1 + src-tauri/src/lib.rs | 1 - src-tauri/src/main.rs | 12 ++++++-- 5 files changed, 15 insertions(+), 50 deletions(-) delete mode 100644 DOCKER.MD diff --git a/DOCKER.MD b/DOCKER.MD deleted file mode 100644 index d040ecc3e4..0000000000 --- a/DOCKER.MD +++ /dev/null @@ -1,44 +0,0 @@ -# 🐳 Development Environment with Docker - -To ensure all developers use a consistent environment, especially for cross-platform compilation (Rust, Node.js, Android SDK/NDK), we provide a Dockerfile. - -## 1. Build the Docker Image - -Build the container image from the Dockerfile in the project root. This process will download all system dependencies, the Rust toolchain, and the Android SDK/NDK. - -```bash - docker build -t betaflight-tauri-dev . -``` - -## 2. Run the Development Container - -Run the image and mount your local project directory into the container's /app directory. This allows you to work on your code locally while running all build commands inside the isolated Docker environment. - -```bash - docker run -it --rm \ - -v $(pwd):/app \ - --name betaflight-dev-container \ - betaflight-tauri-dev - - -it: Runs the container in interactive mode with a TTY (shell access). - - --rm: Automatically removes the container when you exit. - - -v $(pwd):/app: Mounts your current directory (the project root) to the /app working directory in the container. -``` - -## 3. Execute Build/Dev Commands - -Once inside the container's terminal, you can run any of the Tauri commands without needing to worry about local prerequisites. - -Command | Purpose ---- | --- -bun install | Installs the frontend dependencies. -bun tauri dev | Runs the desktop development server. -bun tauri android dev | Runs the app on a connected Android device or emulator (must be running outside of the container). -bun tauri android build | Builds a release APK for Android. - -You may need to start an Android emulator on your host machine before running bun tauri android dev. - -You can watch this video for a practical demonstration of setting up a dev container for Tauri and Android development. -https://www.youtube.com/watch?v=X3EThnruPA4 diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 6f2b9f35e7..17d9006fbe 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -16,12 +16,15 @@ crate-type = ["staticlib", "cdylib"] tauri-build = { version = "2.5", features = [] } [dependencies] -tauri = { version = "2.5", features = [] } +tauri = { version = "2.9", features = [] } tauri-plugin-shell = "2.3" -tauri-plugin-serialplugin = "2.11" +# Allow newer serial plugin releases (2.21+) which may include Android fixes serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" +[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies] +tauri-plugin-serialplugin = "2.21" + [features] default = ["custom-protocol"] custom-protocol = ["tauri/custom-protocol"] diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index 48ac37456c..daf29bb683 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -2,6 +2,7 @@ "$schema": "../gen/schemas/desktop-schema.json", "identifier": "default", "description": "Default capability for all windows, allows core and shell open permissions.", + "platforms": ["linux", "windows", "macOS"], "windows": ["*"], "permissions": [ "core:default", diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 2b96bfbe2c..84ca3eba68 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -3,7 +3,6 @@ fn mobile_entry() { tauri::Builder::default() .plugin(tauri_plugin_shell::init()) - .plugin(tauri_plugin_serialplugin::init()) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index d8d7b7d9a0..2c6af296d5 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -4,9 +4,15 @@ )] fn main() { - tauri::Builder::default() - .plugin(tauri_plugin_shell::init()) - .plugin(tauri_plugin_serialplugin::init()) + let mut builder = tauri::Builder::default() + .plugin(tauri_plugin_shell::init()); + + #[cfg(not(any(target_os = "android", target_os = "ios")))] + { + builder = builder.plugin(tauri_plugin_serialplugin::init()); + } + + builder .run(tauri::generate_context!()) .expect("error while running tauri application"); } From b202a7a03aa7bde0bdd0c0fae1950824581ef9d7 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sat, 25 Oct 2025 22:28:14 +0200 Subject: [PATCH 29/68] Fix broken pipe, reconnect, unplug --- src/js/protocols/TauriSerial.js | 136 +++++++++++++++++++++++++++++--- 1 file changed, 124 insertions(+), 12 deletions(-) diff --git a/src/js/protocols/TauriSerial.js b/src/js/protocols/TauriSerial.js index aa67903eaf..1dd1d0835e 100644 --- a/src/js/protocols/TauriSerial.js +++ b/src/js/protocols/TauriSerial.js @@ -3,6 +3,14 @@ import { serialDevices, vendorIdNames } from "./devices"; const logHead = "[TAURI SERIAL]"; +/** + * Detects Broken pipe/EPIPE errors across platforms. + */ +function isBrokenPipeError(error) { + const s = typeof error === "string" ? error : error?.message || (error?.toString ? error.toString() : "") || ""; + return /broken pipe|EPIPE|os error 32|code:\s*32/i.test(s); +} + /** * Async generator that polls the serial port for incoming data * Similar to streamAsyncIterable in WebSerial but uses polling instead of streams @@ -25,10 +33,18 @@ async function* pollSerialData(path, keepReadingFlag) { // Small delay between polls to avoid overwhelming the system await new Promise((resolve) => setTimeout(resolve, 5)); } catch (error) { + const msg = error?.message || (error?.toString ? error.toString() : ""); // Timeout is expected when no data available - if (!error.toString().includes("no data received")) { - console.warn(`${logHead} Poll error:`, error); + if (msg && msg.toLowerCase().includes("no data received")) { + // Continue polling + await new Promise((resolve) => setTimeout(resolve, 5)); + continue; } + if (isBrokenPipeError(msg)) { + console.error(`${logHead} Fatal poll error (broken pipe) on ${path}:`, error); + throw error; + } + console.warn(`${logHead} Poll error:`, error); // Continue polling await new Promise((resolve) => setTimeout(resolve, 5)); } @@ -68,7 +84,12 @@ class TauriSerial extends EventTarget { // Detect if running on macOS with AT32 (needs batch writes) this.isNeedBatchWrite = false; + // Device monitoring + this.monitoringDevices = false; + this.deviceMonitorInterval = null; + this.loadDevices(); + this.startDeviceMonitoring(); } handleReceiveBytes(info) { @@ -79,6 +100,99 @@ class TauriSerial extends EventTarget { return this.connectionId; } + handleFatalSerialError(error) { + // On fatal errors (broken pipe, etc.), just disconnect cleanly + // Device monitoring will automatically detect the removal and emit removedDevice + if (this.connected) { + this.disconnect(); + } + } + + startDeviceMonitoring() { + if (this.monitoringDevices) { + return; + } + + this.monitoringDevices = true; + // Check for device changes every 1 second + this.deviceMonitorInterval = setInterval(async () => { + await this.checkDeviceChanges(); + }, 1000); + + console.log(`${logHead} Device monitoring started`); + } + + stopDeviceMonitoring() { + if (this.deviceMonitorInterval) { + clearInterval(this.deviceMonitorInterval); + this.deviceMonitorInterval = null; + } + this.monitoringDevices = false; + console.log(`${logHead} Device monitoring stopped`); + } + + async checkDeviceChanges() { + try { + const portsMap = await invoke("plugin:serialplugin|available_ports"); + + // Convert to our format + const allPorts = Object.entries(portsMap).map(([path, info]) => { + let vendorId = undefined; + let productId = undefined; + + if (info.vid) { + vendorId = typeof info.vid === "number" ? info.vid : parseInt(info.vid, 10); + } + if (info.pid) { + productId = typeof info.pid === "number" ? info.pid : parseInt(info.pid, 10); + } + + return { + path, + displayName: this.getDisplayName(path, vendorId, productId), + vendorId, + productId, + serialNumber: info.serial_number, + }; + }); + + // Filter to only known devices + const currentPorts = allPorts.filter((port) => { + if (!port.vendorId || !port.productId) { + return false; + } + return serialDevices.some((d) => d.vendorId === port.vendorId && d.productId === port.productId); + }); + + // Check for removed devices + const removedPorts = this.ports.filter( + (oldPort) => !currentPorts.find((newPort) => newPort.path === oldPort.path), + ); + + // Check for added devices + const addedPorts = currentPorts.filter( + (newPort) => !this.ports.find((oldPort) => oldPort.path === newPort.path), + ); + + // Emit events for removed devices + for (const removed of removedPorts) { + this.dispatchEvent(new CustomEvent("removedDevice", { detail: removed })); + console.log(`${logHead} Device removed: ${removed.path}`); + } + + // Emit events for added devices + for (const added of addedPorts) { + this.dispatchEvent(new CustomEvent("addedDevice", { detail: added })); + console.log(`${logHead} Device added: ${added.path}`); + } + + // Update our ports list + this.ports = currentPorts; + } catch (error) { + console.warn(`${logHead} Error checking device changes:`, error); + } + } + async loadDevices() { try { const portsMap = await invoke("plugin:serialplugin|available_ports"); @@ -200,9 +314,7 @@ class TauriSerial extends EventTarget { } } catch (error) { console.error(`${logHead} Error in read loop:`, error); - if (this.connected) { - this.disconnect(); - } + this.handleFatalSerialError(error); } } @@ -259,6 +371,10 @@ class TauriSerial extends EventTarget { } catch (error) { console.error(`${logHead} Error sending data:`, error); this.transmitting = false; + if (isBrokenPipeError(error)) { + // Treat as device removal to trigger reconnect flow + this.handleFatalSerialError(error); + } const res = { bytesSent: 0 }; callback?.(res); return res; @@ -329,14 +445,10 @@ class TauriSerial extends EventTarget { } } + // Deprecated: addPort is no longer needed since monitoring handles this addPort(path) { - // Reload devices to get updated port info - this.loadDevices().then(() => { - const added = this.ports.find((p) => p.path === path); - if (added) { - this.dispatchEvent(new CustomEvent("addedDevice", { detail: added })); - } - }); + // Device monitoring will automatically detect and emit addedDevice + console.log(`${logHead} addPort called for ${path}, monitoring will handle detection`); } } From 8f425c376c808e8e2881610b9d8a9ed15142749b Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sat, 25 Oct 2025 22:57:47 +0200 Subject: [PATCH 30/68] Fix some sonar issues --- src/js/port_handler.js | 12 ++--- src/js/protocols/TauriSerial.js | 84 ++++++++++++++------------------- src/js/serial.js | 36 +++++++++----- 3 files changed, 66 insertions(+), 66 deletions(-) diff --git a/src/js/port_handler.js b/src/js/port_handler.js index c3335bf841..e7a5ae12f8 100644 --- a/src/js/port_handler.js +++ b/src/js/port_handler.js @@ -63,16 +63,16 @@ PortHandler.initialize = function () { // Use serial for all protocol events serial.addEventListener("addedDevice", (event) => { const detail = event.detail; - const proto = (detail?.protocolType || "").toLowerCase(); + const protocol = (detail?.protocolType || "").toLowerCase(); - if (detail?.path?.startsWith("bluetooth") || proto === "webbluetooth") { + if (detail?.path?.startsWith("bluetooth") || protocol === "webbluetooth") { this.handleDeviceAdded(detail, "webbluetooth"); - } else if (proto === "tauriserial") { + } else if (protocol === "tauriserial") { this.handleDeviceAdded(detail, "tauriserial"); } else { this.handleDeviceAdded(detail, "webserial"); } - console.log(`${this.logHead} #### Device addition event received:`, event.detail, proto); + console.log(`${this.logHead} #### Device addition event received:`, event.detail, protocol); }); serial.addEventListener("removedDevice", (event) => { @@ -117,7 +117,7 @@ PortHandler.removedSerialDevice = function (device) { // Get device path safely const devicePath = device?.path || (typeof device === "string" ? device : null); - const proto = (device?.protocolType || "").toLowerCase(); + const protocol = (device?.protocolType || "").toLowerCase(); if (!devicePath) { console.warn(`${this.logHead} Device removal event missing path information`, device); @@ -131,7 +131,7 @@ PortHandler.removedSerialDevice = function (device) { // Update the appropriate ports list based on the device type const updatePromise = devicePath.startsWith("bluetooth") ? this.updateDeviceList("webbluetooth") - : this.updateDeviceList(proto === "tauriserial" ? "tauriserial" : "webserial"); + : this.updateDeviceList(protocol === "tauriserial" ? "tauriserial" : "webserial"); const wasSelectedPort = this.portPicker.selectedPort === devicePath; diff --git a/src/js/protocols/TauriSerial.js b/src/js/protocols/TauriSerial.js index 1dd1d0835e..bb51ca1f1b 100644 --- a/src/js/protocols/TauriSerial.js +++ b/src/js/protocols/TauriSerial.js @@ -11,48 +11,7 @@ function isBrokenPipeError(error) { return /broken pipe|EPIPE|os error 32|code:\s*32/i.test(s); } -/** - * Async generator that polls the serial port for incoming data - * Similar to streamAsyncIterable in WebSerial but uses polling instead of streams - */ -async function* pollSerialData(path, keepReadingFlag) { - try { - while (keepReadingFlag()) { - try { - // Non-blocking read with short timeout - const result = await invoke("plugin:serialplugin|read_binary", { - path, - size: 256, - timeout: 10, - }); - - if (result && result.length > 0) { - yield new Uint8Array(result); - } - - // Small delay between polls to avoid overwhelming the system - await new Promise((resolve) => setTimeout(resolve, 5)); - } catch (error) { - const msg = error?.message || (error?.toString ? error.toString() : ""); - // Timeout is expected when no data available - if (msg && msg.toLowerCase().includes("no data received")) { - // Continue polling - await new Promise((resolve) => setTimeout(resolve, 5)); - continue; - } - if (isBrokenPipeError(msg)) { - console.error(`${logHead} Fatal poll error (broken pipe) on ${path}:`, error); - throw error; - } - console.warn(`${logHead} Poll error:`, error); - // Continue polling - await new Promise((resolve) => setTimeout(resolve, 5)); - } - } - } finally { - console.log(`${logHead} Polling stopped for ${path}`); - } -} +// Note: We avoid async generator + for-await-of to improve compatibility in some runtimes. /** * TauriSerial protocol implementation using tauri-plugin-serialplugin @@ -141,10 +100,10 @@ class TauriSerial extends EventTarget { let productId = undefined; if (info.vid) { - vendorId = typeof info.vid === "number" ? info.vid : parseInt(info.vid, 10); + vendorId = typeof info.vid === "number" ? info.vid : Number.parseInt(info.vid, 10); } if (info.pid) { - productId = typeof info.pid === "number" ? info.pid : parseInt(info.pid, 10); + productId = typeof info.pid === "number" ? info.pid : Number.parseInt(info.pid, 10); } return { @@ -204,10 +163,10 @@ class TauriSerial extends EventTarget { let productId = undefined; if (info.vid) { - vendorId = typeof info.vid === "number" ? info.vid : parseInt(info.vid, 10); + vendorId = typeof info.vid === "number" ? info.vid : Number.parseInt(info.vid, 10); } if (info.pid) { - productId = typeof info.pid === "number" ? info.pid : parseInt(info.pid, 10); + productId = typeof info.pid === "number" ? info.pid : Number.parseInt(info.pid, 10); } return { @@ -309,12 +268,41 @@ class TauriSerial extends EventTarget { async readLoop() { try { - for await (let value of pollSerialData(this.connectionId, () => this.reading)) { - this.dispatchEvent(new CustomEvent("receive", { detail: value })); + while (this.reading) { + try { + // Non-blocking read with short timeout + const result = await invoke("plugin:serialplugin|read_binary", { + path: this.connectionId, + size: 256, + timeout: 10, + }); + + if (result && result.length > 0) { + this.dispatchEvent(new CustomEvent("receive", { detail: new Uint8Array(result) })); + } + + // Small delay between polls to avoid overwhelming the system + await new Promise((resolve) => setTimeout(resolve, 5)); + } catch (error) { + const msg = error?.message || (error?.toString ? error.toString() : ""); + // Timeout is expected when no data available + if (msg && msg.toLowerCase().includes("no data received")) { + await new Promise((resolve) => setTimeout(resolve, 5)); + continue; + } + if (isBrokenPipeError(msg)) { + console.error(`${logHead} Fatal poll error (broken pipe) on ${this.connectionId}:`, error); + throw error; + } + console.warn(`${logHead} Poll error:`, error); + await new Promise((resolve) => setTimeout(resolve, 5)); + } } } catch (error) { console.error(`${logHead} Error in read loop:`, error); this.handleFatalSerialError(error); + } finally { + console.log(`${logHead} Polling stopped for ${this.connectionId || ""}`); } } diff --git a/src/js/serial.js b/src/js/serial.js index b555fd9ce6..eea4627643 100644 --- a/src/js/serial.js +++ b/src/js/serial.js @@ -26,19 +26,24 @@ class Serial extends EventTarget { // Forward events from current protocols this._setupEventForwarding(); + } + /** + * Perform any asynchronous initialization required by the Serial facade. + * This keeps constructors synchronous and predictable. + */ + async init() { // Dynamically include the native Tauri serial adapter so web builds don't try to resolve it. if (isTauri) { - import("./protocols/TauriSerial.js") - .then(({ default: TauriSerial }) => { - const inst = new TauriSerial(); - this._protocols.unshift({ name: "tauriserial", instance: inst }); - // Wire event forwarding for this late-added protocol - this._setupEventForwardingFor("tauriserial", inst); - }) - .catch((err) => { - console.warn(`${this.logHead} Failed to load TauriSerial adapter:`, err); - }); + try { + const { default: TauriSerial } = await import("./protocols/TauriSerial.js"); + const inst = new TauriSerial(); + this._protocols.unshift({ name: "tauriserial", instance: inst }); + // Wire event forwarding for this late-added protocol + this._setupEventForwardingFor("tauriserial", inst); + } catch (err) { + console.warn(`${this.logHead} Failed to load TauriSerial adapter:`, err); + } } } @@ -58,7 +63,9 @@ class Serial extends EventTarget { instance, events = ["addedDevice", "removedDevice", "connect", "disconnect", "receive"], ) { - if (typeof instance?.addEventListener !== "function") return; + if (typeof instance?.addEventListener !== "function") { + return; + } for (const eventType of events) { instance.addEventListener(eventType, (event) => { let newDetail; @@ -105,7 +112,9 @@ class Serial extends EventTarget { } // Prefer Tauri plugin if present const tauriInst = this._protocols.find((p) => p.name === "tauriserial")?.instance; - if (tauriInst) return tauriInst; + if (tauriInst) { + return tauriInst; + } return this._protocols.find((p) => p.name === "webserial")?.instance; } @@ -236,3 +245,6 @@ class Serial extends EventTarget { // Export a singleton instance export const serial = new Serial(); +// Kick off async initialization outside of the constructor. +// Intentionally not awaited to avoid blocking module load. +void serial.init(); From 3fda9fe7ff379e1f48367b19659c7adfbc2fddd9 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sat, 25 Oct 2025 23:01:16 +0200 Subject: [PATCH 31/68] Coderabbit refactoring --- src/js/protocols/TauriSerial.js | 98 +++++++++++++++------------------ 1 file changed, 45 insertions(+), 53 deletions(-) diff --git a/src/js/protocols/TauriSerial.js b/src/js/protocols/TauriSerial.js index bb51ca1f1b..6db63117f6 100644 --- a/src/js/protocols/TauriSerial.js +++ b/src/js/protocols/TauriSerial.js @@ -90,38 +90,56 @@ class TauriSerial extends EventTarget { console.log(`${logHead} Device monitoring stopped`); } + /** + * Convert the raw portsMap from the plugin into our standardized port objects. + * @private + */ + _convertPortsMapToArray(portsMap) { + return Object.entries(portsMap).map(([path, info]) => { + let vendorId = undefined; + let productId = undefined; + + if (info.vid) { + vendorId = typeof info.vid === "number" ? info.vid : Number.parseInt(info.vid, 10); + } + if (info.pid) { + productId = typeof info.pid === "number" ? info.pid : Number.parseInt(info.pid, 10); + } + + return { + path, + displayName: this.getDisplayName(path, vendorId, productId), + vendorId, + productId, + serialNumber: info.serial_number, + }; + }); + } + + /** + * Filter ports to only include known Betaflight-compatible devices. + * @private + */ + _filterToKnownDevices(ports) { + return ports.filter((port) => { + // Only include ports with known vendor IDs (Betaflight-compatible devices) + if (!port.vendorId || !port.productId) { + return false; + } + // Check if this device is in our known devices list + return serialDevices.some((d) => d.vendorId === port.vendorId && d.productId === port.productId); + }); + } + async checkDeviceChanges() { try { const portsMap = await invoke("plugin:serialplugin|available_ports"); // Convert to our format - const allPorts = Object.entries(portsMap).map(([path, info]) => { - let vendorId = undefined; - let productId = undefined; - - if (info.vid) { - vendorId = typeof info.vid === "number" ? info.vid : Number.parseInt(info.vid, 10); - } - if (info.pid) { - productId = typeof info.pid === "number" ? info.pid : Number.parseInt(info.pid, 10); - } - - return { - path, - displayName: this.getDisplayName(path, vendorId, productId), - vendorId, - productId, - serialNumber: info.serial_number, - }; - }); + const allPorts = this._convertPortsMapToArray(portsMap); // Filter to only known devices - const currentPorts = allPorts.filter((port) => { - if (!port.vendorId || !port.productId) { - return false; - } - return serialDevices.some((d) => d.vendorId === port.vendorId && d.productId === port.productId); - }); + const currentPorts = this._filterToKnownDevices(allPorts); // Check for removed devices const removedPorts = this.ports.filter( @@ -157,36 +175,10 @@ class TauriSerial extends EventTarget { const portsMap = await invoke("plugin:serialplugin|available_ports"); // Convert the object map to array - const allPorts = Object.entries(portsMap).map(([path, info]) => { - // The plugin returns vid/pid as decimal strings like "1155", "22336" - let vendorId = undefined; - let productId = undefined; - - if (info.vid) { - vendorId = typeof info.vid === "number" ? info.vid : Number.parseInt(info.vid, 10); - } - if (info.pid) { - productId = typeof info.pid === "number" ? info.pid : Number.parseInt(info.pid, 10); - } - - return { - path, - displayName: this.getDisplayName(path, vendorId, productId), - vendorId, - productId, - serialNumber: info.serial_number, - }; - }); + const allPorts = this._convertPortsMapToArray(portsMap); // Filter to only known devices - this.ports = allPorts.filter((port) => { - // Only include ports with known vendor IDs (Betaflight-compatible devices) - if (!port.vendorId || !port.productId) { - return false; - } - // Check if this device is in our known devices list - return serialDevices.some((d) => d.vendorId === port.vendorId && d.productId === port.productId); - }); + this.ports = this._filterToKnownDevices(allPorts); console.log(`${logHead} Found ${this.ports.length} serial ports (filtered from ${allPorts.length})`); return this.ports; From 78b8c8e6a0ad7f7219d7ee719d697ed6c4db6101 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sat, 25 Oct 2025 23:06:46 +0200 Subject: [PATCH 32/68] Use function not object --- src/js/serial.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/serial.js b/src/js/serial.js index eea4627643..625aed5250 100644 --- a/src/js/serial.js +++ b/src/js/serial.js @@ -34,7 +34,7 @@ class Serial extends EventTarget { */ async init() { // Dynamically include the native Tauri serial adapter so web builds don't try to resolve it. - if (isTauri) { + if (isTauri()) { try { const { default: TauriSerial } = await import("./protocols/TauriSerial.js"); const inst = new TauriSerial(); From 6b83cb14304d74857ecfe7dc33781fb7ac7c0cff Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sat, 25 Oct 2025 23:24:23 +0200 Subject: [PATCH 33/68] Fix race condition --- src/js/protocols/TauriSerial.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/js/protocols/TauriSerial.js b/src/js/protocols/TauriSerial.js index 6db63117f6..67c856de7f 100644 --- a/src/js/protocols/TauriSerial.js +++ b/src/js/protocols/TauriSerial.js @@ -47,8 +47,7 @@ class TauriSerial extends EventTarget { this.monitoringDevices = false; this.deviceMonitorInterval = null; - this.loadDevices(); - this.startDeviceMonitoring(); + this.loadDevices().then(() => this.startDeviceMonitoring()); } handleReceiveBytes(info) { From 7d8e6820b2ae646ede70b458b981b1dce95f953f Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sat, 25 Oct 2025 23:26:40 +0200 Subject: [PATCH 34/68] Remove deadcode after refactoring --- src/js/protocols/TauriSerial.js | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/js/protocols/TauriSerial.js b/src/js/protocols/TauriSerial.js index 67c856de7f..25effc7898 100644 --- a/src/js/protocols/TauriSerial.js +++ b/src/js/protocols/TauriSerial.js @@ -415,20 +415,6 @@ class TauriSerial extends EventTarget { await this.loadDevices(); return this.ports; } - - removePort(path) { - const removed = this.ports.find((p) => p.path === path); - this.ports = this.ports.filter((p) => p.path !== path); - if (removed) { - this.dispatchEvent(new CustomEvent("removedDevice", { detail: removed })); - } - } - - // Deprecated: addPort is no longer needed since monitoring handles this - addPort(path) { - // Device monitoring will automatically detect and emit addedDevice - console.log(`${logHead} addPort called for ${path}, monitoring will handle detection`); - } } export default TauriSerial; From 3203205c8dda053e3367284114270a7c71fc72c5 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sat, 25 Oct 2025 23:45:17 +0200 Subject: [PATCH 35/68] Fix some more sonar issues but not all --- src/js/protocols/TauriSerial.js | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/js/protocols/TauriSerial.js b/src/js/protocols/TauriSerial.js index 25effc7898..9cd59a1cbe 100644 --- a/src/js/protocols/TauriSerial.js +++ b/src/js/protocols/TauriSerial.js @@ -95,15 +95,16 @@ class TauriSerial extends EventTarget { */ _convertPortsMapToArray(portsMap) { return Object.entries(portsMap).map(([path, info]) => { - let vendorId = undefined; - let productId = undefined; - - if (info.vid) { - vendorId = typeof info.vid === "number" ? info.vid : Number.parseInt(info.vid, 10); - } - if (info.pid) { - productId = typeof info.pid === "number" ? info.pid : Number.parseInt(info.pid, 10); - } + const vendorId = info.vid + ? typeof info.vid === "number" + ? info.vid + : Number.parseInt(info.vid, 10) + : undefined; + const productId = info.pid + ? typeof info.pid === "number" + ? info.pid + : Number.parseInt(info.pid, 10) + : undefined; return { path, @@ -142,12 +143,12 @@ class TauriSerial extends EventTarget { // Check for removed devices const removedPorts = this.ports.filter( - (oldPort) => !currentPorts.find((newPort) => newPort.path === oldPort.path), + (oldPort) => !currentPorts.some((newPort) => newPort.path === oldPort.path), ); // Check for added devices const addedPorts = currentPorts.filter( - (newPort) => !this.ports.find((oldPort) => oldPort.path === newPort.path), + (newPort) => !this.ports.some((oldPort) => oldPort.path === newPort.path), ); // Emit events for removed devices @@ -277,7 +278,7 @@ class TauriSerial extends EventTarget { } catch (error) { const msg = error?.message || (error?.toString ? error.toString() : ""); // Timeout is expected when no data available - if (msg && msg.toLowerCase().includes("no data received")) { + if (msg?.toLowerCase().includes("no data received")) { await new Promise((resolve) => setTimeout(resolve, 5)); continue; } From 794e5163c8041aa10274cba70f9948dc511a283f Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 26 Oct 2025 00:08:29 +0200 Subject: [PATCH 36/68] cargo update --- src-tauri/Cargo.lock | 1331 ++++++++++++++++++++++-------------------- 1 file changed, 685 insertions(+), 646 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 4e486d2950..d8c9a95056 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -2,20 +2,11 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aho-corasick" @@ -41,12 +32,6 @@ dependencies = [ "alloc-no-stdlib", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -58,9 +43,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.97" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "atk" @@ -86,25 +71,16 @@ dependencies = [ ] [[package]] -name = "autocfg" -version = "1.4.0" +name = "atomic-waker" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] -name = "backtrace" -version = "0.3.74" +name = "autocfg" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "base64" @@ -138,11 +114,11 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -165,11 +141,11 @@ dependencies = [ [[package]] name = "block2" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d59b4c170e16f0405a2e95aff44432a0d41aa97675f3d52623effe95792a037" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" dependencies = [ - "objc2 0.6.0", + "objc2 0.6.3", ] [[package]] @@ -195,15 +171,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytemuck" -version = "1.22.0" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" [[package]] name = "byteorder" @@ -226,7 +202,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "cairo-sys-rs", "glib", "libc", @@ -247,11 +223,11 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.9" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -274,7 +250,7 @@ dependencies = [ "semver", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -289,10 +265,11 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.16" +version = "1.2.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" +checksum = "739eb0f94557554b3ca9a86d2d37bebd49c5e6d0c1d2bda35ba5bdac830befc2" dependencies = [ + "find-msvc-tools", "shlex", ] @@ -325,9 +302,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -337,15 +314,14 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.40" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "num-traits", "serde", - "windows-link 0.1.3", + "windows-link 0.2.1", ] [[package]] @@ -396,7 +372,7 @@ version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "core-foundation", "core-graphics-types", "foreign-types", @@ -409,7 +385,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "core-foundation", "libc", ] @@ -425,18 +401,18 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] @@ -481,7 +457,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -491,14 +467,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "darling" -version = "0.20.10" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ "darling_core", "darling_macro", @@ -506,50 +482,50 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.10" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "darling_macro" -version = "0.20.10" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "deranged" -version = "0.3.11" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", - "serde", + "serde_core", ] [[package]] name = "derive_more" -version = "0.99.19" +version = "0.99.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ "convert_case", "proc-macro2", "quote", "rustc_version", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -580,7 +556,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -589,6 +565,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.10.0", + "objc2 0.6.3", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -597,7 +583,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -614,20 +600,20 @@ dependencies = [ [[package]] name = "dlopen2_derive" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b99bf03862d7f545ebc28ddd33a665b50865f4dfd84031a393823879bd4c54" +checksum = "788160fb30de9cdd857af31c6a2675904b16ece8fc2737b2c7127ba368c9d0f4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[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", ] @@ -655,20 +641,20 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "dyn-clone" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "embed-resource" -version = "3.0.2" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fbc6e0d8e0c03a655b53ca813f0463d2c956bc4db8138dbc89f120b066551e3" +checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" dependencies = [ "cc", "memchr", "rustc_version", - "toml 0.8.20", + "toml 0.9.8", "vswhom", "winreg", ] @@ -696,11 +682,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" +checksum = "259d404d09818dec19332e31d94558aeb442fea04c817006456c24b5460bbd4b" dependencies = [ "serde", + "serde_core", "typeid", ] @@ -723,11 +710,17 @@ dependencies = [ "rustc_version", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" + [[package]] name = "flate2" -version = "1.1.0" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", "miniz_oxide", @@ -757,7 +750,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -768,9 +761,9 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -825,7 +818,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -967,9 +960,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.7" +version = "0.14.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" dependencies = [ "typenum", "version_check", @@ -988,33 +981,27 @@ 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", + "wasi 0.11.1+wasi-snapshot-preview1", ] [[package]] name = "getrandom" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", - "wasi 0.13.3+wasi-0.2.2", - "windows-targets 0.52.6", + "r-efi", + "wasip2", ] -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - [[package]] name = "gio" version = "0.18.4" @@ -1053,7 +1040,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "futures-channel", "futures-core", "futures-executor", @@ -1077,11 +1064,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" dependencies = [ "heck 0.4.1", - "proc-macro-crate 2.0.0", + "proc-macro-crate 2.0.2", "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -1096,9 +1083,9 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "gobject-sys" @@ -1160,7 +1147,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -1207,9 +1194,9 @@ dependencies = [ [[package]] name = "http" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a761d192fbf18bdef69f5ceedd0d1333afcbda0ee23840373b8317570d23c65" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", @@ -1247,18 +1234,20 @@ checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "hyper" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "http", "http-body", "httparse", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -1266,16 +1255,21 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" dependencies = [ + "base64 0.22.1", "bytes", "futures-channel", + "futures-core", "futures-util", "http", "http-body", "hyper", + "ipnet", + "libc", + "percent-encoding", "pin-project-lite", "socket2", "tokio", @@ -1285,16 +1279,17 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows-core 0.52.0", + "windows-core 0.62.2", ] [[package]] @@ -1318,21 +1313,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", @@ -1341,31 +1337,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", @@ -1373,67 +1349,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.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 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.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[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.100", -] - [[package]] name = "ident_case" version = "1.0.1" @@ -1442,9 +1405,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -1453,9 +1416,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", @@ -1509,6 +1472,16 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "is-docker" version = "0.2.0" @@ -1581,9 +1554,9 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", @@ -1617,7 +1590,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "serde", "unicode-segmentation", ] @@ -1666,9 +1639,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.171" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libloading" @@ -1682,11 +1655,11 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.3" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "libc", ] @@ -1712,25 +1685,24 @@ dependencies = [ [[package]] name = "litemap" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.26" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "mac" @@ -1769,7 +1741,7 @@ checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -1780,9 +1752,9 @@ checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memoffset" @@ -1801,9 +1773,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.8.5" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", "simd-adler32", @@ -1811,13 +1783,13 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.61.2", ] [[package]] @@ -1830,14 +1802,14 @@ dependencies = [ "dpi", "gtk", "keyboard-types", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-app-kit", "objc2-core-foundation", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.2", "once_cell", "png", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "windows-sys 0.60.2", ] @@ -1847,7 +1819,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "jni-sys", "log", "ndk-sys", @@ -1911,23 +1883,24 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" dependencies = [ "num_enum_derive", + "rustversion", ] [[package]] name = "num_enum_derive" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" dependencies = [ - "proc-macro-crate 3.3.0", + "proc-macro-crate 3.4.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -1948,9 +1921,9 @@ dependencies = [ [[package]] name = "objc2" -version = "0.6.0" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3531f65190d9cff863b77a99857e74c314dd16bf56c538c4b57c7cbc3f3a6e59" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" dependencies = [ "objc2-encode", "objc2-exception-helper", @@ -1958,75 +1931,104 @@ dependencies = [ [[package]] name = "objc2-app-kit" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5906f93257178e2f7ae069efb89fbd6ee94f0592740b5f8a1512ca498814d0fb" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.9.0", - "block2 0.6.0", + "bitflags 2.10.0", + "block2 0.6.2", "libc", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-cloud-kit", "objc2-core-data", "objc2-core-foundation", "objc2-core-graphics", "objc2-core-image", - "objc2-foundation 0.3.0", - "objc2-quartz-core 0.3.0", + "objc2-core-text", + "objc2-core-video", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", ] [[package]] name = "objc2-cloud-kit" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c1948a9be5f469deadbd6bcb86ad7ff9e47b4f632380139722f7d9840c0d42c" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", - "objc2-foundation 0.3.0", + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-foundation 0.3.2", ] [[package]] name = "objc2-core-data" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f860f8e841f6d32f754836f51e6bc7777cd7e7053cf18528233f6811d3eceb4" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", - "objc2-foundation 0.3.0", + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-foundation 0.3.2", ] [[package]] name = "objc2-core-foundation" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daeaf60f25471d26948a1c2f840e3f7d86f4109e3af4e8e4b5cd70c39690d925" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", + "bitflags 2.10.0", + "dispatch2", + "objc2 0.6.3", ] [[package]] name = "objc2-core-graphics" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dca602628b65356b6513290a21a6405b4d4027b8b250f0b98dddbb28b7de02" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", + "bitflags 2.10.0", + "dispatch2", + "objc2 0.6.3", "objc2-core-foundation", "objc2-io-surface", ] [[package]] name = "objc2-core-image" -version = "0.3.0" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2 0.6.3", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ffa6bea72bf42c78b0b34e89c0bafac877d5f80bf91e159a5d96ea7f693ca56" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" dependencies = [ - "objc2 0.6.0", - "objc2-foundation 0.3.0", + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-core-video" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-io-surface", ] [[package]] @@ -2050,7 +2052,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "block2 0.5.1", "libc", "objc2 0.5.2", @@ -2058,25 +2060,35 @@ dependencies = [ [[package]] name = "objc2-foundation" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a21c6c9014b82c39515db5b396f91645182611c97d24637cf56ac01e5f8d998" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.9.0", - "block2 0.6.0", + "bitflags 2.10.0", + "block2 0.6.2", "libc", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-core-foundation", ] [[package]] name = "objc2-io-surface" -version = "0.3.0" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-javascript-core" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "161a8b87e32610086e1a7a9e9ec39f84459db7b3a0881c1f16ca5a2605581c19" +checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-core-foundation", ] @@ -2086,7 +2098,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -2098,7 +2110,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -2107,67 +2119,59 @@ dependencies = [ [[package]] name = "objc2-quartz-core" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb3794501bb1bee12f08dcad8c61f2a5875791ad1c6f47faa71a0f033f20071" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", - "objc2-foundation 0.3.0", + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-foundation 0.3.2", ] [[package]] name = "objc2-security" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3126341c65c5d5728423ae95d788e1b660756486ad0592307ab87ba02d9a7268" +checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", + "bitflags 2.10.0", + "objc2 0.6.3", "objc2-core-foundation", ] [[package]] name = "objc2-ui-kit" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "777a571be14a42a3990d4ebedaeb8b54cd17377ec21b92e8200ac03797b3bee1" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", + "bitflags 2.10.0", + "objc2 0.6.3", "objc2-core-foundation", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.2", ] [[package]] name = "objc2-web-kit" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b717127e4014b0f9f3e8bba3d3f2acec81f1bde01f656823036e823ed2c94dce" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" dependencies = [ - "bitflags 2.9.0", - "block2 0.6.0", - "objc2 0.6.0", + "bitflags 2.10.0", + "block2 0.6.2", + "objc2 0.6.3", "objc2-app-kit", "objc2-core-foundation", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.2", + "objc2-javascript-core", "objc2-security", ] -[[package]] -name = "object" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" -version = "1.21.0" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde51589ab56b20a6f686b2c68f7a0bd6add753d697abf720d63f8db3ab7b1ad" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "open" @@ -2189,12 +2193,12 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "os_pipe" -version = "1.2.1" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982" +checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -2224,9 +2228,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -2234,15 +2238,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -2253,9 +2257,9 @@ checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "phf" @@ -2361,7 +2365,7 @@ dependencies = [ "phf_shared 0.11.3", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -2411,9 +2415,9 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "plist" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" +checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" dependencies = [ "base64 0.22.1", "indexmap 2.12.0", @@ -2435,6 +2439,15 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -2468,20 +2481,21 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "2.0.0" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" dependencies = [ - "toml_edit 0.20.7", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", ] [[package]] name = "proc-macro-crate" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit 0.22.24", + "toml_edit 0.23.7", ] [[package]] @@ -2516,31 +2530,37 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] [[package]] name = "quick-xml" -version = "0.32.0" +version = "0.38.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" +checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" dependencies = [ "memchr", ] [[package]] name = "quote" -version = "1.0.39" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1f1914ce909e1658d9907913b4b91947430c7d9be598b15a1912935b8c04801" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 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" @@ -2601,7 +2621,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]] @@ -2630,29 +2650,49 @@ checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] name = "redox_syscall" -version = "0.5.10" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", ] [[package]] name = "redox_users" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", - "thiserror 2.0.12", + "thiserror 2.0.17", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.108", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -2662,9 +2702,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -2673,15 +2713,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "reqwest" -version = "0.12.12" +version = "0.12.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" dependencies = [ "base64 0.22.1", "bytes", @@ -2692,11 +2732,8 @@ dependencies = [ "http-body-util", "hyper", "hyper-util", - "ipnet", "js-sys", "log", - "mime", - "once_cell", "percent-encoding", "pin-project-lite", "serde", @@ -2706,21 +2743,15 @@ dependencies = [ "tokio", "tokio-util", "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "wasm-streams", "web-sys", - "windows-registry", ] -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - [[package]] name = "rustc_version" version = "0.4.1" @@ -2732,9 +2763,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" @@ -2766,6 +2797,30 @@ dependencies = [ "uuid", ] +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + [[package]] name = "schemars_derive" version = "0.8.22" @@ -2775,7 +2830,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -2804,11 +2859,12 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ "serde", + "serde_core", ] [[package]] @@ -2823,12 +2879,13 @@ dependencies = [ [[package]] name = "serde-untagged" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "299d9c19d7d466db4ab10addd5703e4c615dec2a5a16dbbafe191045e87ee66e" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" dependencies = [ "erased-serde", "serde", + "serde_core", "typeid", ] @@ -2849,7 +2906,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -2860,19 +2917,20 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -2883,14 +2941,14 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "serde_spanned" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] @@ -2918,17 +2976,18 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.12.0" +version = "3.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", "indexmap 2.12.0", - "serde", - "serde_derive", + "schemars 0.9.0", + "schemars 1.0.4", + "serde_core", "serde_json", "serde_with_macros", "time", @@ -2936,14 +2995,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.12.0" +version = "3.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -2965,7 +3024,7 @@ checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -2974,7 +3033,7 @@ version = "4.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21f60a586160667241d7702c420fc223939fb3c0bb8d3fac84f78768e8970dee" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.10.0", "cfg-if", "core-foundation", "core-foundation-sys", @@ -3000,9 +3059,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", @@ -3011,12 +3070,13 @@ dependencies = [ [[package]] name = "shared_child" -version = "1.0.1" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09fa9338aed9a1df411814a5b2252f7cd206c55ae9bf2fa763f8de84603aa60c" +checksum = "1e362d9935bc50f019969e2f9ecd66786612daae13e8f277be7bfb66e8bed3f7" dependencies = [ "libc", - "windows-sys 0.59.0", + "sigchld", + "windows-sys 0.60.2", ] [[package]] @@ -3025,6 +3085,36 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "sigchld" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47106eded3c154e70176fc83df9737335c94ce22f821c32d17ed1db1f83badb1" +dependencies = [ + "libc", + "os_pipe", + "signal-hook", +] + +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +dependencies = [ + "libc", +] + [[package]] name = "simd-adler32" version = "0.3.7" @@ -3045,27 +3135,24 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" -version = "1.14.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.5.8" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] @@ -3118,15 +3205,15 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "string_cache" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938d512196766101d333398efde81bc1f37b00cb42c2f8350e5df639f040bbbe" +checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f" dependencies = [ "new_debug_unreachable", "parking_lot", @@ -3177,9 +3264,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.100" +version = "2.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" dependencies = [ "proc-macro2", "quote", @@ -3197,13 +3284,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.100", + "syn 2.0.108", ] [[package]] @@ -3215,7 +3302,7 @@ dependencies = [ "cfg-expr", "heck 0.5.0", "pkg-config", - "toml 0.8.20", + "toml 0.8.2", "version-compare", ] @@ -3225,8 +3312,8 @@ version = "0.34.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" dependencies = [ - "bitflags 2.9.0", - "block2 0.6.0", + "bitflags 2.10.0", + "block2 0.6.2", "core-foundation", "core-graphics", "crossbeam-channel", @@ -3243,9 +3330,9 @@ dependencies = [ "ndk", "ndk-context", "ndk-sys", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-app-kit", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.2", "once_cell", "parking_lot", "raw-window-handle", @@ -3267,7 +3354,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -3288,7 +3375,7 @@ dependencies = [ "dirs", "dunce", "embed_plist", - "getrandom 0.3.1", + "getrandom 0.3.4", "glob", "gtk", "heck 0.5.0", @@ -3298,9 +3385,9 @@ dependencies = [ "log", "mime", "muda", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-app-kit", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.2", "objc2-ui-kit", "objc2-web-kit", "percent-encoding", @@ -3317,7 +3404,7 @@ dependencies = [ "tauri-runtime", "tauri-runtime-wry", "tauri-utils", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tray-icon", "url", @@ -3339,7 +3426,7 @@ dependencies = [ "glob", "heck 0.5.0", "json-patch", - "schemars", + "schemars 0.8.22", "semver", "serde", "serde_json", @@ -3367,9 +3454,9 @@ dependencies = [ "serde", "serde_json", "sha2", - "syn 2.0.100", + "syn 2.0.108", "tauri-utils", - "thiserror 2.0.12", + "thiserror 2.0.17", "time", "url", "uuid", @@ -3385,7 +3472,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", "tauri-codegen", "tauri-utils", ] @@ -3399,7 +3486,7 @@ dependencies = [ "anyhow", "glob", "plist", - "schemars", + "schemars 0.8.22", "serde", "serde_json", "tauri-utils", @@ -3418,7 +3505,7 @@ dependencies = [ "serialport", "tauri", "tauri-plugin", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -3432,13 +3519,13 @@ dependencies = [ "open", "os_pipe", "regex", - "schemars", + "schemars 0.8.22", "serde", "serde_json", "shared_child", "tauri", "tauri-plugin", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", ] @@ -3453,14 +3540,14 @@ dependencies = [ "gtk", "http", "jni", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-ui-kit", "objc2-web-kit", "raw-window-handle", "serde", "serde_json", "tauri-utils", - "thiserror 2.0.12", + "thiserror 2.0.17", "url", "webkit2gtk", "webview2-com", @@ -3477,9 +3564,9 @@ dependencies = [ "http", "jni", "log", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-app-kit", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.2", "once_cell", "percent-encoding", "raw-window-handle", @@ -3517,14 +3604,14 @@ dependencies = [ "proc-macro2", "quote", "regex", - "schemars", + "schemars 0.8.22", "semver", "serde", "serde-untagged", "serde_json", "serde_with", "swift-rs", - "thiserror 2.0.12", + "thiserror 2.0.17", "toml 0.9.8", "url", "urlpattern", @@ -3534,12 +3621,12 @@ dependencies = [ [[package]] name = "tauri-winres" -version = "0.3.0" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56eaa45f707bedf34d19312c26d350bc0f3c59a47e58e8adbeecdc850d2c13a0" +checksum = "fd21509dd1fa9bd355dc29894a6ff10635880732396aa38c0066c1e6c1ab8074" dependencies = [ "embed-resource", - "toml 0.8.20", + "toml 0.9.8", ] [[package]] @@ -3564,11 +3651,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.17", ] [[package]] @@ -3579,25 +3666,25 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] name = "time" -version = "0.3.39" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dad298b01a40a23aac4580b67e3dbedb7cc8402f3592d7f49469de2ea4aecdd8" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", @@ -3610,15 +3697,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.3" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "765c97a5b985b7c11d7bc27fa927dc4fe6af3a6dfb021d28deb60d3bf51e76ef" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.20" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8093bc3e81c3bc5f7879de09619d06c9a5a5e45ca44dfeeb7225bae38005c5c" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -3626,9 +3713,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", @@ -3636,24 +3723,23 @@ dependencies = [ [[package]] name = "tokio" -version = "1.44.0" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9975ea0f48b5aa3972bf2d888c238182458437cc2a19374b81b25cdf1023fb3a" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", "libc", "mio", "pin-project-lite", "socket2", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -3664,14 +3750,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.20" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" dependencies = [ "serde", - "serde_spanned 0.6.8", - "toml_datetime 0.6.8", - "toml_edit 0.22.24", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", ] [[package]] @@ -3691,9 +3777,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" dependencies = [ "serde", ] @@ -3714,31 +3800,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap 2.12.0", - "toml_datetime 0.6.8", + "toml_datetime 0.6.3", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.20.7" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" dependencies = [ "indexmap 2.12.0", - "toml_datetime 0.6.8", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.22.24" +version = "0.23.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" dependencies = [ "indexmap 2.12.0", - "serde", - "serde_spanned 0.6.8", - "toml_datetime 0.6.8", + "toml_datetime 0.7.3", + "toml_parser", "winnow 0.7.13", ] @@ -3772,6 +3859,24 @@ dependencies = [ "tower-service", ] +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags 2.10.0", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -3796,9 +3901,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", ] @@ -3813,15 +3918,15 @@ dependencies = [ "dirs", "libappindicator", "muda", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-app-kit", "objc2-core-foundation", "objc2-core-graphics", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.2", "once_cell", "png", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "windows-sys 0.60.2", ] @@ -3839,9 +3944,9 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unescaper" @@ -3849,7 +3954,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c01d12e3a56a4432a8b436f293c25f4808bdf9e9f9f98f9260bba1f1bc5a1f26" dependencies = [ - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -3895,9 +4000,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06" [[package]] name = "unicode-segmentation" @@ -3907,9 +4012,9 @@ checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", @@ -3935,12 +4040,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" @@ -3949,12 +4048,14 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.15.1" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ - "getrandom 0.3.1", + "getrandom 0.3.4", + "js-sys", "serde", + "wasm-bindgen", ] [[package]] @@ -4016,50 +4117,51 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.13.3+wasi-0.2.2" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" dependencies = [ "cfg-if", "js-sys", @@ -4070,9 +4172,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4080,22 +4182,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" dependencies = [ "unicode-ident", ] @@ -4115,9 +4217,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", @@ -4189,7 +4291,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -4198,7 +4300,7 @@ version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" dependencies = [ - "thiserror 2.0.12", + "thiserror 2.0.17", "windows", "windows-core 0.61.2", ] @@ -4221,11 +4323,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -4240,10 +4342,10 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" dependencies = [ - "objc2 0.6.0", + "objc2 0.6.3", "objc2-app-kit", "objc2-core-foundation", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.2", "raw-window-handle", "windows-sys 0.59.0", "windows-version", @@ -4273,24 +4375,28 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.52.0" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-targets 0.52.6", + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] name = "windows-core" -version = "0.61.2" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", ] [[package]] @@ -4312,7 +4418,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -4323,7 +4429,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -4348,26 +4454,6 @@ dependencies = [ "windows-link 0.1.3", ] -[[package]] -name = "windows-registry" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" -dependencies = [ - "windows-result 0.2.0", - "windows-strings 0.1.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-result" version = "0.3.4" @@ -4378,13 +4464,12 @@ dependencies = [ ] [[package]] -name = "windows-strings" -version = "0.1.0" +name = "windows-result" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-result 0.2.0", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -4397,21 +4482,21 @@ dependencies = [ ] [[package]] -name = "windows-sys" -version = "0.45.0" +name = "windows-strings" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-targets 0.42.2", + "windows-link 0.2.1", ] [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-targets 0.48.5", + "windows-targets 0.42.2", ] [[package]] @@ -4441,6 +4526,15 @@ dependencies = [ "windows-targets 0.53.5", ] +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -4456,21 +4550,6 @@ dependencies = [ "windows_x86_64_msvc 0.42.2", ] -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - [[package]] name = "windows-targets" version = "0.52.6" @@ -4515,11 +4594,11 @@ dependencies = [ [[package]] name = "windows-version" -version = "0.1.3" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bfbcc4996dd183ff1376a20ade1242da0d2dcaff83cc76710a588d24fd4c5db" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" dependencies = [ - "windows-link 0.1.3", + "windows-link 0.2.1", ] [[package]] @@ -4528,12 +4607,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -4552,12 +4625,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -4576,12 +4643,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -4612,12 +4673,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -4636,12 +4691,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -4660,12 +4709,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -4684,12 +4727,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -4722,34 +4759,25 @@ dependencies = [ [[package]] name = "winreg" -version = "0.52.0" +version = "0.55.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" dependencies = [ "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "wit-bindgen-rt" -version = "0.33.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" -dependencies = [ - "bitflags 2.9.0", + "windows-sys 0.59.0", ] [[package]] -name = "write16" -version = "1.0.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[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" @@ -4758,7 +4786,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" dependencies = [ "base64 0.22.1", - "block2 0.6.0", + "block2 0.6.2", "cookie", "crossbeam-channel", "dirs", @@ -4773,10 +4801,10 @@ dependencies = [ "kuchikiki", "libc", "ndk", - "objc2 0.6.0", + "objc2 0.6.3", "objc2-app-kit", "objc2-core-foundation", - "objc2-foundation 0.3.0", + "objc2-foundation 0.3.2", "objc2-ui-kit", "objc2-web-kit", "once_cell", @@ -4785,7 +4813,7 @@ dependencies = [ "sha2", "soup3", "tao-macros", - "thiserror 2.0.12", + "thiserror 2.0.17", "url", "webkit2gtk", "webkit2gtk-sys", @@ -4819,9 +4847,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -4831,34 +4859,34 @@ 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.100", + "syn 2.0.108", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.23" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.23" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", ] [[package]] @@ -4878,15 +4906,26 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.108", "synstructure", ] +[[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.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", @@ -4895,11 +4934,11 @@ 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.100", + "syn 2.0.108", ] From 219fb6794ef4692542fdb934ef49ab0cd9ed6291 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 26 Oct 2025 00:31:22 +0200 Subject: [PATCH 37/68] ci: simplify to node-only, add workflow_dispatch test wrapper --- .github/workflows/ci-test.yml | 17 +++++ .github/workflows/ci.yml | 139 +++++++++++++--------------------- 2 files changed, 71 insertions(+), 85 deletions(-) create mode 100644 .github/workflows/ci-test.yml diff --git a/.github/workflows/ci-test.yml b/.github/workflows/ci-test.yml new file mode 100644 index 0000000000..1ea462cc54 --- /dev/null +++ b/.github/workflows/ci-test.yml @@ -0,0 +1,17 @@ +name: CI Test + +on: + workflow_dispatch: + inputs: + run_docker_build: + description: "Also try a Docker build if a Dockerfile exists" + required: false + default: "false" + type: choice + options: ["false", "true"] + +jobs: + call-ci: + uses: ./.github/workflows/ci.yml + with: + run_docker_build: ${{ github.event.inputs.run_docker_build == 'true' }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b5c427fb39..165f044962 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,111 +1,80 @@ -# Builds Betaflight Configurator on Windows, Android, Linux and macOS platforms. -# -# After building, artifacts are released to a separate repository. - name: CI +# Keep this as a callable workflow to minimize disruption; callers can trigger it. on: workflow_call: inputs: - debug_build: - description: 'Specifies if it is a debug build or a release build' - default: true + run_docker_build: + description: 'Also try a Docker build if a Dockerfile exists' required: false + default: false type: boolean jobs: - test: - name: Test + node-ci: + name: Lint, test, and build (Node) runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 - - - name: Cache node_modules - uses: actions/cache@v4 - with: - path: node_modules/ - key: node_modules-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + - name: Checkout + uses: actions/checkout@v5 - - name: Install Node.js + - name: Setup Node uses: actions/setup-node@v5 with: node-version-file: '.nvmrc' + cache: 'yarn' - - run: yarn install --immutable --immutable-cache --check-cache - - - name: Run unit tests - run: yarn test - - build: - name: Build (${{ matrix.name }}) - needs: test - runs-on: ${{ matrix.os }} - strategy: - matrix: - include: - - name: Android - os: ubuntu-latest - releaseArgs: --android - - - name: Linux - os: ubuntu-latest - releaseArgs: --linux64 + - name: Install dependencies (Yarn classic) + run: yarn install --frozen-lockfile - - name: macOS - os: macos-11 - releaseArgs: --osx64 + - name: Lint + run: yarn lint - - name: Windows - os: windows-2022 - releaseArgs: --win64 - steps: - - uses: actions/checkout@v5 + - name: Unit tests + run: yarn test --run - - name: Cache NW.js - uses: actions/cache@v4 - with: - path: cache/ - key: nwjs-${{ inputs.debug_build && 'debug' || 'release' }}-${{ runner.os }} + - name: Build web (Vite) + run: yarn build - - name: Cache node_modules - uses: actions/cache@v4 + - name: Upload web dist + uses: actions/upload-artifact@v4 with: - path: node_modules/ - key: node_modules-${{ runner.os }}-${{ hashFiles('yarn.lock') }} + name: web-dist + path: dist/ + if-no-files-found: warn + retention-days: 14 - - name: Install Node.js - uses: actions/setup-node@v5 - with: - node-version-file: '.nvmrc' + docker-build: + name: Docker build (optional) + runs-on: ubuntu-latest + needs: node-ci + if: ${{ inputs.run_docker_build == true }} + steps: + - name: Checkout + uses: actions/checkout@v5 - - name: Install macos dependencies + - name: Check for Dockerfile + id: chk + shell: bash run: | - sudo -H pip install setuptools packaging - sudo npm install -g yarn@1.22.0 node-gyp@10 macos-alias - yarn --network-timeout 1000000 - if: ${{ matrix.name == 'macOs' }} - - - name: Install Java JDK 8 - uses: actions/setup-java@v5 - if: ${{ matrix.name == 'Android' }} - with: - distribution: temurin - java-version: '8' - - - run: yarn install --immutable --immutable-cache --check-cache - - - run: yarn version --no-git-tag-version --new-version ${{ github.ref_name }} - if: ${{ !inputs.debug_build }} - - - run: yarn gulp release ${{ matrix.releaseArgs }} - if: ${{ !inputs.debug_build && matrix.name != 'Android' }} - - - run: yarn gulp debug-release ${{ matrix.releaseArgs }} - if: ${{ inputs.debug_build || matrix.name == 'Android' }} - - - name: Publish build artifacts + if [[ -f Dockerfile ]]; then + echo "present=true" >> "$GITHUB_OUTPUT" + else + echo "present=false" >> "$GITHUB_OUTPUT" + fi + + - name: Build container image + if: ${{ steps.chk.outputs.present == 'true' }} + run: | + docker build -t betaflight-configurator:ci . + - name: Export container (tar) + if: ${{ steps.chk.outputs.present == 'true' }} + run: | + docker save betaflight-configurator:ci -o image.tar + - name: Upload image uses: actions/upload-artifact@v4 + if: ${{ steps.chk.outputs.present == 'true' }} with: - name: Betaflight-Configurator${{ inputs.debug_build == 'true' && '-Debug' || '' }}-${{ matrix.name }} - path: release/ - retention-days: 90 + name: docker-image + path: image.tar + retention-days: 7 From 73ebf075ec3bd1b031b9e808c493bc9f1e3d2b0b Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 26 Oct 2025 00:37:30 +0200 Subject: [PATCH 38/68] release: add Tauri desktop builds (dmg/nsis/deb/appimage) and optional Android APK; publish artifacts to draft release --- .github/workflows/release.yml | 101 +++++++++++++++++++++++++++++----- src-tauri/tauri.conf.json | 2 +- 2 files changed, 88 insertions(+), 15 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7f297bccfd..d97f1aac7b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,7 +1,7 @@ # You'll need to setup the follwing environment variables: # secrets.REPO_TOKEN - A GitHub token with permissions to push and publish releases to the repo -name: Release +name: Release builds (APK/EXE/DMG/DEB) on: workflow_dispatch: @@ -21,19 +21,93 @@ on: required: true type: boolean + include_android: + description: 'Also build Android APK (unsigned)' + required: false + type: boolean + default: false + jobs: - ci: - name: CI - uses: ./.github/workflows/ci.yml - with: - debug_build: false - - release: - name: Release - needs: ci + desktop: + name: Tauri desktop build (${{ matrix.os }}) + strategy: + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Setup Node + uses: actions/setup-node@v5 + with: + node-version-file: '.nvmrc' + cache: 'yarn' + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Build desktop bundles (Tauri) + uses: tauri-apps/tauri-action@v0 + with: + tauriScript: yarn tauri:build + + - name: Upload desktop artifacts + uses: actions/upload-artifact@v4 + with: + name: betaflight-desktop-${{ matrix.os }} + path: | + src-tauri/target/release/bundle/**/*.deb + src-tauri/target/release/bundle/**/*.AppImage + src-tauri/target/release/bundle/**/*.dmg + src-tauri/target/release/bundle/**/*.msi + src-tauri/target/release/bundle/**/*.exe + if-no-files-found: warn + retention-days: 30 + + android: + name: Android APK (Capacitor) + runs-on: ubuntu-latest + if: ${{ github.event.inputs.include_android == true }} + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Setup Node + uses: actions/setup-node@v5 + with: + node-version-file: '.nvmrc' + cache: 'yarn' + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Setup Java 11 + uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: '11' + + - name: Build Android release (unsigned) + run: | + yarn android:release + + - name: Upload APK/AAB artifacts + uses: actions/upload-artifact@v4 + with: + name: betaflight-android + path: | + android/app/build/outputs/apk/release/*.apk + android/app/build/outputs/bundle/release/*.aab + if-no-files-found: warn + retention-days: 30 + + publish: + name: Create GitHub Release + needs: [desktop] runs-on: ubuntu-latest steps: - - name: Fetch build artifacts + - name: Download all artifacts uses: actions/download-artifact@v5 with: path: release-assets/ @@ -44,9 +118,8 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} name: ${{ github.event.inputs.title }} tag_name: ${{ github.event.inputs.tag }} - target_commitish: ${{ GITHUB.REF_NAME }} generate_release_notes: ${{ github.event.inputs.generate_release_notes }} - files: release-assets/Betaflight-Configurator-*/** + files: release-assets/** draft: true prerelease: false - fail_on_unmatched_files: true + fail_on_unmatched_files: false diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index bec5ac704e..ddb07e8411 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -27,7 +27,7 @@ }, "bundle": { "active": true, - "targets": ["deb", "appimage"], + "targets": ["deb", "appimage", "dmg", "nsis"], "icon": ["icons/bf_icon_128.png"] }, "plugins": { From 8cc5564d9b3459276b8917dc0aa912124d6d28b0 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 26 Oct 2025 00:45:26 +0200 Subject: [PATCH 39/68] release: always build Android APK; setup Android SDK and cache Gradle; publish after desktop+android --- .github/workflows/release.yml | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d97f1aac7b..1917e6ceaa 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,11 +21,6 @@ on: required: true type: boolean - include_android: - description: 'Also build Android APK (unsigned)' - required: false - type: boolean - default: false jobs: desktop: @@ -68,7 +63,6 @@ jobs: android: name: Android APK (Capacitor) runs-on: ubuntu-latest - if: ${{ github.event.inputs.include_android == true }} steps: - name: Checkout uses: actions/checkout@v5 @@ -82,12 +76,25 @@ jobs: - name: Install dependencies run: yarn install --frozen-lockfile + - name: Setup Android SDK + uses: android-actions/setup-android@v3 + - name: Setup Java 11 uses: actions/setup-java@v5 with: distribution: temurin java-version: '11' + - name: Cache Gradle + uses: actions/cache@v4 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + - name: Build Android release (unsigned) run: | yarn android:release @@ -104,7 +111,7 @@ jobs: publish: name: Create GitHub Release - needs: [desktop] + needs: [desktop, android] runs-on: ubuntu-latest steps: - name: Download all artifacts From 2b37847942d3035e2e9b4f8d3ef5240c49821e40 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 26 Oct 2025 00:48:00 +0200 Subject: [PATCH 40/68] ci: run on pull_request and push; upload web-dist artifact to PR; guard docker job to workflow_call only --- .github/workflows/ci.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 165f044962..2821466361 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,7 +1,10 @@ name: CI -# Keep this as a callable workflow to minimize disruption; callers can trigger it. +# Run on PRs to show artifacts, and keep callable for reuse. on: + pull_request: + push: + branches: [ tauri ] workflow_call: inputs: run_docker_build: @@ -48,7 +51,8 @@ jobs: name: Docker build (optional) runs-on: ubuntu-latest needs: node-ci - if: ${{ inputs.run_docker_build == true }} + # Only run when called as a reusable workflow AND the caller enabled it + if: ${{ github.event_name == 'workflow_call' && inputs.run_docker_build == true }} steps: - name: Checkout uses: actions/checkout@v5 From b2ec264efbf6aa27830473ffc8090632d6060f24 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 26 Oct 2025 00:53:50 +0200 Subject: [PATCH 41/68] ci: add Tauri Linux preview job to build and upload .deb/.AppImage on PRs --- .github/workflows/ci.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2821466361..06430cdcc1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,6 +47,39 @@ jobs: if-no-files-found: warn retention-days: 14 + tauri-linux-preview: + name: Tauri Linux preview (deb/appimage) + runs-on: ubuntu-latest + needs: node-ci + if: ${{ github.event_name == 'pull_request' }} + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Setup Node + uses: actions/setup-node@v5 + with: + node-version-file: '.nvmrc' + cache: 'yarn' + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Build Tauri (Linux) + uses: tauri-apps/tauri-action@v0 + with: + tauriScript: yarn tauri:build + + - name: Upload Linux installers + uses: actions/upload-artifact@v4 + with: + name: linux-installers + path: | + src-tauri/target/release/bundle/**/*.deb + src-tauri/target/release/bundle/**/*.AppImage + if-no-files-found: warn + retention-days: 14 + docker-build: name: Docker build (optional) runs-on: ubuntu-latest From 65ea8021cf06fcc474017b28c6763dfa61ebbc5a Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 26 Oct 2025 00:58:13 +0200 Subject: [PATCH 42/68] ci: fix Tauri Linux preview by installing required Linux deps (webkit2gtk-4.1, gtk3, ayatana-appindicator, librsvg2, patchelf) --- .github/workflows/ci.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 06430cdcc1..4b00d860ab 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -65,6 +65,16 @@ jobs: - name: Install dependencies run: yarn install --frozen-lockfile + - name: Install Linux deps (Tauri) + run: | + sudo apt-get update + sudo apt-get install -y \ + libgtk-3-dev \ + libwebkit2gtk-4.1-dev \ + libayatana-appindicator3-dev \ + librsvg2-dev \ + patchelf + - name: Build Tauri (Linux) uses: tauri-apps/tauri-action@v0 with: From beaa32d3e87d37367acb3363b4069860e471ad73 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 26 Oct 2025 01:07:18 +0200 Subject: [PATCH 43/68] CI: fix Tauri Linux preview by building web assets and set correct CWD for Tauri before* commands --- .github/workflows/ci.yml | 3 +++ src-tauri/tauri.conf.json | 2 ++ 2 files changed, 5 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4b00d860ab..950e9b5a29 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -75,6 +75,9 @@ jobs: librsvg2-dev \ patchelf + - name: Build web assets (Vite) + run: yarn build + - name: Build Tauri (Linux) uses: tauri-apps/tauri-action@v0 with: diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index ddb07e8411..ab68486052 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -4,7 +4,9 @@ "identifier": "com.betaflight.app", "build": { "beforeDevCommand": "yarn dev", + "beforeDevCommandCwd": "..", "beforeBuildCommand": "yarn build", + "beforeBuildCommandCwd": "..", "devUrl": "http://localhost:8000", "frontendDist": "../dist" }, From 09c745ecc0c16e1677a7746cc57473a2721fd784 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 26 Oct 2025 01:14:28 +0200 Subject: [PATCH 44/68] Fix tauri.conf.json schema error: remove unsupported *Cwd keys; run web build with 'cd .. && yarn ' --- src-tauri/tauri.conf.json | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index ab68486052..9831020a3b 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -3,10 +3,8 @@ "version": "2025.12.0", "identifier": "com.betaflight.app", "build": { - "beforeDevCommand": "yarn dev", - "beforeDevCommandCwd": "..", - "beforeBuildCommand": "yarn build", - "beforeBuildCommandCwd": "..", + "beforeDevCommand": "cd .. && yarn dev", + "beforeBuildCommand": "cd .. && yarn build", "devUrl": "http://localhost:8000", "frontendDist": "../dist" }, From 1e47dde1e74ad5b49d6c3a4c547e0933570bf980 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 26 Oct 2025 01:21:22 +0200 Subject: [PATCH 45/68] CI: run Tauri before* commands at repo root (remove `cd ..`) to fix package.json not found --- src-tauri/tauri.conf.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 9831020a3b..ddb07e8411 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -3,8 +3,8 @@ "version": "2025.12.0", "identifier": "com.betaflight.app", "build": { - "beforeDevCommand": "cd .. && yarn dev", - "beforeBuildCommand": "cd .. && yarn build", + "beforeDevCommand": "yarn dev", + "beforeBuildCommand": "yarn build", "devUrl": "http://localhost:8000", "frontendDist": "../dist" }, From 600193198820ad098d80ddac04d4941e60e99d1e Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 26 Oct 2025 01:27:50 +0200 Subject: [PATCH 46/68] Rust --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 950e9b5a29..004ec9dba0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -75,6 +75,9 @@ jobs: librsvg2-dev \ patchelf + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + - name: Build web assets (Vite) run: yarn build From f29dc9e64253b0f0d64fb734ffaa525892449cb4 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 26 Oct 2025 01:29:38 +0200 Subject: [PATCH 47/68] CI+Tauri: point frontendDist to ../src/dist and upload correct web artifact path (src/dist/) to fix missing assets --- .github/workflows/ci.yml | 2 +- src-tauri/tauri.conf.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 004ec9dba0..95e7423c45 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,7 +43,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: web-dist - path: dist/ + path: src/dist/ if-no-files-found: warn retention-days: 14 diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index ddb07e8411..e3197ece66 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -6,7 +6,7 @@ "beforeDevCommand": "yarn dev", "beforeBuildCommand": "yarn build", "devUrl": "http://localhost:8000", - "frontendDist": "../dist" + "frontendDist": "../src/dist" }, "app": { "security": { From 48c52546dfef49e16418eb4cdad15e53e0a977ca Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 26 Oct 2025 01:38:34 +0200 Subject: [PATCH 48/68] CI: fix Tauri action invocation (use `yarn tauri` so action appends `build` once) --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 95e7423c45..b7683c5517 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -84,7 +84,8 @@ jobs: - name: Build Tauri (Linux) uses: tauri-apps/tauri-action@v0 with: - tauriScript: yarn tauri:build + # Use the Tauri CLI directly; the action appends 'build' automatically. + tauriScript: yarn tauri - name: Upload Linux installers uses: actions/upload-artifact@v4 From f25d3d22682997fa2469276f5a5dd6d1296f1521 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 26 Oct 2025 01:53:20 +0200 Subject: [PATCH 49/68] CI(Linux): install pkg-config, libudev-dev, and libssl-dev to satisfy libudev-sys and OpenSSL dependencies --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b7683c5517..44fdbfa21f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,10 +69,13 @@ jobs: run: | sudo apt-get update sudo apt-get install -y \ + pkg-config \ libgtk-3-dev \ libwebkit2gtk-4.1-dev \ libayatana-appindicator3-dev \ librsvg2-dev \ + libudev-dev \ + libssl-dev \ patchelf - name: Install Rust From b3f3259740670388739926a88635031614a93467 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 26 Oct 2025 02:10:18 +0200 Subject: [PATCH 50/68] Publish --- .github/workflows/ci.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 44fdbfa21f..c2fc022c0d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -89,6 +89,16 @@ jobs: with: # Use the Tauri CLI directly; the action appends 'build' automatically. tauriScript: yarn tauri + # Disable updater.json handling and any release uploads for PR previews. + includeUpdaterJson: false + + - name: Inspect Tauri bundle output + if: always() + run: | + echo "Listing bundle directory (if present):" + ls -la src-tauri/target/release || true + ls -la src-tauri/target/release/bundle || true + find src-tauri/target/release/bundle -maxdepth 3 -type f -print || true - name: Upload Linux installers uses: actions/upload-artifact@v4 @@ -100,6 +110,15 @@ jobs: if-no-files-found: warn retention-days: 14 + - name: Upload bundle folder (fallback) + if: always() + uses: actions/upload-artifact@v4 + with: + name: linux-bundle-raw + path: src-tauri/target/release/bundle + if-no-files-found: warn + retention-days: 7 + docker-build: name: Docker build (optional) runs-on: ubuntu-latest From 6873847dce8dbebea00e14bc88e6db2ed897affe Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 26 Oct 2025 02:25:45 +0200 Subject: [PATCH 51/68] Remove fallback --- .github/workflows/ci.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c2fc022c0d..f720aacd22 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -110,15 +110,6 @@ jobs: if-no-files-found: warn retention-days: 14 - - name: Upload bundle folder (fallback) - if: always() - uses: actions/upload-artifact@v4 - with: - name: linux-bundle-raw - path: src-tauri/target/release/bundle - if-no-files-found: warn - retention-days: 7 - docker-build: name: Docker build (optional) runs-on: ubuntu-latest From 16470740f6d8486fb53bb01034fb8328e52df493 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 26 Oct 2025 02:30:41 +0200 Subject: [PATCH 52/68] Fix artifact-links workflow: trigger on "CI" workflow instead of non-existent "PR" --- .github/workflows/artifact-links.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/artifact-links.yml b/.github/workflows/artifact-links.yml index 60b05445e1..06bf7fb4f5 100644 --- a/.github/workflows/artifact-links.yml +++ b/.github/workflows/artifact-links.yml @@ -1,7 +1,7 @@ name: Artifact links comments creator on: workflow_run: - workflows: ["PR"] + workflows: ["CI"] types: [completed] jobs: From b7cf23313a2c853c08b6ae53f54b11e9640d4c0e Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 26 Oct 2025 02:47:14 +0200 Subject: [PATCH 53/68] Fix artifact-links: only run when CI was triggered by pull_request (skip push events) --- .github/workflows/artifact-links.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/artifact-links.yml b/.github/workflows/artifact-links.yml index 06bf7fb4f5..f91daf26bc 100644 --- a/.github/workflows/artifact-links.yml +++ b/.github/workflows/artifact-links.yml @@ -8,6 +8,8 @@ jobs: artifacts-url-comments: name: Add artifact links to PR and issues runs-on: ubuntu-latest + # Only run if the CI workflow was triggered by a pull_request + if: ${{ github.event.workflow_run.event == 'pull_request' }} steps: - name: Add artifact links to PR and issues uses: tonyhallett/artifacts-url-comments@v1.1.0 From cbbdcf20c1dbc1c07d4de553f0677cf6316ede2e Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 26 Oct 2025 02:03:45 +0100 Subject: [PATCH 54/68] Add permissions to artifact-links workflow (pull-requests: write, actions: read) --- .github/workflows/artifact-links.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/artifact-links.yml b/.github/workflows/artifact-links.yml index f91daf26bc..268ad26093 100644 --- a/.github/workflows/artifact-links.yml +++ b/.github/workflows/artifact-links.yml @@ -10,6 +10,9 @@ jobs: runs-on: ubuntu-latest # Only run if the CI workflow was triggered by a pull_request if: ${{ github.event.workflow_run.event == 'pull_request' }} + permissions: + pull-requests: write + actions: read steps: - name: Add artifact links to PR and issues uses: tonyhallett/artifacts-url-comments@v1.1.0 From 56f2783d4bede1e416ce0c0b54e4592bda9cd48d Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Sun, 26 Oct 2025 02:16:01 +0100 Subject: [PATCH 55/68] Rewrite artifact-links workflow with github-script for better reliability and formatting --- .github/workflows/artifact-links.yml | 57 +++++++++++++++++++++++----- 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/.github/workflows/artifact-links.yml b/.github/workflows/artifact-links.yml index 268ad26093..06045f3770 100644 --- a/.github/workflows/artifact-links.yml +++ b/.github/workflows/artifact-links.yml @@ -8,18 +8,55 @@ jobs: artifacts-url-comments: name: Add artifact links to PR and issues runs-on: ubuntu-latest - # Only run if the CI workflow was triggered by a pull_request - if: ${{ github.event.workflow_run.event == 'pull_request' }} + # Only run if the CI workflow was triggered by a pull_request and succeeded + if: > + github.event.workflow_run.event == 'pull_request' && + github.event.workflow_run.conclusion == 'success' permissions: pull-requests: write actions: read steps: - - name: Add artifact links to PR and issues - uses: tonyhallett/artifacts-url-comments@v1.1.0 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: 'Download artifact metadata' + uses: actions/github-script@v7 + id: artifacts + with: + script: | + const artifacts = await github.rest.actions.listWorkflowRunArtifacts({ + owner: context.repo.owner, + repo: context.repo.repo, + run_id: context.payload.workflow_run.id, + }); + + let links = []; + for (const artifact of artifacts.data.artifacts) { + const url = `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.payload.workflow_run.id}/artifacts/${artifact.id}`; + links.push(`- [${artifact.name}](${url}) (${(artifact.size_in_bytes / 1024 / 1024).toFixed(2)} MB)`); + } + + core.setOutput('artifact_links', links.join('\n')); + core.setOutput('has_artifacts', links.length > 0); + + - name: 'Comment on PR' + if: steps.artifacts.outputs.has_artifacts == 'true' + uses: actions/github-script@v7 with: - prefix: "Do you want to test this code? Here you have an automated build:" - suffix: "WARNING: It may be unstable and result in corrupted configurations or data loss. Use only for testing!" - format: name - addTo: pull + script: | + const prNumber = context.payload.workflow_run.pull_requests[0].number; + const artifactLinks = process.env.ARTIFACT_LINKS; + + const body = `## 🚀 Build Artifacts Ready! + + Do you want to test this code? Here you have automated builds: + + ${artifactLinks} + + ⚠️ **WARNING:** These are preview builds and may be unstable. They could result in corrupted configurations or data loss. Use only for testing!`; + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + body: body + }); + env: + ARTIFACT_LINKS: ${{ steps.artifacts.outputs.artifact_links }} From 3ac97345b22d317fe411227a66e08bc253f38c99 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Mon, 27 Oct 2025 17:26:10 +0100 Subject: [PATCH 56/68] Fix artifact-links workflow: proper boolean check and PR validation - Convert has_artifacts to string for GitHub Actions boolean check - Add safety check for pull_requests array before accessing - Prevents workflow failure when PR context is missing --- .github/workflows/artifact-links.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/artifact-links.yml b/.github/workflows/artifact-links.yml index 06045f3770..3b2e7cd954 100644 --- a/.github/workflows/artifact-links.yml +++ b/.github/workflows/artifact-links.yml @@ -34,14 +34,20 @@ jobs: } core.setOutput('artifact_links', links.join('\n')); - core.setOutput('has_artifacts', links.length > 0); + core.setOutput('has_artifacts', String(links.length > 0)); - name: 'Comment on PR' if: steps.artifacts.outputs.has_artifacts == 'true' uses: actions/github-script@v7 with: script: | - const prNumber = context.payload.workflow_run.pull_requests[0].number; + // Get PR number from the workflow_run event + const pullRequests = context.payload.workflow_run.pull_requests; + if (!pullRequests || pullRequests.length === 0) { + console.log('No pull request associated with this workflow run'); + return; + } + const prNumber = pullRequests[0].number; const artifactLinks = process.env.ARTIFACT_LINKS; const body = `## 🚀 Build Artifacts Ready! From b6eba1e69f7318869ae218987c23916882610907 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Mon, 27 Oct 2025 17:40:40 +0100 Subject: [PATCH 57/68] Fix artifact-links: use template syntax instead of env var The env var approach doesn't work in github-script inline mode. Using direct template substitution for artifact_links output. --- .github/workflows/artifact-links.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/artifact-links.yml b/.github/workflows/artifact-links.yml index 3b2e7cd954..5d954dbec0 100644 --- a/.github/workflows/artifact-links.yml +++ b/.github/workflows/artifact-links.yml @@ -48,7 +48,7 @@ jobs: return; } const prNumber = pullRequests[0].number; - const artifactLinks = process.env.ARTIFACT_LINKS; + const artifactLinks = `${{ steps.artifacts.outputs.artifact_links }}`; const body = `## 🚀 Build Artifacts Ready! @@ -64,5 +64,3 @@ jobs: issue_number: prNumber, body: body }); - env: - ARTIFACT_LINKS: ${{ steps.artifacts.outputs.artifact_links }} From 02def0dd02dbd20c3849455606b7898882be4305 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Mon, 27 Oct 2025 17:55:17 +0100 Subject: [PATCH 58/68] CI: fix Tauri build and artifact upload - Use explicit yarn tauri:build and set projectPath to src-tauri for tauri-action - Broaden upload-artifact globs to capture bundles in nested target directories --- .github/workflows/ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f720aacd22..96ecaf5321 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -88,7 +88,8 @@ jobs: uses: tauri-apps/tauri-action@v0 with: # Use the Tauri CLI directly; the action appends 'build' automatically. - tauriScript: yarn tauri + tauriScript: yarn tauri:build + projectPath: src-tauri # Disable updater.json handling and any release uploads for PR previews. includeUpdaterJson: false @@ -107,6 +108,8 @@ jobs: path: | src-tauri/target/release/bundle/**/*.deb src-tauri/target/release/bundle/**/*.AppImage + src-tauri/target/**/release/bundle/**/*.deb + src-tauri/target/**/release/bundle/**/*.AppImage if-no-files-found: warn retention-days: 14 From 7b330b9b0fb8d8bdd3538c78130c91da374076ca Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Mon, 27 Oct 2025 18:02:17 +0100 Subject: [PATCH 59/68] Revert "CI: fix Tauri build and artifact upload" This reverts commit 02def0dd02dbd20c3849455606b7898882be4305. --- .github/workflows/ci.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 96ecaf5321..f720aacd22 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -88,8 +88,7 @@ jobs: uses: tauri-apps/tauri-action@v0 with: # Use the Tauri CLI directly; the action appends 'build' automatically. - tauriScript: yarn tauri:build - projectPath: src-tauri + tauriScript: yarn tauri # Disable updater.json handling and any release uploads for PR previews. includeUpdaterJson: false @@ -108,8 +107,6 @@ jobs: path: | src-tauri/target/release/bundle/**/*.deb src-tauri/target/release/bundle/**/*.AppImage - src-tauri/target/**/release/bundle/**/*.deb - src-tauri/target/**/release/bundle/**/*.AppImage if-no-files-found: warn retention-days: 14 From 4df8855de5c5bbff583fe50c8f7b521be054929f Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Mon, 27 Oct 2025 18:05:12 +0100 Subject: [PATCH 60/68] CI: add diagnostics to enumerate src-tauri/target/**/bundle outputs --- .github/workflows/ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f720aacd22..f83792e819 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -99,6 +99,12 @@ jobs: ls -la src-tauri/target/release || true ls -la src-tauri/target/release/bundle || true find src-tauri/target/release/bundle -maxdepth 3 -type f -print || true + echo "\nEnumerating any bundle folders under src-tauri/target (temporary diagnostics):" + # Show top-level target directories (e.g., x86_64-unknown-linux-gnu) + find src-tauri/target -maxdepth 2 -type d -print || true + echo "\nAll files found under any 'bundle' directory:" + # Print any files that exist under any bundle directory across target triples + find src-tauri/target -type f -path "*/bundle/*" -print || true - name: Upload Linux installers uses: actions/upload-artifact@v4 From 2fb37a5841dd2d58a56738ba313991a77e7615e4 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Mon, 27 Oct 2025 18:23:18 +0100 Subject: [PATCH 61/68] Clean up CI diagnostics - keep minimal bundle output check --- .github/workflows/ci.yml | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f83792e819..dc76dc8dba 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -95,16 +95,8 @@ jobs: - name: Inspect Tauri bundle output if: always() run: | - echo "Listing bundle directory (if present):" - ls -la src-tauri/target/release || true - ls -la src-tauri/target/release/bundle || true - find src-tauri/target/release/bundle -maxdepth 3 -type f -print || true - echo "\nEnumerating any bundle folders under src-tauri/target (temporary diagnostics):" - # Show top-level target directories (e.g., x86_64-unknown-linux-gnu) - find src-tauri/target -maxdepth 2 -type d -print || true - echo "\nAll files found under any 'bundle' directory:" - # Print any files that exist under any bundle directory across target triples - find src-tauri/target -type f -path "*/bundle/*" -print || true + echo "Bundle artifacts:" + find src-tauri/target/release/bundle -type f \( -name "*.deb" -o -name "*.AppImage" \) -print || true - name: Upload Linux installers uses: actions/upload-artifact@v4 From f06d78c8382feef64eb38a8be2e1603748e39d90 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Mon, 27 Oct 2025 18:25:51 +0100 Subject: [PATCH 62/68] Add Android APK build to CI workflow - New tauri-android-preview job for PR builds - Installs Java 17, Android SDK, and Rust Android targets - Builds debug APK using Tauri - Uploads APK artifact for testing --- .github/workflows/ci.yml | 61 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dc76dc8dba..653db6ea14 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -108,6 +108,67 @@ jobs: if-no-files-found: warn retention-days: 14 + tauri-android-preview: + name: Tauri Android preview (APK) + runs-on: ubuntu-latest + needs: node-ci + if: ${{ github.event_name == 'pull_request' }} + steps: + - name: Checkout + uses: actions/checkout@v5 + + - name: Setup Node + uses: actions/setup-node@v5 + with: + node-version-file: '.nvmrc' + cache: 'yarn' + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Setup Java 17 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + + - name: Setup Android SDK + uses: android-actions/setup-android@v3 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + + - name: Install Rust Android targets + run: | + rustup target add aarch64-linux-android + rustup target add armv7-linux-androideabi + rustup target add i686-linux-android + rustup target add x86_64-linux-android + + - name: Build web assets (Vite) + run: yarn build + + - name: Build Tauri Android APK + uses: tauri-apps/tauri-action@v0 + with: + tauriScript: yarn tauri android build + includeUpdaterJson: false + + - name: Inspect Android bundle output + if: always() + run: | + echo "Android APK artifacts:" + find src-tauri/gen/android -type f -name "*.apk" -print || true + + - name: Upload Android APK + uses: actions/upload-artifact@v4 + with: + name: android-apk + path: | + src-tauri/gen/android/app/build/outputs/apk/**/*.apk + if-no-files-found: warn + retention-days: 14 + docker-build: name: Docker build (optional) runs-on: ubuntu-latest From fd034c1cfbde5cfa193ef5729000b7fe7812dc18 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Mon, 27 Oct 2025 18:29:54 +0100 Subject: [PATCH 63/68] Fix Android build: remove duplicate 'build' argument tauri-action appends 'build' automatically, so use 'yarn tauri android' not 'yarn tauri android build' --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 653db6ea14..42983faa52 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -151,7 +151,7 @@ jobs: - name: Build Tauri Android APK uses: tauri-apps/tauri-action@v0 with: - tauriScript: yarn tauri android build + tauriScript: yarn tauri android includeUpdaterJson: false - name: Inspect Android bundle output From ab3e1ca7f5cde03b25d373a72c5b91d2666ddb07 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Mon, 27 Oct 2025 18:33:18 +0100 Subject: [PATCH 64/68] Android CI: add tauri android init step The Android project needs to be initialized before building. Run 'tauri android init --ci' to generate src-tauri/gen/android/ --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 42983faa52..2cf9c43f33 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -148,6 +148,9 @@ jobs: - name: Build web assets (Vite) run: yarn build + - name: Initialize Tauri Android project + run: yarn tauri android init --ci + - name: Build Tauri Android APK uses: tauri-apps/tauri-action@v0 with: From 6d0586d289aa188f8b032dc3bfdb7abb41a6ebf9 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Mon, 27 Oct 2025 20:11:41 +0100 Subject: [PATCH 65/68] Android: Implemented a local Tauri plugin named serialplugin that uses the Rust serialport crate --- src-tauri/Cargo.lock | 1 + src-tauri/Cargo.toml | 3 +++ src-tauri/src/main.rs | 12 +++++++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index d8c9a95056..ffc2c16029 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -100,6 +100,7 @@ version = "2025.12.0" dependencies = [ "serde", "serde_json", + "serialport", "tauri", "tauri-build", "tauri-plugin-serialplugin", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 17d9006fbe..9a57e3c3c2 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -25,6 +25,9 @@ serde_json = "1.0" [target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies] tauri-plugin-serialplugin = "2.21" +[target.'cfg(target_os = "android")'.dependencies] +serialport = "4.8" + [features] default = ["custom-protocol"] custom-protocol = ["tauri/custom-protocol"] diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 2c6af296d5..fbecbd774f 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -7,8 +7,15 @@ fn main() { let mut builder = tauri::Builder::default() .plugin(tauri_plugin_shell::init()); - #[cfg(not(any(target_os = "android", target_os = "ios")))] + #[cfg(target_os = "android")] { + // Local Android serial plugin that mirrors the commands used by the frontend + builder = builder.plugin(crate::serial_android::init_android()); + } + + #[cfg(not(target_os = "android"))] + { + // Desktop: use official plugin for now builder = builder.plugin(tauri_plugin_serialplugin::init()); } @@ -16,3 +23,6 @@ fn main() { .run(tauri::generate_context!()) .expect("error while running tauri application"); } + +#[cfg(target_os = "android")] +mod serial_android; From bf0ce5eb8a55344fd4eb26664af9232d0719649f Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Mon, 27 Oct 2025 20:51:02 +0100 Subject: [PATCH 66/68] Add missing serial_android_rs --- src-tauri/src/serial_android.rs | 120 ++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 src-tauri/src/serial_android.rs diff --git a/src-tauri/src/serial_android.rs b/src-tauri/src/serial_android.rs new file mode 100644 index 0000000000..629748c607 --- /dev/null +++ b/src-tauri/src/serial_android.rs @@ -0,0 +1,120 @@ +#[cfg(target_os = "android")] +use std::{collections::HashMap, io::{Read, Write}, sync::Mutex, time::Duration}; + +#[cfg(target_os = "android")] +use tauri::{plugin::Builder as PluginBuilder, Manager, Runtime, State}; + +#[cfg(target_os = "android")] +use serialport::{SerialPort, SerialPortType}; + +#[cfg(target_os = "android")] +type PortMap = Mutex>; + +#[cfg(target_os = "android")] +struct PortEntry { + port: Box, +} + +#[cfg(target_os = "android")] +#[derive(Debug, serde::Serialize, serde::Deserialize)] +struct OpenOptions { + path: String, + #[serde(default = "default_baud")] + baudRate: u32, +} + +#[cfg(target_os = "android")] +fn default_baud() -> u32 { 115_200 } + +#[cfg(target_os = "android")] +#[tauri::command] +fn available_ports_android() -> Result { + // Android: serialport enumeration is limited. Probe common device nodes. + let candidates = ["/dev/ttyACM0", "/dev/ttyUSB0"]; + let mut map = serde_json::Map::new(); + for path in candidates { + if std::fs::metadata(path).is_ok() { + // Provide fake but plausible VID/PID so UI filter accepts it. + // STM32 VCP: VID 1155 (0x0483), PID 22336 (0x57C0) + map.insert(path.to_string(), serde_json::json!({ + "vid": 1155, + "pid": 22336, + "serial_number": serde_json::Value::Null + })); + } + } + Ok(serde_json::Value::Object(map)) +} + +#[cfg(target_os = "android")] +#[tauri::command] +fn open_android(state: State<'_, PortMap>, opts: OpenOptions) -> Result { + let port = serialport::new(&opts.path, opts.baudRate) + .timeout(Duration::from_millis(100)) + .open() + .map_err(|e| format!("failed to open: {e}"))?; + let mut map = state.lock().unwrap(); + map.insert(opts.path, PortEntry { port }); + Ok(true) +} + +#[cfg(target_os = "android")] +#[tauri::command] +fn set_timeout_android(state: State<'_, PortMap>, path: String, timeout: u64) -> Result { + let mut map = state.lock().unwrap(); + let entry = map.get_mut(&path).ok_or_else(|| "port not open".to_string())?; + entry.port.set_timeout(Duration::from_millis(timeout)).map_err(|e| e.to_string())?; + Ok(true) +} + +#[cfg(target_os = "android")] +#[tauri::command] +fn read_binary_android(state: State<'_, PortMap>, path: String, size: usize, timeout: Option) -> Result, String> { + let mut map = state.lock().unwrap(); + let entry = map.get_mut(&path).ok_or_else(|| "port not open".to_string())?; + if let Some(ms) = timeout { let _ = entry.port.set_timeout(Duration::from_millis(ms)); } + let mut buf = vec![0u8; size.max(1)]; + match entry.port.read(buf.as_mut_slice()) { + Ok(n) if n > 0 => { buf.truncate(n); Ok(buf) }, + Ok(_n) => Err("no data received".to_string()), + Err(e) => { + let msg = e.to_string(); + if msg.to_lowercase().contains("timed out") { Err("no data received".to_string()) } else { Err(msg) } + } + } +} + +#[cfg(target_os = "android")] +#[tauri::command] +fn write_binary_android(state: State<'_, PortMap>, path: String, value: Vec) -> Result { + let mut map = state.lock().unwrap(); + let entry = map.get_mut(&path).ok_or_else(|| "port not open".to_string())?; + entry.port.write_all(&value).map_err(|e| e.to_string())?; + Ok(value.len()) +} + +#[cfg(target_os = "android")] +#[tauri::command] +fn close_android(state: State<'_, PortMap>, path: String) -> Result { + let mut map = state.lock().unwrap(); + map.remove(&path); + Ok(true) +} + +#[cfg(target_os = "android")] +pub fn init_android() -> tauri::plugin::TauriPlugin { + PluginBuilder::new("serialplugin") + .setup(|app, _api| { + app.manage(Mutex::new(HashMap::::new())); + Ok(()) + }) + .invoke_handler(tauri::generate_handler![ + available_ports_android, + open_android, + set_timeout_android, + read_binary_android, + write_binary_android, + close_android + ]) + .build() +} From f02c60d4cd30624de435139f86f65aafb79c488d Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Mon, 27 Oct 2025 22:16:31 +0100 Subject: [PATCH 67/68] Update tauri versions used --- package.json | 4 ++-- yarn.lock | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 25266157cc..63a846b603 100644 --- a/package.json +++ b/package.json @@ -69,8 +69,8 @@ "@capacitor/android": "^7.0.1", "@capacitor/core": "^7.0.1", "@fortawesome/fontawesome-free": "^6.5.2", - "@tauri-apps/api": "^2.5.0", - "@tauri-apps/cli": "^2.5.0", + "@tauri-apps/api": "^2.9.0", + "@tauri-apps/cli": "^2.9.1", "@vitejs/plugin-vue": "^6.0.1", "crypto-es": "^2.1.0", "d3": "^7.9.0", diff --git a/yarn.lock b/yarn.lock index bb8ac4ea22..f8a3a8b601 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2183,7 +2183,7 @@ magic-string "^0.25.0" string.prototype.matchall "^4.0.6" -"@tauri-apps/api@^2.5.0": +"@tauri-apps/api@^2.9.0": version "2.9.0" resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-2.9.0.tgz#047fcbfec05a719b0cec997eee244cee453fb2fc" integrity sha512-qD5tMjh7utwBk9/5PrTA/aGr3i5QaJ/Mlt7p8NilQ45WgbifUNPyKWsA63iQ8YfQq6R8ajMapU+/Q8nMcPRLNw== @@ -2243,7 +2243,7 @@ resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.9.1.tgz#d7c8512dd70f9aa8203f2011322542ec11f76b66" integrity sha512-/JHlOzpUDhjBOO9w167bcYxfJbcMQv7ykS/Y07xjtcga8np0rzUzVGWYmLMH7orKcDMC7wjhheEW1x8cbGma/Q== -"@tauri-apps/cli@^2.5.0": +"@tauri-apps/cli@^2.9.1": version "2.9.1" resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-2.9.1.tgz#cdc1cc6a005fef017b2a8f1a96d32537afc74579" integrity sha512-kKi2/WWsNXKoMdatBl4xrT7e1Ce27JvsetBVfWuIb6D3ep/Y0WO5SIr70yarXOSWam8NyDur4ipzjZkg6m7VDg== From 1a315d4e30ba56535cf9d829e843fd420d760105 Mon Sep 17 00:00:00 2001 From: Mark Haslinghuis Date: Mon, 27 Oct 2025 22:22:21 +0100 Subject: [PATCH 68/68] Remove unused error --- src/js/protocols/TauriSerial.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/protocols/TauriSerial.js b/src/js/protocols/TauriSerial.js index 9cd59a1cbe..322fec2190 100644 --- a/src/js/protocols/TauriSerial.js +++ b/src/js/protocols/TauriSerial.js @@ -58,7 +58,7 @@ class TauriSerial extends EventTarget { return this.connectionId; } - handleFatalSerialError(error) { + handleFatalSerialError() { // On fatal errors (broken pipe, etc.), just disconnect cleanly // Device monitoring will automatically detect the removal and emit removedDevice if (this.connected) {