From cad239064973146916368cf3959b93ec1c9edd7b Mon Sep 17 00:00:00 2001 From: Florian Briand Date: Mon, 23 Sep 2024 12:18:17 +0200 Subject: [PATCH 01/10] feat: replace desktop by a fresh Tauri install, and add a new frontend module using Nuxt --- Cargo.lock | 2157 ++++------------------ Cargo.toml | 1 - README.md | 48 +- crates/desktop/Cargo.toml | 15 +- crates/desktop/capabilities/default.json | 10 + crates/desktop/src/lib.rs | 86 +- crates/desktop/tauri.conf.json | 26 +- frontend/.gitignore | 24 + frontend/README.md | 77 + frontend/app.vue | 6 + frontend/bun.lockb | Bin 0 -> 281048 bytes frontend/nuxt.config.ts | 29 + frontend/package.json | 17 + frontend/public/favicon.ico | Bin 0 -> 4286 bytes frontend/public/robots.txt | 1 + frontend/server/tsconfig.json | 3 + frontend/tsconfig.json | 4 + 17 files changed, 555 insertions(+), 1949 deletions(-) create mode 100644 crates/desktop/capabilities/default.json create mode 100644 frontend/.gitignore create mode 100644 frontend/README.md create mode 100644 frontend/app.vue create mode 100755 frontend/bun.lockb create mode 100644 frontend/nuxt.config.ts create mode 100644 frontend/package.json create mode 100644 frontend/public/favicon.ico create mode 100644 frontend/public/robots.txt create mode 100644 frontend/server/tsconfig.json create mode 100644 frontend/tsconfig.json diff --git a/Cargo.lock b/Cargo.lock index f729483..2be0a25 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,15 +17,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" -[[package]] -name = "aho-corasick" -version = "0.7.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" -dependencies = [ - "memchr", -] - [[package]] name = "aho-corasick" version = "1.1.3" @@ -65,239 +56,12 @@ dependencies = [ "libc", ] -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "anyhow" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" -[[package]] -name = "app" -version = "0.1.0" -dependencies = [ - "askama", - "askama_axum", - "axum", - "axum-htmx", - "cargo-watch", - "listenfd", - "notify 6.1.1", - "serde", - "systemfd", - "thiserror", - "tokio", - "tower-http", - "tower-livereload", -] - -[[package]] -name = "askama" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b79091df18a97caea757e28cd2d5fda49c6cd4bd01ddffd7ff01ace0c0ad2c28" -dependencies = [ - "askama_derive", - "askama_escape", - "humansize", - "num-traits", - "percent-encoding", -] - -[[package]] -name = "askama_axum" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a41603f7cdbf5ac4af60760f17253eb6adf6ec5b6f14a7ed830cf687d375f163" -dependencies = [ - "askama", - "axum-core", - "http", -] - -[[package]] -name = "askama_derive" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19fe8d6cb13c4714962c072ea496f3392015f0989b1a2847bb4b2d9effd71d83" -dependencies = [ - "askama_parser", - "basic-toml", - "mime", - "mime_guess", - "proc-macro2", - "quote", - "serde", - "syn 2.0.72", -] - -[[package]] -name = "askama_escape" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" - -[[package]] -name = "askama_parser" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acb1161c6b64d1c3d83108213c2a2533a342ac225aabd0bda218278c2ddb00c0" -dependencies = [ - "nom 7.1.3", -] - -[[package]] -name = "async-broadcast" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" -dependencies = [ - "event-listener", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-channel" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-executor" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7ebdfa2ebdab6b1760375fa7d6f382b9f486eac35fc994625a00e89280bdbb7" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "slab", -] - -[[package]] -name = "async-fs" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" -dependencies = [ - "async-lock", - "blocking", - "futures-lite", -] - -[[package]] -name = "async-io" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" -dependencies = [ - "async-lock", - "cfg-if 1.0.0", - "concurrent-queue", - "futures-io", - "futures-lite", - "parking", - "polling", - "rustix", - "slab", - "tracing", - "windows-sys 0.52.0", -] - -[[package]] -name = "async-lock" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" -dependencies = [ - "event-listener", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-process" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7eda79bbd84e29c2b308d1dc099d7de8dcc7035e48f4bf5dc4a531a44ff5e2a" -dependencies = [ - "async-channel", - "async-io", - "async-lock", - "async-signal", - "async-task", - "blocking", - "cfg-if 1.0.0", - "event-listener", - "futures-lite", - "rustix", - "tracing", - "windows-sys 0.52.0", -] - -[[package]] -name = "async-recursion" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "async-signal" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfb3634b73397aa844481f814fad23bbf07fdb0eabec10f2eb95e58944b1ec32" -dependencies = [ - "async-io", - "async-lock", - "atomic-waker", - "cfg-if 1.0.0", - "futures-core", - "futures-io", - "rustix", - "signal-hook-registry", - "slab", - "windows-sys 0.52.0", -] - -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - -[[package]] -name = "async-trait" -version = "0.1.81" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - [[package]] name = "atk" version = "0.18.0" @@ -321,98 +85,12 @@ dependencies = [ "system-deps", ] -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi 0.3.9", -] - [[package]] name = "autocfg" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" -[[package]] -name = "axum" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" -dependencies = [ - "async-trait", - "axum-core", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "itoa 1.0.11", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sync_wrapper 1.0.1", - "tokio", - "tower", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-core" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper 0.1.2", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-htmx" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36cdb6062317f732ed3acf4e9c28c3824092e226726616f46ebdd8cd32c82a41" -dependencies = [ - "async-trait", - "axum-core", - "futures", - "http", - "tokio", - "tower", -] - [[package]] name = "backtrace" version = "0.3.73" @@ -421,7 +99,7 @@ checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", - "cfg-if 1.0.0", + "cfg-if", "libc", "miniz_oxide", "object", @@ -440,15 +118,6 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "basic-toml" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "823388e228f614e9558c6804262db37960ec8821856535f5c3f59913140558f8" -dependencies = [ - "serde", -] - [[package]] name = "bitflags" version = "1.3.2" @@ -488,24 +157,11 @@ dependencies = [ "objc2", ] -[[package]] -name = "blocking" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" -dependencies = [ - "async-channel", - "async-task", - "futures-io", - "futures-lite", - "piper", -] - [[package]] name = "brotli" -version = "3.5.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391" +checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -514,23 +170,14 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.5.1" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", ] -[[package]] -name = "bstr" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" -dependencies = [ - "memchr", -] - [[package]] name = "bumpalo" version = "3.16.0" @@ -601,37 +248,6 @@ dependencies = [ "serde", ] -[[package]] -name = "cargo-watch" -version = "8.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9567d1518a2ec25bb3cce963f8a3fd4b86b5bbdb210f415f461cfb8c4e2aa2" -dependencies = [ - "camino", - "cargo_metadata 0.17.0", - "clap", - "dotenvy", - "log", - "notify-rust", - "shell-escape", - "stderrlog", - "watchexec", -] - -[[package]] -name = "cargo_metadata" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7daec1a2a2129eeba1644b220b4647ec537b0b5d4bfd6876fcc5a540056b592" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", - "thiserror", -] - [[package]] name = "cargo_metadata" version = "0.18.1" @@ -676,7 +292,7 @@ checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" dependencies = [ "byteorder", "fnv", - "uuid 1.10.0", + "uuid", ] [[package]] @@ -689,12 +305,6 @@ dependencies = [ "target-lexicon", ] -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - [[package]] name = "cfg-if" version = "1.0.0" @@ -715,41 +325,11 @@ checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", - "js-sys", "num-traits", "serde", - "wasm-bindgen", "windows-targets 0.52.6", ] -[[package]] -name = "clap" -version = "2.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" -dependencies = [ - "ansi_term", - "atty", - "bitflags 1.3.2", - "strsim 0.8.0", - "textwrap", - "unicode-width", - "vec_map", -] - -[[package]] -name = "clearscreen" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e55dadbdd203f69c0a107bc78fca6e47d605345610ee77dcf24203fdf510b317" -dependencies = [ - "nix 0.24.3", - "terminfo", - "thiserror", - "which", - "winapi 0.3.9", -] - [[package]] name = "cocoa" version = "0.25.0" @@ -758,9 +338,25 @@ checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" dependencies = [ "bitflags 1.3.2", "block", - "cocoa-foundation", - "core-foundation", - "core-graphics", + "cocoa-foundation 0.1.2", + "core-foundation 0.9.4", + "core-graphics 0.23.2", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" +dependencies = [ + "bitflags 2.6.0", + "block", + "cocoa-foundation 0.2.0", + "core-foundation 0.10.0", + "core-graphics 0.24.0", "foreign-types", "libc", "objc", @@ -774,8 +370,22 @@ checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" dependencies = [ "bitflags 1.3.2", "block", - "core-foundation", - "core-graphics-types", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d" +dependencies = [ + "bitflags 2.6.0", + "block", + "core-foundation 0.10.0", + "core-graphics-types 0.2.0", "libc", "objc", ] @@ -790,38 +400,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "command-group" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7a8a86f409b4a59df3a3e4bee2de0b83f1755fdd2a25e3a9684c396fc4bed2c" -dependencies = [ - "nix 0.22.3", - "winapi 0.3.9", -] - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "console" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" -dependencies = [ - "encode_unicode", - "lazy_static", - "libc", - "unicode-width", - "windows-sys 0.52.0", -] - [[package]] name = "convert_case" version = "0.4.0" @@ -839,10 +417,20 @@ dependencies = [ ] [[package]] -name = "core-foundation-sys" -version = "0.8.6" +name = "core-foundation" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +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" @@ -851,8 +439,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" dependencies = [ "bitflags 1.3.2", - "core-foundation", - "core-graphics-types", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" +dependencies = [ + "bitflags 2.6.0", + "core-foundation 0.10.0", + "core-graphics-types 0.2.0", "foreign-types", "libc", ] @@ -864,7 +465,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", + "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.6.0", + "core-foundation 0.10.0", "libc", ] @@ -883,7 +495,7 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -948,38 +560,14 @@ dependencies = [ "syn 2.0.72", ] -[[package]] -name = "darling" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f2c43f534ea4b0b049015d00269734195e6d3f0f6635cb692251aca6f9f8b3c" -dependencies = [ - "darling_core 0.12.4", - "darling_macro 0.12.4", -] - [[package]] name = "darling" version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ - "darling_core 0.20.10", - "darling_macro 0.20.10", -] - -[[package]] -name = "darling_core" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e91455b86830a1c21799d94524df0845183fa55bafd9aa137b01c7d1065fa36" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", - "syn 1.0.109", + "darling_core", + "darling_macro", ] [[package]] @@ -992,28 +580,17 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim 0.11.1", + "strsim", "syn 2.0.72", ] -[[package]] -name = "darling_macro" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29b5acf0dea37a7f66f7b25d2c5e93fd46f8f6968b1a5d7a3e02e97768afc95a" -dependencies = [ - "darling_core 0.12.4", - "quote", - "syn 1.0.109", -] - [[package]] name = "darling_macro" version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ - "darling_core 0.20.10", + "darling_core", "quote", "syn 2.0.72", ] @@ -1028,37 +605,6 @@ dependencies = [ "serde", ] -[[package]] -name = "derive_builder" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d13202debe11181040ae9063d739fa32cfcaaebe2275fe387703460ae2365b30" -dependencies = [ - "derive_builder_macro", -] - -[[package]] -name = "derive_builder_core" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66e616858f6187ed828df7c64a6d71720d83767a7f19740b2d1b6fe6327b36e5" -dependencies = [ - "darling 0.12.4", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_builder_macro" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58a94ace95092c5acb1e97a7e846b310cfbd499652f72297da7493f618a98d73" -dependencies = [ - "derive_builder_core", - "syn 1.0.109", -] - [[package]] name = "derive_more" version = "0.99.18" @@ -1076,15 +622,11 @@ dependencies = [ name = "desktop" version = "0.1.0" dependencies = [ - "app", - "axum", - "bytes", - "http", + "serde", + "serde_json", "tauri", "tauri-build", - "thiserror", - "tokio", - "tower", + "tauri-plugin-shell", ] [[package]] @@ -1103,16 +645,7 @@ version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" dependencies = [ - "dirs-sys 0.4.1", -] - -[[package]] -name = "dirs" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" -dependencies = [ - "dirs-sys 0.3.7", + "dirs-sys", ] [[package]] @@ -1121,28 +654,7 @@ version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" dependencies = [ - "dirs-sys 0.4.1", -] - -[[package]] -name = "dirs-next" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" -dependencies = [ - "cfg-if 1.0.0", - "dirs-sys-next", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi 0.3.9", + "dirs-sys", ] [[package]] @@ -1157,17 +669,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "dirs-sys-next" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" -dependencies = [ - "libc", - "redox_users", - "winapi 0.3.9", -] - [[package]] name = "dispatch" version = "0.2.0" @@ -1183,7 +684,7 @@ dependencies = [ "dlopen2_derive", "libc", "once_cell", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -1203,12 +704,6 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" -[[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - [[package]] name = "dpi" version = "0.1.1" @@ -1245,12 +740,6 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - [[package]] name = "embed-resource" version = "2.4.3" @@ -1272,36 +761,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" [[package]] -name = "encode_unicode" -version = "0.3.6" +name = "encoding_rs" +version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" - -[[package]] -name = "endi" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" - -[[package]] -name = "enumflags2" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", + "cfg-if", ] [[package]] @@ -1320,43 +785,6 @@ dependencies = [ "typeid", ] -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "event-listener" -version = "5.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" -dependencies = [ - "event-listener", - "pin-project-lite", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - [[package]] name = "fdeflate" version = "0.3.4" @@ -1372,22 +800,10 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" dependencies = [ - "memoffset 0.9.1", + "memoffset", "rustc_version", ] -[[package]] -name = "filetime" -version = "0.2.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "redox_syscall 0.4.1", - "windows-sys 0.52.0", -] - [[package]] name = "flate2" version = "1.0.30" @@ -1398,6 +814,15 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "fluent-uri" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17c704e9dbe1ddd863da1e6ff3567795087b1eb201ce80d8fa81162e1516500d" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1440,50 +865,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fsevent" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab7d1bd1bd33cc98b0889831b72da23c0aa4df9cec7e0702f46ecea04b35db6" -dependencies = [ - "bitflags 1.3.2", - "fsevent-sys 2.0.1", -] - -[[package]] -name = "fsevent-sys" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f41b048a94555da0f42f1d632e2e19510084fb8e303b0daa2816e733fb3644a0" -dependencies = [ - "libc", -] - -[[package]] -name = "fsevent-sys" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" -dependencies = [ - "libc", -] - -[[package]] -name = "fuchsia-zircon" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" -dependencies = [ - "bitflags 1.3.2", - "fuchsia-zircon-sys", -] - -[[package]] -name = "fuchsia-zircon-sys" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" - [[package]] name = "futf" version = "0.1.5" @@ -1494,20 +875,6 @@ dependencies = [ "new_debug_unreachable", ] -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - [[package]] name = "futures-channel" version = "0.3.30" @@ -1515,7 +882,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", - "futures-sink", ] [[package]] @@ -1541,19 +907,6 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" -[[package]] -name = "futures-lite" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - [[package]] name = "futures-macro" version = "0.3.30" @@ -1731,7 +1084,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "wasi 0.9.0+wasi-snapshot-preview1", ] @@ -1742,7 +1095,7 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "wasi 0.11.0+wasi-snapshot-preview1", ] @@ -1782,7 +1135,7 @@ dependencies = [ "gobject-sys", "libc", "system-deps", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -1838,19 +1191,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" -[[package]] -name = "globset" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c152169ef1e421390738366d2f796655fec62621dabbd0fd476f905934061e4a" -dependencies = [ - "aho-corasick 0.7.20", - "bstr", - "fnv", - "log", - "regex", -] - [[package]] name = "gobject-sys" version = "0.18.0" @@ -1938,42 +1278,18 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" -[[package]] -name = "hermit-abi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" - [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - [[package]] name = "html5ever" version = "0.26.0" @@ -2022,33 +1338,12 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "http-range-header" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08a397c49fec283e3d6211adbe480be95aae5f304cfb923e9970e08956d5168a" - [[package]] name = "httparse" version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "humansize" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7" -dependencies = [ - "libm", -] - [[package]] name = "hyper" version = "1.4.1" @@ -2061,7 +1356,6 @@ dependencies = [ "http", "http-body", "httparse", - "httpdate", "itoa 1.0.11", "pin-project-lite", "smallvec", @@ -2082,7 +1376,7 @@ dependencies = [ "http-body", "hyper", "pin-project-lite", - "socket2 0.5.7", + "socket2", "tokio", "tower", "tower-service", @@ -2162,60 +1456,20 @@ dependencies = [ [[package]] name = "infer" -version = "0.15.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb33622da908807a06f9513c19b3c1ad50fab3e4137d82a78107d502075aa199" +checksum = "bc150e5ce2330295b8616ce0e3f53250e53af31759a9dbedad1621ba29151847" dependencies = [ "cfb", ] -[[package]] -name = "inotify" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4816c66d2c8ae673df83366c18341538f234a26d65a9ecea5c348b453ac1d02f" -dependencies = [ - "bitflags 1.3.2", - "inotify-sys", - "libc", -] - -[[package]] -name = "inotify" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" -dependencies = [ - "bitflags 1.3.2", - "inotify-sys", - "libc", -] - -[[package]] -name = "inotify-sys" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" -dependencies = [ - "libc", -] - [[package]] name = "instant" version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "iovec" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" -dependencies = [ - "libc", + "cfg-if", ] [[package]] @@ -2224,6 +1478,25 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[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" @@ -2266,7 +1539,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ "cesu8", - "cfg-if 1.0.0", + "cfg-if", "combine", "jni-sys", "log", @@ -2292,23 +1565,25 @@ dependencies = [ [[package]] name = "json-patch" -version = "1.4.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec9ad60d674508f3ca8f380a928cfe7b096bc729c4e2dbfe3852bc45da3ab30b" +checksum = "5b1fb8864823fad91877e6caea0baca82e49e8db50f8e5c9f9a453e27d3330fc" dependencies = [ + "jsonptr", "serde", "serde_json", "thiserror", ] [[package]] -name = "kernel32-sys" -version = "0.2.2" +name = "jsonptr" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +checksum = "1c6e529149475ca0b2820835d3dce8fcc41c6b943ca608d32f35b449255e4627" dependencies = [ - "winapi 0.2.8", - "winapi-build", + "fluent-uri", + "serde", + "serde_json", ] [[package]] @@ -2322,26 +1597,6 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "kqueue" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" -dependencies = [ - "kqueue-sys", - "libc", -] - -[[package]] -name = "kqueue-sys" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" -dependencies = [ - "bitflags 1.3.2", - "libc", -] - [[package]] name = "kuchikiki" version = "0.8.2" @@ -2361,12 +1616,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "libappindicator" version = "0.9.0" @@ -2403,16 +1652,10 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" dependencies = [ - "cfg-if 1.0.0", - "winapi 0.3.9", + "cfg-if", + "winapi", ] -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - [[package]] name = "libredox" version = "0.1.3" @@ -2423,23 +1666,6 @@ dependencies = [ "libc", ] -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "listenfd" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0500463acd96259d219abb05dc57e5a076ef04b2db9a2112846929b5f174c96" -dependencies = [ - "libc", - "uuid 1.10.0", - "winapi 0.3.9", -] - [[package]] name = "lock_api" version = "0.4.12" @@ -2462,7 +1688,7 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "generator", "scoped-tls", "serde", @@ -2477,19 +1703,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" -[[package]] -name = "mac-notification-sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51fca4d74ff9dbaac16a01b924bc3693fa2bba0862c2c633abc73f9a8ea21f64" -dependencies = [ - "cc", - "dirs-next", - "objc-foundation", - "objc_id", - "time", -] - [[package]] name = "malloc_buf" version = "0.0.6" @@ -2528,27 +1741,12 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" -[[package]] -name = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" - [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.9.1" @@ -2564,22 +1762,6 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "mime_guess" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" -dependencies = [ - "mime", - "unicase", -] - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "miniz_oxide" version = "0.7.4" @@ -2590,80 +1772,25 @@ dependencies = [ "simd-adler32", ] -[[package]] -name = "mio" -version = "0.6.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" -dependencies = [ - "cfg-if 0.1.10", - "fuchsia-zircon", - "fuchsia-zircon-sys", - "iovec", - "kernel32-sys", - "libc", - "log", - "miow", - "net2", - "slab", - "winapi 0.2.8", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "log", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.48.0", -] - [[package]] name = "mio" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi", "libc", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] -[[package]] -name = "mio-extras" -version = "2.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" -dependencies = [ - "lazycell", - "log", - "mio 0.6.23", - "slab", -] - -[[package]] -name = "miow" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" -dependencies = [ - "kernel32-sys", - "net2", - "winapi 0.2.8", - "ws2_32-sys", -] - [[package]] name = "muda" -version = "0.13.5" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b959f97c97044e4c96e32e1db292a7d594449546a3c6b77ae613dc3a5b5145" +checksum = "ba8ac4080fb1e097c2c22acae467e46e4da72d941f02e82b67a87a2a89fa38b1" dependencies = [ - "cocoa", + "cocoa 0.26.0", "crossbeam-channel", "dpi", "gtk", @@ -2673,20 +1800,21 @@ dependencies = [ "png", "serde", "thiserror", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "ndk" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "jni-sys", + "log", "ndk-sys", "num_enum", - "raw-window-handle 0.5.2", + "raw-window-handle", "thiserror", ] @@ -2698,156 +1826,25 @@ checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" [[package]] name = "ndk-sys" -version = "0.4.1+23.1.7779620" +version = "0.6.0+11769913" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" dependencies = [ "jni-sys", ] -[[package]] -name = "net2" -version = "0.2.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac" -dependencies = [ - "cfg-if 0.1.10", - "libc", - "winapi 0.3.9", -] - [[package]] name = "new_debug_unreachable" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" -[[package]] -name = "nix" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" -dependencies = [ - "bitflags 1.3.2", - "cc", - "cfg-if 1.0.0", - "libc", - "memoffset 0.6.5", -] - -[[package]] -name = "nix" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" -dependencies = [ - "bitflags 1.3.2", - "cc", - "cfg-if 1.0.0", - "libc", - "memoffset 0.6.5", -] - -[[package]] -name = "nix" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" -dependencies = [ - "bitflags 1.3.2", - "cfg-if 1.0.0", - "libc", -] - -[[package]] -name = "nix" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" -dependencies = [ - "bitflags 2.6.0", - "cfg-if 1.0.0", - "cfg_aliases", - "libc", - "memoffset 0.9.1", -] - [[package]] name = "nodrop" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" -[[package]] -name = "nom" -version = "5.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08959a387a676302eebf4ddbcbc611da04285579f76f88ee0506c63b1a61dd4b" -dependencies = [ - "memchr", - "version_check", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "notify" -version = "4.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b72dd35279a5dc895a30965e247b0961ba36c233dc48454a2de8ccd459f1afd3" -dependencies = [ - "bitflags 1.3.2", - "filetime", - "fsevent", - "fsevent-sys 2.0.1", - "inotify 0.7.1", - "libc", - "mio 0.6.23", - "mio-extras", - "walkdir", - "winapi 0.3.9", -] - -[[package]] -name = "notify" -version = "6.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" -dependencies = [ - "bitflags 2.6.0", - "crossbeam-channel", - "filetime", - "fsevent-sys 4.1.0", - "inotify 0.9.6", - "kqueue", - "libc", - "log", - "mio 0.8.11", - "walkdir", - "windows-sys 0.48.0", -] - -[[package]] -name = "notify-rust" -version = "4.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26a1d03b6305ecefdd9c6c60150179bb8d9f0cd4e64bbcad1e41419e7bf5e414" -dependencies = [ - "log", - "mac-notification-sys", - "serde", - "tauri-winrt-notification", - "zbus", -] - [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -2855,7 +1852,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" dependencies = [ "overload", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -2875,23 +1872,23 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.5.11" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.5.11" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.72", ] [[package]] @@ -2904,17 +1901,6 @@ dependencies = [ "objc_exception", ] -[[package]] -name = "objc-foundation" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" -dependencies = [ - "block", - "objc", - "objc_id", -] - [[package]] name = "objc-sys" version = "0.3.5" @@ -3048,6 +2034,17 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "open" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61a877bf6abd716642a53ef1b89fb498923a4afca5c754f9050b4d081c05c4b3" +dependencies = [ + "is-wsl", + "libc", + "pathdiff", +] + [[package]] name = "option-ext" version = "0.2.0" @@ -3055,13 +2052,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] -name = "ordered-stream" -version = "0.2.0" +name = "os_pipe" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +checksum = "5ffd2b0a5634335b135d5728d84c5e0fd726954b87111f7506a61c502280d982" dependencies = [ - "futures-core", - "pin-project-lite", + "libc", + "windows-sys 0.59.0", ] [[package]] @@ -3095,12 +2092,6 @@ dependencies = [ "system-deps", ] -[[package]] -name = "parking" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" - [[package]] name = "parking_lot" version = "0.12.3" @@ -3117,13 +2108,19 @@ version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", - "redox_syscall 0.5.3", + "redox_syscall", "smallvec", "windows-targets 0.52.6", ] +[[package]] +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + [[package]] name = "percent-encoding" version = "2.3.1" @@ -3180,16 +2177,6 @@ dependencies = [ "phf_shared 0.10.0", ] -[[package]] -name = "phf_codegen" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" -dependencies = [ - "phf_generator 0.11.2", - "phf_shared 0.11.2", -] - [[package]] name = "phf_generator" version = "0.8.0" @@ -3306,17 +2293,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "piper" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" -dependencies = [ - "atomic-waker", - "fastrand", - "futures-io", -] - [[package]] name = "pkg-config" version = "0.3.30" @@ -3331,7 +2307,7 @@ checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" dependencies = [ "base64 0.22.1", "indexmap 2.2.6", - "quick-xml 0.32.0", + "quick-xml", "serde", "time", ] @@ -3349,21 +2325,6 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "polling" -version = "3.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b" -dependencies = [ - "cfg-if 1.0.0", - "concurrent-queue", - "hermit-abi 0.4.0", - "pin-project-lite", - "rustix", - "tracing", - "windows-sys 0.52.0", -] - [[package]] name = "powerfmt" version = "0.2.0" @@ -3449,15 +2410,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "quick-xml" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" -dependencies = [ - "memchr", -] - [[package]] name = "quick-xml" version = "0.32.0" @@ -3557,27 +2509,12 @@ dependencies = [ "rand_core 0.5.1", ] -[[package]] -name = "raw-window-handle" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" - [[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.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.5.3" @@ -3604,7 +2541,7 @@ version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ - "aho-corasick 1.1.3", + "aho-corasick", "memchr", "regex-automata 0.4.7", "regex-syntax 0.8.4", @@ -3625,7 +2562,7 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ - "aho-corasick 1.1.3", + "aho-corasick", "memchr", "regex-syntax 0.8.4", ] @@ -3667,7 +2604,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.1", + "sync_wrapper", "tokio", "tokio-util", "tower-service", @@ -3694,19 +2631,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags 2.6.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - [[package]] name = "rustversion" version = "1.0.17" @@ -3848,16 +2772,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_path_to_error" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" -dependencies = [ - "itoa 1.0.11", - "serde", -] - [[package]] name = "serde_repr" version = "0.1.19" @@ -3914,7 +2828,7 @@ version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" dependencies = [ - "darling 0.20.10", + "darling", "proc-macro2", "quote", "syn 2.0.72", @@ -3963,24 +2877,13 @@ dependencies = [ "utils", ] -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "digest", -] - [[package]] name = "sha2" version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest", ] @@ -3995,18 +2898,13 @@ dependencies = [ ] [[package]] -name = "shell-escape" -version = "0.1.5" +name = "shared_child" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f" - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "09fa9338aed9a1df411814a5b2252f7cd206c55ae9bf2fa763f8de84603aa60c" dependencies = [ "libc", + "windows-sys 0.59.0", ] [[package]] @@ -4036,17 +2934,6 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" -[[package]] -name = "socket2" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "winapi 0.3.9", -] - [[package]] name = "socket2" version = "0.5.7" @@ -4065,7 +2952,7 @@ checksum = "d623bff5d06f60d738990980d782c8c866997d9194cfe79ecad00aa2f76826dd" dependencies = [ "bytemuck", "cfg_aliases", - "core-graphics", + "core-graphics 0.23.2", "foreign-types", "js-sys", "log", @@ -4073,8 +2960,8 @@ dependencies = [ "objc2-app-kit", "objc2-foundation", "objc2-quartz-core", - "raw-window-handle 0.6.2", - "redox_syscall 0.5.3", + "raw-window-handle", + "redox_syscall", "wasm-bindgen", "web-sys", "windows-sys 0.52.0", @@ -4121,25 +3008,6 @@ dependencies = [ "loom", ] -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "stderrlog" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69a26bbf6de627d389164afa9783739b56746c6c72c4ed16539f4ff54170327b" -dependencies = [ - "atty", - "chrono", - "log", - "termcolor", - "thread_local", -] - [[package]] name = "string_cache" version = "0.8.7" @@ -4166,18 +3034,6 @@ dependencies = [ "quote", ] -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strsim" version = "0.11.1" @@ -4186,9 +3042,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "swift-rs" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bbdb58577b6301f8d17ae2561f32002a5bae056d444e0f69e611e504a276204" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" dependencies = [ "base64 0.21.7", "serde", @@ -4217,12 +3073,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - [[package]] name = "sync_wrapper" version = "1.0.1" @@ -4242,35 +3092,16 @@ dependencies = [ "version-compare", ] -[[package]] -name = "systemfd" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b01b768cd5bfe832b494513815ce9a0b18ab5453bf6e1a201c2c0cde56d893a9" -dependencies = [ - "anyhow", - "clap", - "console", - "lazy_static", - "libc", - "nix 0.23.2", - "regex", - "socket2 0.3.19", - "thiserror", - "uuid 0.8.2", - "winapi 0.3.9", -] - [[package]] name = "tao" -version = "0.28.1" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea538df05fbc2dcbbd740ba0cfe8607688535f4798d213cbbfa13ce494f3451f" +checksum = "82e7ede56f9ef03a0bb384c7b2bed4f3985ee7f3f79ec887c50d8466eec21096" dependencies = [ "bitflags 2.6.0", - "cocoa", - "core-foundation", - "core-graphics", + "cocoa 0.26.0", + "core-foundation 0.10.0", + "core-graphics 0.24.0", "crossbeam-channel", "dispatch", "dlopen2", @@ -4289,13 +3120,13 @@ dependencies = [ "objc", "once_cell", "parking_lot", - "raw-window-handle 0.6.2", + "raw-window-handle", "scopeguard", "tao-macros", "unicode-segmentation", "url", - "windows 0.57.0", - "windows-core 0.57.0", + "windows 0.58.0", + "windows-core 0.58.0", "windows-version", "x11-dl", ] @@ -4319,14 +3150,13 @@ checksum = "4873307b7c257eddcb50c9bedf158eb669578359fb28428bef438fec8e6ba7c2" [[package]] name = "tauri" -version = "2.0.0-beta.24" +version = "2.0.0-rc.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eab508aad4ae86e23865e294b20a7bb89bd7afea523897b7478329b841d4295" +checksum = "eb3c3b1c7ac5b72d59da307b84af900a0098c74c9d7369f65018cd8ec0eb50fb" dependencies = [ "anyhow", "bytes", - "cocoa", - "dirs 5.0.1", + "dirs", "dunce", "embed_plist", "futures-util", @@ -4340,9 +3170,12 @@ dependencies = [ "log", "mime", "muda", - "objc", + "objc2", + "objc2-app-kit", + "objc2-foundation", "percent-encoding", - "raw-window-handle 0.6.2", + "plist", + "raw-window-handle", "reqwest", "serde", "serde_json", @@ -4363,18 +3196,18 @@ dependencies = [ "webkit2gtk", "webview2-com", "window-vibrancy", - "windows 0.57.0", + "windows 0.58.0", ] [[package]] name = "tauri-build" -version = "2.0.0-beta.19" +version = "2.0.0-rc.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "498f587026501e4bbc5d6273b63f8956b03c37b3d3b2027f9c756fcd468e9c62" +checksum = "6ff5713e81e02e0b99f5219b275abbd7d2c0cc0f30180e25b1b650e08feeac63" dependencies = [ "anyhow", "cargo_toml", - "dirs 5.0.1", + "dirs", "glob", "heck 0.5.0", "json-patch", @@ -4390,9 +3223,9 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.0.0-beta.19" +version = "2.0.0-rc.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43bbc731067e319ef60601bf5716d1e706ee9ae28e38c0587f7165c7d6824cdf" +checksum = "5370f2591dcc93d4ff08d9dd168f5097f79b34e859883586a409c627544190e3" dependencies = [ "base64 0.22.1", "brotli", @@ -4411,15 +3244,15 @@ dependencies = [ "thiserror", "time", "url", - "uuid 1.10.0", + "uuid", "walkdir", ] [[package]] name = "tauri-macros" -version = "2.0.0-beta.19" +version = "2.0.0-rc.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36b4a44346577ccde75a24c62405a4c3b4f7a3a76614ee6cf1ed14a0b756795c" +checksum = "19442dc8ee002ab1926586f6aecb90114f3a1226766008b0c9ac2d9fec9eeb7e" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -4430,37 +3263,77 @@ dependencies = [ ] [[package]] -name = "tauri-runtime" -version = "2.0.0-beta.20" +name = "tauri-plugin" +version = "2.0.0-rc.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe978df03966febbebc608931dc2cf26ef94df70855a18b05f07134cf474de09" +checksum = "5e3368e91a98aa55ea4e3e8ccff516bc1ed2f85872c335ec35e9b345469032e0" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars", + "serde", + "serde_json", + "tauri-utils", + "toml 0.8.16", + "walkdir", +] + +[[package]] +name = "tauri-plugin-shell" +version = "2.0.0-rc.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83800ddf78b820172efb5ed7310344e8e4f97fd30cd8237a3f20c12a79eb136" +dependencies = [ + "encoding_rs", + "log", + "open", + "os_pipe", + "regex", + "schemars", + "serde", + "serde_json", + "shared_child", + "tauri", + "tauri-plugin", + "thiserror", + "tokio", +] + +[[package]] +name = "tauri-runtime" +version = "2.0.0-rc.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f38d8aaa1e81d20e8e208e3e317f81b59fb75c530fbae8a90e72d02001d687" dependencies = [ "dpi", "gtk", "http", "jni", - "raw-window-handle 0.6.2", + "raw-window-handle", "serde", "serde_json", "tauri-utils", "thiserror", "url", - "windows 0.57.0", + "windows 0.58.0", ] [[package]] name = "tauri-runtime-wry" -version = "2.0.0-beta.20" +version = "2.0.0-rc.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11e4d568f61095f507b3fc4254dfbfff3b20de2a1d66167ffca3f6d90b14db8f" +checksum = "cf1ef5171e14c8fe3b5a63e75004c20d057747bc3e7fdc5f8ded625f0b29f5c7" dependencies = [ - "cocoa", "gtk", "http", "jni", "log", + "objc2", + "objc2-app-kit", + "objc2-foundation", "percent-encoding", - "raw-window-handle 0.6.2", + "raw-window-handle", "softbuffer", "tao", "tauri-runtime", @@ -4468,18 +3341,18 @@ dependencies = [ "url", "webkit2gtk", "webview2-com", - "windows 0.57.0", + "windows 0.58.0", "wry", ] [[package]] name = "tauri-utils" -version = "2.0.0-beta.19" +version = "2.0.0-rc.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e20e51856f343c503892749b27d34042e6ca83a0369a12de3c5552d9874d04e8" +checksum = "31fe4c9148e1b35225e1c00753f24b517ce00041d02eb4b4d6fd10613a47736c" dependencies = [ "brotli", - "cargo_metadata 0.18.1", + "cargo_metadata", "ctor", "dunce", "glob", @@ -4517,30 +3390,6 @@ dependencies = [ "toml 0.7.8", ] -[[package]] -name = "tauri-winrt-notification" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f89f5fb70d6f62381f5d9b2ba9008196150b40b75f3068eb24faeddf1c686871" -dependencies = [ - "quick-xml 0.31.0", - "windows 0.56.0", - "windows-version", -] - -[[package]] -name = "tempfile" -version = "3.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" -dependencies = [ - "cfg-if 1.0.0", - "fastrand", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] - [[package]] name = "tendril" version = "0.4.3" @@ -4552,37 +3401,6 @@ dependencies = [ "utf-8", ] -[[package]] -name = "termcolor" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "terminfo" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da31aef70da0f6352dbcb462683eb4dd2bfad01cf3fc96cf204547b9a839a585" -dependencies = [ - "dirs 4.0.0", - "fnv", - "nom 5.1.3", - "phf 0.11.2", - "phf_codegen 0.11.2", -] - -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - [[package]] name = "thin-slice" version = "0.1.1" @@ -4615,7 +3433,7 @@ version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "once_cell", ] @@ -4674,24 +3492,12 @@ dependencies = [ "backtrace", "bytes", "libc", - "mio 1.0.1", + "mio", "pin-project-lite", - "socket2 0.5.7", - "tokio-macros", + "socket2", "windows-sys 0.52.0", ] -[[package]] -name = "tokio-macros" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - [[package]] name = "tokio-util" version = "0.7.11" @@ -4799,32 +3605,6 @@ dependencies = [ "tokio", "tower-layer", "tower-service", - "tracing", -] - -[[package]] -name = "tower-http" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" -dependencies = [ - "bitflags 2.6.0", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "http-range-header", - "httpdate", - "mime", - "mime_guess", - "percent-encoding", - "pin-project-lite", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", ] [[package]] @@ -4833,20 +3613,6 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" -[[package]] -name = "tower-livereload" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d7d9fecf1242d1c6a3cf8f7f3c2da94e6aac553bb7062ab6d03e16b9872fd0" -dependencies = [ - "bytes", - "http", - "http-body", - "pin-project-lite", - "tokio", - "tower", -] - [[package]] name = "tower-service" version = "0.3.2" @@ -4859,7 +3625,6 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -4917,22 +3682,23 @@ dependencies = [ [[package]] name = "tray-icon" -version = "0.14.3" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ad8319cca93189ea9ab1b290de0595960529750b6b8b501a399ed1ec3775d60" +checksum = "044d7738b3d50f288ddef035b793228740ad4d927f5466b0af55dc15e7e03cfe" dependencies = [ - "cocoa", - "core-graphics", + "core-graphics 0.24.0", "crossbeam-channel", - "dirs 5.0.1", + "dirs", "libappindicator", "muda", - "objc", + "objc2", + "objc2-app-kit", + "objc2-foundation", "once_cell", "png", "serde", "thiserror", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4953,17 +3719,6 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "uds_windows" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" -dependencies = [ - "memoffset 0.9.1", - "tempfile", - "winapi 0.3.9", -] - [[package]] name = "unic-char-property" version = "0.9.0" @@ -5005,15 +3760,6 @@ dependencies = [ "unic-common", ] -[[package]] -name = "unicase" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - [[package]] name = "unicode-bidi" version = "0.3.15" @@ -5041,12 +3787,6 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" -[[package]] -name = "unicode-width" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" - [[package]] name = "url" version = "2.5.2" @@ -5061,11 +3801,10 @@ dependencies = [ [[package]] name = "urlpattern" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9bd5ff03aea02fa45b13a7980151fe45009af1980ba69f651ec367121a31609" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" dependencies = [ - "derive_more", "regex", "serde", "unic-ucd-ident", @@ -5087,15 +3826,6 @@ dependencies = [ "dotenv", ] -[[package]] -name = "uuid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -dependencies = [ - "getrandom 0.2.15", -] - [[package]] name = "uuid" version = "1.10.0" @@ -5111,12 +3841,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - [[package]] name = "version-compare" version = "0.2.0" @@ -5186,7 +3910,7 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "wasm-bindgen-macro", ] @@ -5211,7 +3935,7 @@ version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "js-sys", "wasm-bindgen", "web-sys", @@ -5259,25 +3983,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "watchexec" -version = "1.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38928d7ff5274e31594da2d46453a2c741fa340d1bf0ef6f2cb3e43537361265" -dependencies = [ - "clearscreen", - "command-group", - "derive_builder", - "glob", - "globset", - "lazy_static", - "log", - "nix 0.22.3", - "notify 4.0.18", - "walkdir", - "winapi 0.3.9", -] - [[package]] name = "web-sys" version = "0.3.69" @@ -5334,23 +4039,23 @@ dependencies = [ [[package]] name = "webview2-com" -version = "0.31.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6516cfa64c6b3212686080eeec378e662c2af54bb2a5b2a22749673f5cb2226f" +checksum = "6f61ff3d9d0ee4efcb461b14eb3acfda2702d10dc329f339303fc3e57215ae2c" dependencies = [ "webview2-com-macros", "webview2-com-sys", - "windows 0.57.0", - "windows-core 0.57.0", - "windows-implement 0.57.0", - "windows-interface 0.57.0", + "windows 0.58.0", + "windows-core 0.58.0", + "windows-implement", + "windows-interface", ] [[package]] name = "webview2-com-macros" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1345798ecd8122468840bcdf1b95e5dc6d2206c5e4b0eafa078d061f59c9bc" +checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", @@ -5359,33 +4064,15 @@ dependencies = [ [[package]] name = "webview2-com-sys" -version = "0.31.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c76d5b77320ff155660be1df3e6588bc85c75f1a9feef938cc4dc4dd60d1d7cf" +checksum = "a3a3e2eeb58f82361c93f9777014668eb3d07e7d174ee4c819575a9208011886" dependencies = [ "thiserror", - "windows 0.57.0", - "windows-core 0.57.0", + "windows 0.58.0", + "windows-core 0.58.0", ] -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" - [[package]] name = "winapi" version = "0.3.9" @@ -5396,12 +4083,6 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -5429,9 +4110,9 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33082acd404763b315866e14a0d5193f3422c81086657583937a750cdd3ec340" dependencies = [ - "cocoa", + "cocoa 0.25.0", "objc", - "raw-window-handle 0.6.2", + "raw-window-handle", "windows-sys 0.52.0", "windows-version", ] @@ -5447,21 +4128,11 @@ dependencies = [ [[package]] name = "windows" -version = "0.56.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1de69df01bdf1ead2f4ac895dc77c9351aefff65b2f3db429a343f9cbf05e132" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "windows-core 0.56.0", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" -dependencies = [ - "windows-core 0.57.0", + "windows-core 0.58.0", "windows-targets 0.52.6", ] @@ -5476,44 +4147,22 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.56.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ - "windows-implement 0.56.0", - "windows-interface 0.56.0", - "windows-result", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-core" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" -dependencies = [ - "windows-implement 0.57.0", - "windows-interface 0.57.0", + "windows-implement", + "windows-interface", "windows-result", + "windows-strings", "windows-targets 0.52.6", ] [[package]] name = "windows-implement" -version = "0.56.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "windows-implement" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", @@ -5522,20 +4171,9 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.56.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] - -[[package]] -name = "windows-interface" -version = "0.57.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", @@ -5544,13 +4182,23 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.1.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -5798,20 +4446,20 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "windows-sys 0.48.0", ] [[package]] name = "wry" -version = "0.41.0" +version = "0.43.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b00c945786b02d7805d09a969fa36d0eee4e0bd4fb3ec2a79d2bf45a1b44cd" +checksum = "f4d715cf5fe88e9647f3d17b207b6d060d4a88e7171d4ccb2d2c657dd1d44728" dependencies = [ "base64 0.22.1", "block", - "cocoa", - "core-graphics", + "cocoa 0.26.0", + "core-graphics 0.24.0", "crossbeam-channel", "dpi", "dunce", @@ -5824,13 +4472,11 @@ dependencies = [ "kuchikiki", "libc", "ndk", - "ndk-context", - "ndk-sys", "objc", "objc_id", "once_cell", "percent-encoding", - "raw-window-handle 0.6.2", + "raw-window-handle", "sha2", "soup3", "tao-macros", @@ -5838,22 +4484,12 @@ dependencies = [ "webkit2gtk", "webkit2gtk-sys", "webview2-com", - "windows 0.57.0", - "windows-core 0.57.0", + "windows 0.58.0", + "windows-core 0.58.0", "windows-version", "x11-dl", ] -[[package]] -name = "ws2_32-sys" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - [[package]] name = "x11" version = "2.21.0" @@ -5874,112 +4510,3 @@ dependencies = [ "once_cell", "pkg-config", ] - -[[package]] -name = "xdg-home" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca91dcf8f93db085f3a0a29358cd0b9d670915468f4290e8b85d118a34211ab8" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "zbus" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" -dependencies = [ - "async-broadcast", - "async-executor", - "async-fs", - "async-io", - "async-lock", - "async-process", - "async-recursion", - "async-task", - "async-trait", - "blocking", - "enumflags2", - "event-listener", - "futures-core", - "futures-sink", - "futures-util", - "hex", - "nix 0.29.0", - "ordered-stream", - "rand 0.8.5", - "serde", - "serde_repr", - "sha1", - "static_assertions", - "tracing", - "uds_windows", - "windows-sys 0.52.0", - "xdg-home", - "zbus_macros", - "zbus_names", - "zvariant", -] - -[[package]] -name = "zbus_macros" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" -dependencies = [ - "proc-macro-crate 3.1.0", - "proc-macro2", - "quote", - "syn 2.0.72", - "zvariant_utils", -] - -[[package]] -name = "zbus_names" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" -dependencies = [ - "serde", - "static_assertions", - "zvariant", -] - -[[package]] -name = "zvariant" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" -dependencies = [ - "endi", - "enumflags2", - "serde", - "static_assertions", - "zvariant_derive", -] - -[[package]] -name = "zvariant_derive" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" -dependencies = [ - "proc-macro-crate 3.1.0", - "proc-macro2", - "quote", - "syn 2.0.72", - "zvariant_utils", -] - -[[package]] -name = "zvariant_utils" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", -] diff --git a/Cargo.toml b/Cargo.toml index 4831495..60a6b1b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,6 @@ [workspace] resolver = "2" members = [ - "crates/app", "crates/sesam-vitale", "crates/desktop", "crates/utils", diff --git a/README.md b/README.md index f928f81..e526dec 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,13 @@ Logiciel de Pharmacie libre et open-source. -## Crates +## Modules applicatifs -- `app`: Interface du logiciel, servie par un serveur web propulsé par Axum. Utilisable en mode endpoint ou encapsulé dans le client `desktop` -- `desktop`: Client desktop propulsé par Tauri, encapsulant le serveur web `app` -- `sesam-vitale`: Bibliothèque de gestion des services SESAM-Vitale (Lecture des cartes CPS et Vitale, téléservices ...) -- `utils`: Bibliothèque de fonctions utilitaires +- `crates`: Dossier racine des modules Rust + - `crates/desktop`: Client desktop propulsé par Tauri, exposant le `frontend` + - `crates/sesam-vitale`: Bibliothèque de gestion des services SESAM-Vitale (Lecture des cartes CPS et Vitale, téléservices ...) + - `crates/utils`: Bibliothèque de fonctions utilitaires +- `frontend`: Interface web du logiciel, propulsée par Nuxt.js ## Installation @@ -26,22 +27,21 @@ Des exemples de fichiers de configuration sont disponibles à la racine du proje ### Pré-requis +### Frontend (Nuxt + Typescript) + +Le frontend est propulsé par Nuxt.js, un framework TypeScript pour Vue.js. Pour le développement, il est nécessaire d'installer les dépendances suivantes : +- [Bun](https://bun.sh/docs/installation), un gestionnaire de paquets, équivalent à `npm` en plus performant + #### Tauri CLI +TODO: Tauri CLI, réellement nécessaire ? + La CLI Tauri est nécessaire au lancement du client `desktop`. Elle peut être installée via Cargo : ```bash -cargo install tauri-cli --version "^2.0.0-beta" +cargo install tauri-cli --version "^2.0.0-rc" ``` -#### Tailwindcss CLI - -Le CLI Tailwindcss est nécessaire pour la génération du fichier `crates/app/assets/css/style.css`. - -La documentation d'installation est disponible sur le site officiel de Tailwindcss : https://tailwindcss.com/blog/standalone-cli - -La version actuellement utilisée est la [`v3.4.7`](https://github.com/tailwindlabs/tailwindcss/releases/tag/v3.4.7) - #### SESAM-Vitale La crate `sesam-vitale` nécessite la présence des librairies dynamiques fournies par le package FSV et la CryptolibCPS. Les instructions d'installation sont disponibles dans le [README](crates/sesam-vitale/README.md) de la crate `sesam-vitale`. @@ -54,29 +54,17 @@ Le logiciel dans sa globalité peut être lancé via la commande suivante : cargo tauri dev ``` -/!\ Attention, le lancement du client `desktop` ne génère pas le fichier `crates/app/assets/css/style.css` automatiquement pour le moment. En cas de modification des interfaces web, il est donc nécessaire de procéder à sa génération comme indiqué dans le [README](crates/app/README.md) de la crate `app`. +/!\ Attention, le lancement du client `desktop` ne génère pas le fichier `frontend/assets/css/style.css` automatiquement pour le moment. En cas de modification des interfaces web, il est donc nécessaire de procéder à sa génération comme indiqué dans le [README](frontend/README.md) du module `frontend`. +// TODO: Adapter autogénération Tailwind au nouveau Tauri + Nuxt ? Si vous souhaitez lancer les composants séparément, les indications de lancement sont disponibles dans les README des différents crates. -- [app](crates/app/README.md) +- [frontend](frontend/README.md) - [sesam-vitale](crates/sesam-vitale/README.md) -## Rechargement automatique - -Pour permettre de développer plus rapidement, il existe une librairie qui recompile automatiquement nos modifications en cours : [`cargo-watch`](https://github.com/watchexec/cargo-watch) permet de relancer une commande `cargo` lorsqu'un fichier est modifié (example: `cargo run` --> `cargo watch -x run`). - -Voici la commande pour l'installer dans un _package_ : -```bash -cargo add cargo-watch --dev --package app -``` - -Le fichier [`.ignore`](./ignore) permet d'ignorer certains fichiers pour éviter de relancer la recompilation inutilement. - -⚠️ La librairie n'est pas compatible avec _Windows 7_ et les versions antérieurs de _Windows_. - ## Build -Packager le client desktop +Pour packager le client `desktop`, il est nécessaire de faire appel à la CLI Tauri, qui se charge de gérer le build du `frontend` et son intégration au bundle : ```bash cargo tauri build diff --git a/crates/desktop/Cargo.toml b/crates/desktop/Cargo.toml index 59e5d2f..2d0c806 100644 --- a/crates/desktop/Cargo.toml +++ b/crates/desktop/Cargo.toml @@ -10,16 +10,11 @@ name = "desktop_lib" crate-type = ["lib", "cdylib", "staticlib"] [build-dependencies] -tauri-build = { version = "2.0.0-beta", features = [] } +tauri-build = { version = "2.0.0-rc", features = [] } [dependencies] -axum = "0.7.5" -tauri = { version = "2.0.0-beta", features = [] } -tower = "0.4.13" -tokio = "1.39.1" - -app = { path = "../app" } -http = "1.1.0" -bytes = "1.6.1" -thiserror = "1.0.63" +tauri = { version = "2.0.0-rc", features = [] } +tauri-plugin-shell = "2.0.0-rc" +serde = { version = "1", features = ["derive"] } +serde_json = "1" diff --git a/crates/desktop/capabilities/default.json b/crates/desktop/capabilities/default.json new file mode 100644 index 0000000..3bb4cc4 --- /dev/null +++ b/crates/desktop/capabilities/default.json @@ -0,0 +1,10 @@ +{ + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Capability for the main window", + "windows": ["main"], + "permissions": [ + "core:default", + "shell:allow-open" + ] +} diff --git a/crates/desktop/src/lib.rs b/crates/desktop/src/lib.rs index ac8bc77..291bed7 100644 --- a/crates/desktop/src/lib.rs +++ b/crates/desktop/src/lib.rs @@ -1,88 +1,14 @@ -use axum::body::{to_bytes, Body}; -use axum::Router; -use bytes::Bytes; -use http::{request, response, Request, Response}; -use std::path::PathBuf; -use std::sync::Arc; -use tauri::path::BaseDirectory; -use tauri::Manager; -use thiserror::Error; -use tokio::sync::{Mutex, MutexGuard}; -use tower::{Service, ServiceExt}; - -#[derive(Error, Debug)] -pub enum DesktopError { - #[error("Axum error:\n{0}")] - Axum(#[from] axum::Error), - #[error("Infallible error")] - Infallible(#[from] std::convert::Infallible), -} - -/// Process requests sent to Tauri (with the `axum://` protocol) and handle them with Axum -/// When an error occurs, this function is expected to panic, which should result in a 500 error -/// being sent to the client, so we let the client handle the error recovering -async fn process_tauri_request( - tauri_request: Request>, - mut router: MutexGuard<'_, Router>, -) -> Result>, DesktopError> { - let (parts, body): (request::Parts, Vec) = tauri_request.into_parts(); - let axum_request: Request = Request::from_parts(parts, body.into()); - - let axum_response: Response = router - .as_service() - .ready() - .await - .map_err(DesktopError::Infallible)? - .call(axum_request) - .await - .map_err(DesktopError::Infallible)?; - - let (parts, body): (response::Parts, Body) = axum_response.into_parts(); - let body: Bytes = to_bytes(body, usize::MAX).await?; - - let tauri_response: Response> = Response::from_parts(parts, body.into()); - Ok(tauri_response) +// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command +#[tauri::command] +fn greet(name: &str) -> String { + format!("Hello, {}! You've been greeted from Rust!", name) } #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { tauri::Builder::default() - .setup(|app| { - let assets_path: PathBuf = app - .path() - .resolve("assets", BaseDirectory::Resource) - .expect("Assets path should be resolvable"); - - // Adds Axum router to application state - // This makes it so we can retrieve it from any app instance (see bellow) - let router = Arc::new(Mutex::new(app::get_router(&assets_path))); - - app.manage(router); - - Ok(()) - }) - .register_asynchronous_uri_scheme_protocol("axum", move |app, request, responder| { - // Retrieve the router from the application state and clone it for the async block - let router = Arc::clone(&app.state::>>()); - - // Spawn a new async task to process the request - tauri::async_runtime::spawn(async move { - let router = router.lock().await; - match process_tauri_request(request, router).await { - Ok(response) => responder.respond(response), - Err(err) => { - let body = format!("Failed to process an axum:// request:\n{}", err); - responder.respond( - http::Response::builder() - .status(http::StatusCode::BAD_REQUEST) - .header(http::header::CONTENT_TYPE, "text/plain") - .body::>(body.into()) - .expect("BAD_REQUEST response should be valid"), - ) - } - } - }); - }) + .plugin(tauri_plugin_shell::init()) + .invoke_handler(tauri::generate_handler![greet]) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/crates/desktop/tauri.conf.json b/crates/desktop/tauri.conf.json index f7d9482..63fdcc5 100644 --- a/crates/desktop/tauri.conf.json +++ b/crates/desktop/tauri.conf.json @@ -1,20 +1,24 @@ { - "productName": "Logiciel Pharma", + "$schema": "https://schema.tauri.app/config/2.0.0-rc", + "productName": "Chrys4lide LGO", "version": "0.0.1", - "identifier": "org.p4pillon.pharma.desktop", + "identifier": "org.p4pillon.chrys4lide.lgo", "build": { "beforeDevCommand": { - "cwd": "../app", - "script": "cargo run" + "cwd": "../../frontend", + "script": "bun run dev" }, - "devUrl": "http://localhost:3000", - "frontendDist": "axum://place.holder/" + "devUrl": "http://localhost:1420", + "beforeBuildCommand": { + "cwd": "../../frontend", + "script": "bun run generate" + }, + "frontendDist": "../../frontend/dist" }, "app": { - "withGlobalTauri": true, "windows": [ { - "title": "Logiciel Pharma", + "title": "Chrys4lide | LG0", "width": 800, "height": 600 } @@ -25,9 +29,6 @@ }, "bundle": { "active": true, - "resources": { - "../app/assets/": "./assets/" - }, "targets": "all", "icon": [ "icons/32x32.png", @@ -37,5 +38,4 @@ "icons/icon.ico" ] } - -} +} \ No newline at end of file diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..4a7f73a --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,24 @@ +# Nuxt dev/build outputs +.output +.data +.nuxt +.nitro +.cache +dist + +# Node dependencies +node_modules + +# Logs +logs +*.log + +# Misc +.DS_Store +.fleet +.idea + +# Local env files +.env +.env.* +!.env.example diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..72aa419 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,77 @@ +# Nuxt 3 Minimal Starter + +TODO : Faire un vrai README pour `frontend` (Nuxt 3) + +Look at the [Nuxt 3 documentation](https://nuxt.com/docs/getting-started/introduction) to learn more. + +## Setup + +Make sure to install the dependencies: + +```bash +# npm +npm install + +# pnpm +pnpm install + +# yarn +yarn install + +# bun +bun install +``` + +## Development Server + +Start the development server on `http://localhost:3000`: + +```bash +# npm +npm run dev + +# pnpm +pnpm run dev + +# yarn +yarn dev + +# bun +bun run dev +``` + +## Production + +Build the application for production: + +```bash +# npm +npm run build + +# pnpm +pnpm run build + +# yarn +yarn build + +# bun +bun run build +``` + +Locally preview production build: + +```bash +# npm +npm run preview + +# pnpm +pnpm run preview + +# yarn +yarn preview + +# bun +bun run preview +``` + +Check out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information. diff --git a/frontend/app.vue b/frontend/app.vue new file mode 100644 index 0000000..09f935b --- /dev/null +++ b/frontend/app.vue @@ -0,0 +1,6 @@ + diff --git a/frontend/bun.lockb b/frontend/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..ad827d939cdfbe2a8c24927a4b72cf12a1da03db GIT binary patch literal 281048 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 literal 0 HcmV?d00001 diff --git a/frontend/nuxt.config.ts b/frontend/nuxt.config.ts new file mode 100644 index 0000000..e9295ac --- /dev/null +++ b/frontend/nuxt.config.ts @@ -0,0 +1,29 @@ +// https://nuxt.com/docs/api/configuration/nuxt-config +export default defineNuxtConfig({ + compatibilityDate: '2024-04-03', + // Enables the development server to be discoverable by other devices for mobile development + devServer: { host: '0.0.0.0', port: 1420 }, + devtools: { enabled: true }, + // Disable SSR for Tauri + ssr: false, + vite: { + // Better support for Tauri CLI output + clearScreen: false, + // Enable environment variables + // Additional environment variables can be found at + // https://v2.tauri.app/reference/environment-variables/ + envPrefix: ['VITE_', 'TAURI_'], + server: { + // Tauri requires a consistent port + strictPort: true, + hmr: { + // Use websocket for mobile hot reloading + protocol: 'ws', + // Make sure it's available on the network + host: '0.0.0.0', + // Use a specific port for hmr + port: 5183, + }, + }, + } +}) diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..61c34e7 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,17 @@ +{ + "name": "nuxt-app", + "private": true, + "type": "module", + "scripts": { + "build": "nuxi build", + "dev": "nuxi dev", + "generate": "nuxi generate", + "preview": "nuxi preview", + "postinstall": "nuxi prepare" + }, + "dependencies": { + "nuxt": "^3.13.0", + "vue": "latest", + "vue-router": "latest" + } +} \ No newline at end of file diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..18993ad91cfd43e03b074dd0b5cc3f37ab38e49c GIT binary patch literal 4286 zcmeHLOKuuL5PjK%MHWVi6lD zOGiREbCw`xmFozJ^aNatJY>w+g ze6a2@u~m#^BZm@8wco9#Crlli0uLb^3E$t2-WIc^#(?t)*@`UpuofJ(Uyh@F>b3Ph z$D^m8Xq~pTkGJ4Q`Q2)te3mgkWYZ^Ijq|hkiP^9`De={bQQ%heZC$QU2UpP(-tbl8 zPWD2abEew;oat@w`uP3J^YpsgT%~jT(Dk%oU}sa$7|n6hBjDj`+I;RX(>)%lm_7N{+B7Mu%H?422lE%MBJH!!YTN2oT7xr>>N-8OF$C&qU^ z>vLsa{$0X%q1fjOe3P1mCv#lN{xQ4_*HCSAZjTb1`}mlc+9rl8$B3OP%VT@mch_~G z7Y+4b{r>9e=M+7vSI;BgB?ryZDY4m>&wcHSn81VH1N~`0gvwH{ z8dv#hG|OK`>1;j7tM#B)Z7zDN?{6=dUal}$e Date: Mon, 16 Sep 2024 22:46:53 +0200 Subject: [PATCH 02/10] fix: invalid borrowing of assets_path in get_router --- crates/app/src/lib.rs | 4 ++-- crates/app/src/main.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/app/src/lib.rs b/crates/app/src/lib.rs index 1dd9829..818e6ea 100644 --- a/crates/app/src/lib.rs +++ b/crates/app/src/lib.rs @@ -1,4 +1,4 @@ -use std::path::Path; +use std::path::PathBuf; use axum::http::{StatusCode, Uri}; use axum_htmx::AutoVaryLayer; @@ -11,7 +11,7 @@ async fn fallback(uri: Uri) -> (StatusCode, String) { (StatusCode::NOT_FOUND, format!("No route for {uri}")) } -pub fn get_router(assets_path: &Path) -> axum::Router { +pub async fn get_router(assets_path: PathBuf) -> axum::Router<()> { axum::Router::new() .nest_service("/assets", ServeDir::new(assets_path)) .merge(pages::get_routes()) diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index 67f59ab..ea1bc46 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -72,7 +72,7 @@ async fn main() -> Result<(), AppError> { let livereload_layer = get_livereload_layer(templates_paths).map_err(AppError::NotifyWatcher)?; - let router = get_router(assets_path.as_path()).layer(livereload_layer); + let router = get_router(assets_path).await.layer(livereload_layer); let listener: TcpListener = get_tcp_listener().await.map_err(AppError::TCPListener)?; let local_addr = listener.local_addr().map_err(AppError::TCPListener)?; From 339377b838cca67b901bc756d90bbe868312164f Mon Sep 17 00:00:00 2001 From: Florian Briand Date: Mon, 23 Sep 2024 12:23:31 +0200 Subject: [PATCH 03/10] fix: a Anyhow error handling is missing in ssvlib_demo --- crates/sesam-vitale/src/ssvlib_demo.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/sesam-vitale/src/ssvlib_demo.rs b/crates/sesam-vitale/src/ssvlib_demo.rs index 25386c8..2a29ce5 100644 --- a/crates/sesam-vitale/src/ssvlib_demo.rs +++ b/crates/sesam-vitale/src/ssvlib_demo.rs @@ -17,6 +17,8 @@ pub enum SSVDemoError { CartePSReading(#[from] crate::cps::CartePSError), #[error(transparent)] SSVLibErrorCode(#[from] crate::libssv::LibSSVError), + #[error(transparent)] + Anyhow(#[from] anyhow::Error), } fn ssv_init_lib_2() -> Result<(), SSVDemoError> { From 62decb3314727d06ec4925523e3968078ad50eea Mon Sep 17 00:00:00 2001 From: Florian Briand Date: Mon, 23 Sep 2024 15:45:42 +0200 Subject: [PATCH 04/10] feat: setup tailwindcss in frontend --- frontend/bun.lockb | Bin 281048 -> 310931 bytes frontend/nuxt.config.ts | 3 +++ frontend/package.json | 3 +++ 3 files changed, 6 insertions(+) diff --git a/frontend/bun.lockb b/frontend/bun.lockb index ad827d939cdfbe2a8c24927a4b72cf12a1da03db..c55ca7b0e9a011b4d9fd409fe9a56026e3107735 100755 GIT binary patch delta 56994 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 z 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 delta 38917 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 i-?_K=T??6j%A?6e~9DObm{;!=e3!T$$^91C0k diff --git a/frontend/nuxt.config.ts b/frontend/nuxt.config.ts index e9295ac..8b81d14 100644 --- a/frontend/nuxt.config.ts +++ b/frontend/nuxt.config.ts @@ -4,6 +4,9 @@ export default defineNuxtConfig({ // Enables the development server to be discoverable by other devices for mobile development devServer: { host: '0.0.0.0', port: 1420 }, devtools: { enabled: true }, + modules: [ + '@nuxtjs/tailwindcss', + ], // Disable SSR for Tauri ssr: false, vite: { diff --git a/frontend/package.json b/frontend/package.json index 61c34e7..6e05dc4 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -13,5 +13,8 @@ "nuxt": "^3.13.0", "vue": "latest", "vue-router": "latest" + }, + "devDependencies": { + "@nuxtjs/tailwindcss": "^6.12.1" } } \ No newline at end of file From bc33bd48e8d5eec006b0c74ee2c3188d0c0fb8dd Mon Sep 17 00:00:00 2001 From: Florian Briand Date: Mon, 23 Sep 2024 17:43:32 +0200 Subject: [PATCH 05/10] feat: add a loader for SPA javascript loading --- frontend/app/spa-loading-template.html | 43 ++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 frontend/app/spa-loading-template.html diff --git a/frontend/app/spa-loading-template.html b/frontend/app/spa-loading-template.html new file mode 100644 index 0000000..a379ec6 --- /dev/null +++ b/frontend/app/spa-loading-template.html @@ -0,0 +1,43 @@ + +
+ From 2e057eee01745a8a683013d83c3884d56cb0766a Mon Sep 17 00:00:00 2001 From: Florian Briand Date: Mon, 23 Sep 2024 17:45:08 +0200 Subject: [PATCH 06/10] feat: add DaisyUI for easy components styling and dark mode handling --- frontend/bun.lockb | Bin 310931 -> 314436 bytes frontend/nuxt.config.ts | 9 ++++++++- frontend/package.json | 2 ++ frontend/tailwind.config.ts | 7 +++++++ 4 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 frontend/tailwind.config.ts diff --git a/frontend/bun.lockb b/frontend/bun.lockb index c55ca7b0e9a011b4d9fd409fe9a56026e3107735..9c1e44afe34117c7be30c222052a7f19f9914720 100755 GIT binary patch delta 47408 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 delta 45250 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 diff --git a/frontend/nuxt.config.ts b/frontend/nuxt.config.ts index 8b81d14..9ac3ddd 100644 --- a/frontend/nuxt.config.ts +++ b/frontend/nuxt.config.ts @@ -6,6 +6,7 @@ export default defineNuxtConfig({ devtools: { enabled: true }, modules: [ '@nuxtjs/tailwindcss', + '@nuxtjs/color-mode', ], // Disable SSR for Tauri ssr: false, @@ -28,5 +29,11 @@ export default defineNuxtConfig({ port: 5183, }, }, - } + }, + colorMode: { + // Add `data-theme` attribute to the `html` tag, allowing DaisyUI to handle dark mode automatically + dataValue: 'theme', + // Remove the default `-mode` suffix from the class name, letting have `dark` and `light` as class names, for DaisyUI compatibility + classSuffix: '', + }, }) diff --git a/frontend/package.json b/frontend/package.json index 6e05dc4..4e45ea4 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -10,6 +10,8 @@ "postinstall": "nuxi prepare" }, "dependencies": { + "@nuxtjs/color-mode": "^3.5.1", + "daisyui": "^4.12.10", "nuxt": "^3.13.0", "vue": "latest", "vue-router": "latest" diff --git a/frontend/tailwind.config.ts b/frontend/tailwind.config.ts new file mode 100644 index 0000000..48039aa --- /dev/null +++ b/frontend/tailwind.config.ts @@ -0,0 +1,7 @@ +import type { Config } from 'tailwindcss' + +export default >{ + plugins: [ + require('daisyui'), + ], +} From a50d951af751faa72cce9d6d6f7bc8c10f0dde9b Mon Sep 17 00:00:00 2001 From: Florian Briand Date: Mon, 23 Sep 2024 18:02:07 +0200 Subject: [PATCH 07/10] feat: setup a backend server with axum --- Cargo.lock | 150 ++++++++++++++++++++++++++++++++++--- Cargo.toml | 3 +- crates/backend/Cargo.toml | 8 ++ crates/backend/src/lib.rs | 12 +++ crates/backend/src/main.rs | 10 +++ 5 files changed, 173 insertions(+), 10 deletions(-) create mode 100644 crates/backend/Cargo.toml create mode 100644 crates/backend/src/lib.rs create mode 100644 crates/backend/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 2be0a25..def562a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -62,6 +62,17 @@ version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +[[package]] +name = "async-trait" +version = "0.1.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "atk" version = "0.18.0" @@ -91,6 +102,69 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +[[package]] +name = "axum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f43644eed690f5374f1af436ecd6aea01cd201f6fbdf0178adaf6907afb2cec" +dependencies = [ + "async-trait", + "axum-core", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa 1.0.11", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper 1.0.1", + "tokio", + "tower 0.5.1", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6b8ba012a258d63c9adfa28b9ddcf66149da6f986c5b5452e629d5ee64bf00" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper 1.0.1", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "backend" +version = "0.1.0" +dependencies = [ + "axum", + "tokio", +] + [[package]] name = "backtrace" version = "0.3.73" @@ -1344,6 +1418,12 @@ version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + [[package]] name = "hyper" version = "1.4.1" @@ -1356,6 +1436,7 @@ dependencies = [ "http", "http-body", "httparse", + "httpdate", "itoa 1.0.11", "pin-project-lite", "smallvec", @@ -1378,7 +1459,7 @@ dependencies = [ "pin-project-lite", "socket2", "tokio", - "tower", + "tower 0.4.13", "tower-service", "tracing", ] @@ -1741,6 +1822,12 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + [[package]] name = "memchr" version = "2.7.4" @@ -2604,7 +2691,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 1.0.1", "tokio", "tokio-util", "tower-service", @@ -2772,6 +2859,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" +dependencies = [ + "itoa 1.0.11", + "serde", +] + [[package]] name = "serde_repr" version = "0.1.19" @@ -3073,6 +3170,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "sync_wrapper" version = "1.0.1" @@ -3485,9 +3588,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.1" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d040ac2b29ab03b09d4129c2f5bbd012a3ac2f79d38ff506a4bf8dd34b0eac8a" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", @@ -3495,9 +3598,21 @@ dependencies = [ "mio", "pin-project-lite", "socket2", + "tokio-macros", "windows-sys 0.52.0", ] +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "tokio-util" version = "0.7.11" @@ -3608,16 +3723,32 @@ dependencies = [ ] [[package]] -name = "tower-layer" -version = "0.3.2" +name = "tower" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 0.1.2", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[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.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -3625,6 +3756,7 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", diff --git a/Cargo.toml b/Cargo.toml index 60a6b1b..a4ff5d4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,8 @@ [workspace] resolver = "2" members = [ - "crates/sesam-vitale", + "crates/backend", "crates/desktop", + "crates/sesam-vitale", "crates/utils", ] diff --git a/crates/backend/Cargo.toml b/crates/backend/Cargo.toml new file mode 100644 index 0000000..b7e7d2c --- /dev/null +++ b/crates/backend/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "backend" +version = "0.1.0" +edition = "2021" + +[dependencies] +axum = "0.7.6" +tokio = { version = "1.40.0", features = ["macros", "rt-multi-thread"] } diff --git a/crates/backend/src/lib.rs b/crates/backend/src/lib.rs new file mode 100644 index 0000000..f1c0602 --- /dev/null +++ b/crates/backend/src/lib.rs @@ -0,0 +1,12 @@ +use axum::http::{StatusCode, Uri}; +use axum::{routing::get, Router}; + +pub fn get_router() -> Router { + Router::new() + .route("/", get(|| async { "Hello, world!" })) + .fallback(fallback) +} + +async fn fallback(uri: Uri) -> (StatusCode, String) { + (StatusCode::NOT_FOUND, format!("No route for {uri}")) +} diff --git a/crates/backend/src/main.rs b/crates/backend/src/main.rs new file mode 100644 index 0000000..2315ddb --- /dev/null +++ b/crates/backend/src/main.rs @@ -0,0 +1,10 @@ +use backend::get_router; + +#[tokio::main] +async fn main() { + let app = get_router(); + let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await.unwrap(); + + println!("Listening on {}", listener.local_addr().unwrap()); + axum::serve(listener, app).await.unwrap(); +} From 54870b0d0f75ada6792019c92bdaeb487341d0f9 Mon Sep 17 00:00:00 2001 From: Florian Briand Date: Mon, 23 Sep 2024 18:13:48 +0200 Subject: [PATCH 08/10] feat: add the hot-reload on backend crate --- Cargo.lock | 1394 ++++++++++++++++++++++++++++++++++-- README.md | 10 +- crates/backend/Cargo.toml | 5 + crates/backend/README.md | 19 + crates/backend/src/main.rs | 16 +- 5 files changed, 1397 insertions(+), 47 deletions(-) create mode 100644 crates/backend/README.md diff --git a/Cargo.lock b/Cargo.lock index def562a..d8dda46 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,15 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "aho-corasick" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +dependencies = [ + "memchr", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -56,12 +65,159 @@ dependencies = [ "libc", ] +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "anstyle" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" + [[package]] name = "anyhow" version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +[[package]] +name = "async-broadcast" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "slab", +] + +[[package]] +name = "async-fs" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" +dependencies = [ + "async-lock", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-io" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" +dependencies = [ + "async-lock", + "cfg-if 1.0.0", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if 1.0.0", + "event-listener", + "futures-lite", + "rustix", + "tracing", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "async-signal" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if 1.0.0", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + [[package]] name = "async-trait" version = "0.1.82" @@ -96,6 +252,23 @@ dependencies = [ "system-deps", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi 0.3.9", +] + [[package]] name = "autocfg" version = "1.3.0" @@ -162,6 +335,9 @@ name = "backend" version = "0.1.0" dependencies = [ "axum", + "cargo-watch", + "listenfd", + "systemfd", "tokio", ] @@ -173,7 +349,7 @@ checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", - "cfg-if", + "cfg-if 1.0.0", "libc", "miniz_oxide", "object", @@ -231,6 +407,19 @@ dependencies = [ "objc2", ] +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + [[package]] name = "brotli" version = "6.0.0" @@ -252,6 +441,15 @@ dependencies = [ "alloc-stdlib", ] +[[package]] +name = "bstr" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" +dependencies = [ + "memchr", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -322,6 +520,37 @@ dependencies = [ "serde", ] +[[package]] +name = "cargo-watch" +version = "8.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b9567d1518a2ec25bb3cce963f8a3fd4b86b5bbdb210f415f461cfb8c4e2aa2" +dependencies = [ + "camino", + "cargo_metadata 0.17.0", + "clap 2.34.0", + "dotenvy", + "log", + "notify-rust", + "shell-escape", + "stderrlog", + "watchexec", +] + +[[package]] +name = "cargo_metadata" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7daec1a2a2129eeba1644b220b4647ec537b0b5d4bfd6876fcc5a540056b592" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "cargo_metadata" version = "0.18.1" @@ -379,6 +608,12 @@ dependencies = [ "target-lexicon", ] +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + [[package]] name = "cfg-if" version = "1.0.0" @@ -399,11 +634,67 @@ checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", + "js-sys", "num-traits", "serde", + "wasm-bindgen", "windows-targets 0.52.6", ] +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags 1.3.2", + "strsim 0.8.0", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "clap" +version = "4.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0956a43b323ac1afaffc053ed5c4b7c1f1800bacd1683c353aabbb752515dd3" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d72166dd41634086d5803a47eb71ae740e61d84709c36f3c34110173db3961b" +dependencies = [ + "anstyle", + "clap_lex", + "terminal_size", +] + +[[package]] +name = "clap_lex" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" + +[[package]] +name = "clearscreen" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e55dadbdd203f69c0a107bc78fca6e47d605345610ee77dcf24203fdf510b317" +dependencies = [ + "nix 0.24.3", + "terminfo", + "thiserror", + "which", + "winapi 0.3.9", +] + [[package]] name = "cocoa" version = "0.25.0" @@ -474,6 +765,38 @@ dependencies = [ "memchr", ] +[[package]] +name = "command-group" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a8a86f409b4a59df3a3e4bee2de0b83f1755fdd2a25e3a9684c396fc4bed2c" +dependencies = [ + "nix 0.22.3", + "winapi 0.3.9", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "console" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.52.0", +] + [[package]] name = "convert_case" version = "0.4.0" @@ -569,7 +892,7 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", ] [[package]] @@ -634,14 +957,38 @@ dependencies = [ "syn 2.0.72", ] +[[package]] +name = "darling" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f2c43f534ea4b0b049015d00269734195e6d3f0f6635cb692251aca6f9f8b3c" +dependencies = [ + "darling_core 0.12.4", + "darling_macro 0.12.4", +] + [[package]] name = "darling" version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.20.10", + "darling_macro 0.20.10", +] + +[[package]] +name = "darling_core" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e91455b86830a1c21799d94524df0845183fa55bafd9aa137b01c7d1065fa36" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 1.0.109", ] [[package]] @@ -654,17 +1001,28 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim", + "strsim 0.11.1", "syn 2.0.72", ] +[[package]] +name = "darling_macro" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29b5acf0dea37a7f66f7b25d2c5e93fd46f8f6968b1a5d7a3e02e97768afc95a" +dependencies = [ + "darling_core 0.12.4", + "quote", + "syn 1.0.109", +] + [[package]] name = "darling_macro" version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ - "darling_core", + "darling_core 0.20.10", "quote", "syn 2.0.72", ] @@ -679,6 +1037,37 @@ dependencies = [ "serde", ] +[[package]] +name = "derive_builder" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d13202debe11181040ae9063d739fa32cfcaaebe2275fe387703460ae2365b30" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66e616858f6187ed828df7c64a6d71720d83767a7f19740b2d1b6fe6327b36e5" +dependencies = [ + "darling 0.12.4", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_builder_macro" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58a94ace95092c5acb1e97a7e846b310cfbd499652f72297da7493f618a98d73" +dependencies = [ + "derive_builder_core", + "syn 1.0.109", +] + [[package]] name = "derive_more" version = "0.99.18" @@ -719,7 +1108,16 @@ version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" dependencies = [ - "dirs-sys", + "dirs-sys 0.4.1", +] + +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys 0.3.7", ] [[package]] @@ -728,7 +1126,28 @@ version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" dependencies = [ - "dirs-sys", + "dirs-sys 0.4.1", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if 1.0.0", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi 0.3.9", ] [[package]] @@ -743,6 +1162,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi 0.3.9", +] + [[package]] name = "dispatch" version = "0.2.0" @@ -758,7 +1188,7 @@ dependencies = [ "dlopen2_derive", "libc", "once_cell", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -778,6 +1208,12 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + [[package]] name = "dpi" version = "0.1.1" @@ -814,6 +1250,12 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + [[package]] name = "embed-resource" version = "2.4.3" @@ -834,13 +1276,46 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + [[package]] name = "encoding_rs" version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", +] + +[[package]] +name = "endi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + +[[package]] +name = "enumflags2" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", ] [[package]] @@ -859,6 +1334,43 @@ dependencies = [ "typeid", ] +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "event-listener" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" + [[package]] name = "fdeflate" version = "0.3.4" @@ -874,10 +1386,22 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" dependencies = [ - "memoffset", + "memoffset 0.9.1", "rustc_version", ] +[[package]] +name = "filetime" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "libredox", + "windows-sys 0.59.0", +] + [[package]] name = "flate2" version = "1.0.30" @@ -939,6 +1463,41 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fsevent" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab7d1bd1bd33cc98b0889831b72da23c0aa4df9cec7e0702f46ecea04b35db6" +dependencies = [ + "bitflags 1.3.2", + "fsevent-sys", +] + +[[package]] +name = "fsevent-sys" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f41b048a94555da0f42f1d632e2e19510084fb8e303b0daa2816e733fb3644a0" +dependencies = [ + "libc", +] + +[[package]] +name = "fuchsia-zircon" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +dependencies = [ + "bitflags 1.3.2", + "fuchsia-zircon-sys", +] + +[[package]] +name = "fuchsia-zircon-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" + [[package]] name = "futf" version = "0.1.5" @@ -981,6 +1540,19 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +[[package]] +name = "futures-lite" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.30" @@ -1158,7 +1730,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "wasi 0.9.0+wasi-snapshot-preview1", ] @@ -1169,7 +1741,7 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "wasi 0.11.0+wasi-snapshot-preview1", ] @@ -1209,7 +1781,7 @@ dependencies = [ "gobject-sys", "libc", "system-deps", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -1265,6 +1837,19 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +[[package]] +name = "globset" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c152169ef1e421390738366d2f796655fec62621dabbd0fd476f905934061e4a" +dependencies = [ + "aho-corasick 0.7.20", + "bstr", + "fnv", + "log", + "regex", +] + [[package]] name = "gobject-sys" version = "0.18.0" @@ -1352,18 +1937,42 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + [[package]] name = "hermit-abi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "html5ever" version = "0.26.0" @@ -1544,13 +2153,42 @@ dependencies = [ "cfb", ] +[[package]] +name = "inotify" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4816c66d2c8ae673df83366c18341538f234a26d65a9ecea5c348b453ac1d02f" +dependencies = [ + "bitflags 1.3.2", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + [[package]] name = "instant" version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", +] + +[[package]] +name = "iovec" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" +dependencies = [ + "libc", ] [[package]] @@ -1620,7 +2258,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ "cesu8", - "cfg-if", + "cfg-if 1.0.0", "combine", "jni-sys", "log", @@ -1667,6 +2305,16 @@ dependencies = [ "serde_json", ] +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + [[package]] name = "keyboard-types" version = "0.7.0" @@ -1697,6 +2345,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + [[package]] name = "libappindicator" version = "0.9.0" @@ -1733,8 +2387,8 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" dependencies = [ - "cfg-if", - "winapi", + "cfg-if 1.0.0", + "winapi 0.3.9", ] [[package]] @@ -1745,6 +2399,24 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.6.0", "libc", + "redox_syscall", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "listenfd" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0500463acd96259d219abb05dc57e5a076ef04b2db9a2112846929b5f174c96" +dependencies = [ + "libc", + "uuid", + "winapi 0.3.9", ] [[package]] @@ -1769,7 +2441,7 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "generator", "scoped-tls", "serde", @@ -1784,6 +2456,19 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" +[[package]] +name = "mac-notification-sys" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce8f34f3717aa37177e723df6c1fc5fb02b2a1087374ea3fe0ea42316dc8f91" +dependencies = [ + "cc", + "dirs-next", + "objc-foundation", + "objc_id", + "time", +] + [[package]] name = "malloc_buf" version = "0.0.6" @@ -1834,6 +2519,24 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + [[package]] name = "memoffset" version = "0.9.1" @@ -1859,18 +2562,61 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "mio" +version = "0.6.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" +dependencies = [ + "cfg-if 0.1.10", + "fuchsia-zircon", + "fuchsia-zircon-sys", + "iovec", + "kernel32-sys", + "libc", + "log", + "miow", + "net2", + "slab", + "winapi 0.2.8", +] + [[package]] name = "mio" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] +[[package]] +name = "mio-extras" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" +dependencies = [ + "lazycell", + "log", + "mio 0.6.23", + "slab", +] + +[[package]] +name = "miow" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" +dependencies = [ + "kernel32-sys", + "net2", + "winapi 0.2.8", + "ws2_32-sys", +] + [[package]] name = "muda" version = "0.14.1" @@ -1920,18 +2666,119 @@ dependencies = [ "jni-sys", ] +[[package]] +name = "net2" +version = "0.2.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "winapi 0.3.9", +] + [[package]] name = "new_debug_unreachable" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" +[[package]] +name = "nix" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" +dependencies = [ + "bitflags 1.3.2", + "cc", + "cfg-if 1.0.0", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags 1.3.2", + "cfg-if 1.0.0", + "libc", +] + +[[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 1.0.0", + "libc", + "memoffset 0.7.1", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.6.0", + "cfg-if 1.0.0", + "cfg_aliases", + "libc", + "memoffset 0.9.1", +] + [[package]] name = "nodrop" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +[[package]] +name = "nom" +version = "5.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08959a387a676302eebf4ddbcbc611da04285579f76f88ee0506c63b1a61dd4b" +dependencies = [ + "memchr", + "version_check", +] + +[[package]] +name = "notify" +version = "4.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b72dd35279a5dc895a30965e247b0961ba36c233dc48454a2de8ccd459f1afd3" +dependencies = [ + "bitflags 1.3.2", + "filetime", + "fsevent", + "fsevent-sys", + "inotify", + "libc", + "mio 0.6.23", + "mio-extras", + "walkdir", + "winapi 0.3.9", +] + +[[package]] +name = "notify-rust" +version = "4.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5134a72dc570b178bff81b01e81ab14a6fcc015391ed4b3b14853090658cd3a3" +dependencies = [ + "log", + "mac-notification-sys", + "serde", + "tauri-winrt-notification", + "zbus", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -1939,7 +2786,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" dependencies = [ "overload", - "winapi", + "winapi 0.3.9", ] [[package]] @@ -1988,6 +2835,17 @@ dependencies = [ "objc_exception", ] +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + [[package]] name = "objc-sys" version = "0.3.5" @@ -2138,6 +2996,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + [[package]] name = "os_pipe" version = "1.2.1" @@ -2179,6 +3047,12 @@ dependencies = [ "system-deps", ] +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.3" @@ -2195,7 +3069,7 @@ version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "redox_syscall", "smallvec", @@ -2264,6 +3138,16 @@ dependencies = [ "phf_shared 0.10.0", ] +[[package]] +name = "phf_codegen" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8d39688d359e6b34654d328e262234662d16cc0f60ec8dcbe5e718709342a5a" +dependencies = [ + "phf_generator 0.11.2", + "phf_shared 0.11.2", +] + [[package]] name = "phf_generator" version = "0.8.0" @@ -2380,6 +3264,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + [[package]] name = "pkg-config" version = "0.3.30" @@ -2394,7 +3289,7 @@ checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" dependencies = [ "base64 0.22.1", "indexmap 2.2.6", - "quick-xml", + "quick-xml 0.32.0", "serde", "time", ] @@ -2412,6 +3307,21 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "polling" +version = "3.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +dependencies = [ + "cfg-if 1.0.0", + "concurrent-queue", + "hermit-abi 0.4.0", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.59.0", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -2497,6 +3407,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "quick-xml" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" +dependencies = [ + "memchr", +] + [[package]] name = "quick-xml" version = "0.32.0" @@ -2628,7 +3547,7 @@ version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ - "aho-corasick", + "aho-corasick 1.1.3", "memchr", "regex-automata 0.4.7", "regex-syntax 0.8.4", @@ -2649,7 +3568,7 @@ version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ - "aho-corasick", + "aho-corasick 1.1.3", "memchr", "regex-syntax 0.8.4", ] @@ -2718,6 +3637,19 @@ dependencies = [ "semver", ] +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + [[package]] name = "rustversion" version = "1.0.17" @@ -2925,7 +3857,7 @@ version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" dependencies = [ - "darling", + "darling 0.20.10", "proc-macro2", "quote", "syn 2.0.72", @@ -2974,13 +3906,24 @@ dependencies = [ "utils", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest", +] + [[package]] name = "sha2" version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "cpufeatures", "digest", ] @@ -3004,6 +3947,21 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "shell-escape" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + [[package]] name = "simd-adler32" version = "0.3.7" @@ -3105,6 +4063,25 @@ dependencies = [ "loom", ] +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "stderrlog" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69a26bbf6de627d389164afa9783739b56746c6c72c4ed16539f4ff54170327b" +dependencies = [ + "atty", + "chrono", + "log", + "termcolor", + "thread_local", +] + [[package]] name = "string_cache" version = "0.8.7" @@ -3131,6 +4108,18 @@ dependencies = [ "quote", ] +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "strsim" version = "0.11.1" @@ -3195,6 +4184,24 @@ dependencies = [ "version-compare", ] +[[package]] +name = "systemfd" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e62c21a82db3ac3b598b5b02e2570a2083092ba5e5994b5d86b8c447c658e845" +dependencies = [ + "anyhow", + "clap 4.5.18", + "console", + "lazy_static", + "libc", + "nix 0.26.4", + "regex", + "socket2", + "uuid", + "windows-sys 0.52.0", +] + [[package]] name = "tao" version = "0.30.1" @@ -3259,7 +4266,7 @@ checksum = "eb3c3b1c7ac5b72d59da307b84af900a0098c74c9d7369f65018cd8ec0eb50fb" dependencies = [ "anyhow", "bytes", - "dirs", + "dirs 5.0.1", "dunce", "embed_plist", "futures-util", @@ -3310,7 +4317,7 @@ checksum = "6ff5713e81e02e0b99f5219b275abbd7d2c0cc0f30180e25b1b650e08feeac63" dependencies = [ "anyhow", "cargo_toml", - "dirs", + "dirs 5.0.1", "glob", "heck 0.5.0", "json-patch", @@ -3455,7 +4462,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31fe4c9148e1b35225e1c00753f24b517ce00041d02eb4b4d6fd10613a47736c" dependencies = [ "brotli", - "cargo_metadata", + "cargo_metadata 0.18.1", "ctor", "dunce", "glob", @@ -3493,6 +4500,30 @@ dependencies = [ "toml 0.7.8", ] +[[package]] +name = "tauri-winrt-notification" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f89f5fb70d6f62381f5d9b2ba9008196150b40b75f3068eb24faeddf1c686871" +dependencies = [ + "quick-xml 0.31.0", + "windows 0.56.0", + "windows-version", +] + +[[package]] +name = "tempfile" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +dependencies = [ + "cfg-if 1.0.0", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + [[package]] name = "tendril" version = "0.4.3" @@ -3504,6 +4535,47 @@ dependencies = [ "utf-8", ] +[[package]] +name = "termcolor" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "terminal_size" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" +dependencies = [ + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "terminfo" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da31aef70da0f6352dbcb462683eb4dd2bfad01cf3fc96cf204547b9a839a585" +dependencies = [ + "dirs 4.0.0", + "fnv", + "nom", + "phf 0.11.2", + "phf_codegen 0.11.2", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + [[package]] name = "thin-slice" version = "0.1.1" @@ -3536,7 +4608,7 @@ version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "once_cell", ] @@ -3595,7 +4667,7 @@ dependencies = [ "backtrace", "bytes", "libc", - "mio", + "mio 1.0.1", "pin-project-lite", "socket2", "tokio-macros", @@ -3820,7 +4892,7 @@ checksum = "044d7738b3d50f288ddef035b793228740ad4d927f5466b0af55dc15e7e03cfe" dependencies = [ "core-graphics 0.24.0", "crossbeam-channel", - "dirs", + "dirs 5.0.1", "libappindicator", "muda", "objc2", @@ -3851,6 +4923,17 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset 0.9.1", + "tempfile", + "winapi 0.3.9", +] + [[package]] name = "unic-char-property" version = "0.9.0" @@ -3919,6 +5002,12 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + [[package]] name = "url" version = "2.5.2" @@ -3973,6 +5062,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + [[package]] name = "version-compare" version = "0.2.0" @@ -4042,7 +5137,7 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "wasm-bindgen-macro", ] @@ -4067,7 +5162,7 @@ version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "js-sys", "wasm-bindgen", "web-sys", @@ -4115,6 +5210,25 @@ dependencies = [ "web-sys", ] +[[package]] +name = "watchexec" +version = "1.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38928d7ff5274e31594da2d46453a2c741fa340d1bf0ef6f2cb3e43537361265" +dependencies = [ + "clearscreen", + "command-group", + "derive_builder", + "glob", + "globset", + "lazy_static", + "log", + "nix 0.22.3", + "notify", + "walkdir", + "winapi 0.3.9", +] + [[package]] name = "web-sys" version = "0.3.69" @@ -4179,8 +5293,8 @@ dependencies = [ "webview2-com-sys", "windows 0.58.0", "windows-core 0.58.0", - "windows-implement", - "windows-interface", + "windows-implement 0.58.0", + "windows-interface 0.58.0", ] [[package]] @@ -4205,6 +5319,24 @@ dependencies = [ "windows-core 0.58.0", ] +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" + [[package]] name = "winapi" version = "0.3.9" @@ -4215,6 +5347,12 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -4258,6 +5396,16 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1de69df01bdf1ead2f4ac895dc77c9351aefff65b2f3db429a343f9cbf05e132" +dependencies = [ + "windows-core 0.56.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows" version = "0.58.0" @@ -4277,19 +5425,42 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6" +dependencies = [ + "windows-implement 0.56.0", + "windows-interface 0.56.0", + "windows-result 0.1.2", + "windows-targets 0.52.6", +] + [[package]] name = "windows-core" version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ - "windows-implement", - "windows-interface", - "windows-result", + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", "windows-strings", "windows-targets 0.52.6", ] +[[package]] +name = "windows-implement" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "windows-implement" version = "0.58.0" @@ -4301,6 +5472,17 @@ dependencies = [ "syn 2.0.72", ] +[[package]] +name = "windows-interface" +version = "0.56.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "windows-interface" version = "0.58.0" @@ -4312,6 +5494,15 @@ dependencies = [ "syn 2.0.72", ] +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-result" version = "0.2.0" @@ -4327,7 +5518,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ - "windows-result", + "windows-result 0.2.0", "windows-targets 0.52.6", ] @@ -4578,7 +5769,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "windows-sys 0.48.0", ] @@ -4622,6 +5813,16 @@ dependencies = [ "x11-dl", ] +[[package]] +name = "ws2_32-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + [[package]] name = "x11" version = "2.21.0" @@ -4642,3 +5843,112 @@ dependencies = [ "once_cell", "pkg-config", ] + +[[package]] +name = "xdg-home" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "zbus" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" +dependencies = [ + "async-broadcast", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix 0.29.0", + "ordered-stream", + "rand 0.8.5", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tracing", + "uds_windows", + "windows-sys 0.52.0", + "xdg-home", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.72", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" +dependencies = [ + "serde", + "static_assertions", + "zvariant", +] + +[[package]] +name = "zvariant" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" +dependencies = [ + "endi", + "enumflags2", + "serde", + "static_assertions", + "zvariant_derive", +] + +[[package]] +name = "zvariant_derive" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.72", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] diff --git a/README.md b/README.md index e526dec..ed9bafe 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Des exemples de fichiers de configuration sont disponibles à la racine du proje ### Pré-requis -### Frontend (Nuxt + Typescript) +#### Frontend (Nuxt + Typescript) Le frontend est propulsé par Nuxt.js, un framework TypeScript pour Vue.js. Pour le développement, il est nécessaire d'installer les dépendances suivantes : - [Bun](https://bun.sh/docs/installation), un gestionnaire de paquets, équivalent à `npm` en plus performant @@ -46,6 +46,10 @@ cargo install tauri-cli --version "^2.0.0-rc" La crate `sesam-vitale` nécessite la présence des librairies dynamiques fournies par le package FSV et la CryptolibCPS. Les instructions d'installation sont disponibles dans le [README](crates/sesam-vitale/README.md) de la crate `sesam-vitale`. +#### Backend Hot-reload + +Voir le [README](crates/backend/README.md) de la crate `backend` pour les prérequis de développement du serveur backend. + ### Lancement Le logiciel dans sa globalité peut être lancé via la commande suivante : @@ -54,11 +58,9 @@ Le logiciel dans sa globalité peut être lancé via la commande suivante : cargo tauri dev ``` -/!\ Attention, le lancement du client `desktop` ne génère pas le fichier `frontend/assets/css/style.css` automatiquement pour le moment. En cas de modification des interfaces web, il est donc nécessaire de procéder à sa génération comme indiqué dans le [README](frontend/README.md) du module `frontend`. -// TODO: Adapter autogénération Tailwind au nouveau Tauri + Nuxt ? - Si vous souhaitez lancer les composants séparément, les indications de lancement sont disponibles dans les README des différents crates. +- [backend](crates/backend/README.md) - [frontend](frontend/README.md) - [sesam-vitale](crates/sesam-vitale/README.md) diff --git a/crates/backend/Cargo.toml b/crates/backend/Cargo.toml index b7e7d2c..4572aa3 100644 --- a/crates/backend/Cargo.toml +++ b/crates/backend/Cargo.toml @@ -5,4 +5,9 @@ edition = "2021" [dependencies] axum = "0.7.6" +listenfd = "1.0.1" tokio = { version = "1.40.0", features = ["macros", "rt-multi-thread"] } + +[dev-dependencies] +cargo-watch = "8.5.2" +systemfd = "0.4.3" diff --git a/crates/backend/README.md b/crates/backend/README.md new file mode 100644 index 0000000..f709a46 --- /dev/null +++ b/crates/backend/README.md @@ -0,0 +1,19 @@ +# Backend + +Ceci est un serveur backend, basé sur axum, et permettant d'offrir une gestion centralisée des accès aux données. + +## Prérequis + +En développement, le mécanisme de hot-reload nécessite de disposer de `cargo-watch` et `systemfd`. Pour les installer, exécutez la commande suivante : + +```bash +cargo install cargo-watch systemfd +``` + +## Développement + +Pour lancer le serveur en mode développement, exécutez la commande suivante : + +```bash +systemfd --no-pid -s http::3030 -- cargo watch -x 'run --bin backend' +``` diff --git a/crates/backend/src/main.rs b/crates/backend/src/main.rs index 2315ddb..9ca9dda 100644 --- a/crates/backend/src/main.rs +++ b/crates/backend/src/main.rs @@ -1,9 +1,23 @@ +use listenfd::ListenFd; +use tokio::net::TcpListener; + use backend::get_router; #[tokio::main] async fn main() { let app = get_router(); - let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await.unwrap(); + + let mut listenfd = ListenFd::from_env(); + + let listener = match listenfd.take_tcp_listener(0).unwrap() { + // if we are given a tcp listener on listen fd 0, we use that one + Some(listener) => { + listener.set_nonblocking(true).unwrap(); + TcpListener::from_std(listener).unwrap() + } + // otherwise fall back to local listening + None => TcpListener::bind("0.0.0.0:8080").await.unwrap(), + }; println!("Listening on {}", listener.local_addr().unwrap()); axum::serve(listener, app).await.unwrap(); From 43bb2c40deef8afbe005d78d1a2bbed9da81a2b5 Mon Sep 17 00:00:00 2001 From: Florian Briand Date: Mon, 23 Sep 2024 18:43:44 +0200 Subject: [PATCH 09/10] feat: improve README --- README.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ed9bafe..eb2ad78 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ Logiciel de Pharmacie libre et open-source. ## Modules applicatifs - `crates`: Dossier racine des modules Rust + - `crates/backend`: Serveur backend propulsé par Axum, exposant une API REST - `crates/desktop`: Client desktop propulsé par Tauri, exposant le `frontend` - `crates/sesam-vitale`: Bibliothèque de gestion des services SESAM-Vitale (Lecture des cartes CPS et Vitale, téléservices ...) - `crates/utils`: Bibliothèque de fonctions utilitaires @@ -52,17 +53,20 @@ Voir le [README](crates/backend/README.md) de la crate `backend` pour les prére ### Lancement -Le logiciel dans sa globalité peut être lancé via la commande suivante : +Pour lancer l'application en mode développement, il est nécessaire d'exécuter plusieurs composants simultanément : ```bash -cargo tauri dev +# Lancement du serveur backend +systemfd --no-pid -s http::3030 -- cargo watch -x 'run --bin backend' ``` -Si vous souhaitez lancer les composants séparément, les indications de lancement sont disponibles dans les README des différents crates. - -- [backend](crates/backend/README.md) -- [frontend](frontend/README.md) -- [sesam-vitale](crates/sesam-vitale/README.md) +```bash +# Lancement de l'interface utilisateur (frontend ou desktop) +# - frontend (serveur web, accessible via navigateur) +bun run --cwd frontend/ dev +# - desktop (client desktop, basé sur Tauri) +cargo tauri dev +``` ## Build From f11e2502ddc40ee93daa142a892dcb221f64a2b3 Mon Sep 17 00:00:00 2001 From: Florian Briand Date: Mon, 23 Sep 2024 18:55:31 +0200 Subject: [PATCH 10/10] feat: handle axum errors with anyhow --- Cargo.lock | 5 +++-- crates/backend/Cargo.toml | 1 + crates/backend/src/lib.rs | 25 +++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d8dda46..39b5b13 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -82,9 +82,9 @@ checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] name = "async-broadcast" @@ -334,6 +334,7 @@ dependencies = [ name = "backend" version = "0.1.0" dependencies = [ + "anyhow", "axum", "cargo-watch", "listenfd", diff --git a/crates/backend/Cargo.toml b/crates/backend/Cargo.toml index 4572aa3..8dc8c07 100644 --- a/crates/backend/Cargo.toml +++ b/crates/backend/Cargo.toml @@ -4,6 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] +anyhow = "1.0.89" axum = "0.7.6" listenfd = "1.0.1" tokio = { version = "1.40.0", features = ["macros", "rt-multi-thread"] } diff --git a/crates/backend/src/lib.rs b/crates/backend/src/lib.rs index f1c0602..530b3dd 100644 --- a/crates/backend/src/lib.rs +++ b/crates/backend/src/lib.rs @@ -1,4 +1,6 @@ +use anyhow::Error as AnyError; use axum::http::{StatusCode, Uri}; +use axum::response::{IntoResponse, Response}; use axum::{routing::get, Router}; pub fn get_router() -> Router { @@ -10,3 +12,26 @@ pub fn get_router() -> Router { async fn fallback(uri: Uri) -> (StatusCode, String) { (StatusCode::NOT_FOUND, format!("No route for {uri}")) } + +struct AppError(AnyError); + +// To automatically convert `AppError` into a response +impl IntoResponse for AppError { + fn into_response(self) -> Response { + ( + StatusCode::INTERNAL_SERVER_ERROR, + format!("Internal Server Error: {}", self.0), + ) + .into_response() + } +} + +// To automatically convert `AnyError` into `AppError` +impl From for AppError +where + E: Into, +{ + fn from(err: E) -> Self { + Self(err.into()) + } +}