Browse Source

Merge branch 'master' into router-typesafe

Evan Almloff 2 years ago
parent
commit
7b1f0c9412

+ 41 - 6
Cargo.toml

@@ -37,6 +37,41 @@ members = [
     "examples/PWA-example",
 ]
 
+# dependencies that are shared across packages
+[workspace.dependencies]
+dioxus = { path = "packages/dioxus" }
+dioxus-core = { path = "packages/core" }
+dioxus-core-macro = { path = "packages/core-macro" }
+dioxus-router = { path = "packages/router" }
+dioxus-router-macro = { path = "packages/router-macro" }
+dioxus-html = { path = "packages/html" }
+dioxus-hooks = { path = "packages/hooks" }
+dioxus-web = { path = "packages/web" }
+dioxus-ssr = { path = "packages/ssr" }
+dioxus-desktop = { path = "packages/desktop" }
+dioxus-mobile = { path = "packages/mobile" }
+dioxus-interpreter-js = { path = "packages/interpreter" }
+fermi = { path = "packages/fermi" }
+dioxus-liveview = { path = "packages/liveview" }
+dioxus-autofmt = { path = "packages/autofmt" }
+dioxus-rsx = { path = "packages/rsx" }
+dioxus-tui = { path = "packages/dioxus-tui" }
+rink = { path = "packages/rink" }
+dioxus-native-core = { path = "packages/native-core" }
+dioxus-native-core-macro = { path = "packages/native-core-macro" }
+dioxus-rsx-rosetta = { path = "packages/rsx-rosetta" }
+dioxus-signals = { path = "packages/signals" }
+dioxus-hot-reload = { path = "packages/hot-reload" }
+dioxus-fullstack = { path = "packages/fullstack" }
+dioxus_server_macro = { path = "packages/fullstack/server-macro" }
+log = "0.4.19"
+tokio = "1.28"
+slab = "0.4.2"
+futures-channel = "0.3.21"
+futures-util = { version = "0.3", default-features = false }
+rustc-hash = "1.1.0"
+wasm-bindgen = "0.2.79"
+
 # This is a "virtual package"
 # It is not meant to be published, but is used so "cargo run --example XYZ" works properly
 [package]
@@ -54,12 +89,12 @@ rust-version = "1.60.0"
 publish = false
 
 [dev-dependencies]
-dioxus = { path = "./packages/dioxus" }
-dioxus-desktop = { path = "./packages/desktop", features = ["transparent"] }
-dioxus-ssr = { path = "./packages/ssr" }
-dioxus-router = { path = "./packages/router" }
-dioxus-signals = { path = "./packages/signals" }
-fermi = { path = "./packages/fermi" }
+dioxus = { workspace = true }
+dioxus-desktop = { workspace = true, features = ["transparent"] }
+dioxus-ssr = { workspace = true }
+dioxus-router = { workspace = true }
+dioxus-signals = { workspace = true }
+fermi = { workspace = true }
 futures-util = "0.3.21"
 log = "0.4.14"
 num-format = "0.4.0"

+ 1 - 1
packages/autofmt/Cargo.toml

@@ -12,7 +12,7 @@ keywords = ["dom", "ui", "gui", "react"]
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-dioxus-rsx = { path = "../rsx", version = "^0.0.3" }
+dioxus-rsx = { workspace = true }
 proc-macro2 = { version = "1.0.6", features = ["span-locations"] }
 quote = "1.0"
 syn = { version = "1.0.11", features = ["full", "extra-traits"] }

+ 1 - 1
packages/core-macro/Cargo.toml

@@ -18,7 +18,7 @@ proc-macro = true
 proc-macro2 = { version = "1.0" }
 quote = "1.0"
 syn = { version = "1.0", features = ["full", "extra-traits"] }
-dioxus-rsx = {  path = "../rsx", version = "^0.0.3" }
+dioxus-rsx = { workspace = true }
 
 # testing
 [dev-dependencies]

+ 7 - 7
packages/core/Cargo.toml

@@ -18,23 +18,23 @@ keywords = ["dom", "ui", "gui", "react"]
 bumpalo = { version = "3.6", features = ["collections", "boxed"] }
 
 # faster hashmaps
-rustc-hash = "1.1.0"
+rustc-hash = { workspace = true }
 
 # Used in diffing
 longest-increasing-subsequence = "0.1.0"
 
-futures-util = { version = "0.3", default-features = false, features = [
+futures-util = { workspace = true, default-features = false, features = [
     "alloc",
 ] }
 
-slab = "0.4"
+slab = { workspace = true }
 
-futures-channel = "0.3.21"
+futures-channel = { workspace = true }
 
 indexmap = "1.7"
 
 smallbox = "0.8.1"
-log = "0.4.17"
+log = { workspace = true }
 
 # Serialize the Edits for use in Webview/Liveview instances
 serde = { version = "1", features = ["derive"], optional = true }
@@ -42,8 +42,8 @@ serde = { version = "1", features = ["derive"], optional = true }
 bumpslab = { version = "0.2.0" }
 
 [dev-dependencies]
-tokio = { version = "1", features = ["full"] }
-dioxus = { path = "../dioxus" }
+tokio = { workspace = true, features = ["full"] }
+dioxus = { workspace = true }
 pretty_assertions = "1.3.0"
 rand = "0.8.5"
 

+ 13 - 13
packages/desktop/Cargo.toml

@@ -12,31 +12,31 @@ keywords = ["dom", "ui", "gui", "react"]
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-dioxus-core = { path = "../core", version = "^0.3.0", features = ["serialize"] }
-dioxus-html = { path = "../html", features = ["serialize", "native-bind"], version = "^0.3.0" }
-dioxus-interpreter-js = { path = "../interpreter", version = "^0.3.0" }
-dioxus-hot-reload = { path = "../hot-reload", optional = true }
+dioxus-core = { workspace = true, features = ["serialize"] }
+dioxus-html = { workspace = true, features = ["serialize", "native-bind"] }
+dioxus-interpreter-js = { workspace = true }
+dioxus-hot-reload = { workspace = true, optional = true }
 
 serde = "1.0.136"
 serde_json = "1.0.79"
 thiserror = "1.0.30"
-log = "0.4.14"
+log = { workspace = true }
 wry = { version = "0.27.2" }
-futures-channel = "0.3.21"
-tokio = { version = "1.27", features = [
+futures-channel = { workspace = true }
+tokio = { workspace = true, features = [
     "sync",
     "rt-multi-thread",
     "rt",
     "time",
     "macros",
     "fs",
-], optional = true, default-features = false }
+], optional = true }
 webbrowser = "0.8.0"
 infer = "0.11.0"
 dunce = "1.0.2"
-slab = "0.4"
+slab = { workspace = true }
 
-futures-util = "0.3.25"
+futures-util = { workspace = true }
 rfd = "0.11.3"
 urlencoding = "2.1.2"
 
@@ -56,9 +56,9 @@ tray = ["wry/tray"]
 hot-reload = ["dioxus-hot-reload"]
 
 [dev-dependencies]
-dioxus-core-macro = { path = "../core-macro" }
-dioxus-hooks = { path = "../hooks" }
-dioxus = { path = "../dioxus" }
+dioxus-core-macro = { workspace = true }
+dioxus-hooks = { workspace = true }
+dioxus = { workspace = true }
 exitcode = "1.1.2"
 scraper = "0.16.0"
 

+ 10 - 0
packages/desktop/src/cfg.rs

@@ -23,6 +23,7 @@ pub struct Config {
     pub(crate) custom_head: Option<String>,
     pub(crate) custom_index: Option<String>,
     pub(crate) root_name: String,
+    pub(crate) background_color: Option<(u8, u8, u8, u8)>,
 }
 
 type DropHandler = Box<dyn Fn(&Window, FileDropEvent) -> bool>;
@@ -50,6 +51,7 @@ impl Config {
             custom_head: None,
             custom_index: None,
             root_name: "main".to_string(),
+            background_color: None,
         }
     }
 
@@ -137,6 +139,14 @@ impl Config {
         self.root_name = name.into();
         self
     }
+
+    /// Sets the background color of the WebView.
+    /// This will be set before the HTML is rendered and can be used to prevent flashing when the page loads.
+    /// Accepts a color in RGBA format
+    pub fn with_background_color(mut self, color: (u8, u8, u8, u8)) -> Self {
+        self.background_color = Some(color);
+        self
+    }
 }
 
 impl Default for Config {

+ 4 - 0
packages/desktop/src/webview.rs

@@ -64,6 +64,10 @@ pub fn build(
         webview = webview.with_browser_accelerator_keys(false);
     }
 
+    if let Some(color) = cfg.background_color {
+        webview = webview.with_background_color(color);
+    }
+
     // These are commented out because wry is currently broken in wry
     // let mut web_context = WebContext::new(cfg.data_dir.clone());
     // .with_web_context(&mut web_context);

+ 9 - 9
packages/dioxus-tui/Cargo.toml

@@ -13,21 +13,21 @@ license = "MIT/Apache-2.0"
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-dioxus = { path = "../dioxus", version = "^0.3.0" }
-dioxus-core = { path = "../core", version = "^0.3.0", features = ["serialize"] }
-dioxus-html = { path = "../html", version = "^0.3.0" }
-dioxus-native-core = { path = "../native-core", version = "^0.2.0", features = ["dioxus"] }
-dioxus-native-core-macro = { path = "../native-core-macro", version = "^0.3.0" }
-dioxus-hot-reload = { path = "../hot-reload", optional = true }
-rink = { path = "../rink" }
+dioxus = { workspace = true }
+dioxus-core = { workspace = true, features = ["serialize"] }
+dioxus-html = { workspace = true }
+dioxus-native-core = { workspace = true, features = ["dioxus"] }
+dioxus-native-core-macro = { workspace = true }
+dioxus-hot-reload = { workspace = true, optional = true }
+rink = { workspace = true }
 
 crossterm = "0.23.0"
-tokio = { version = "1.15.0", features = ["full"] }
+tokio = { workspace = true, features = ["full"] }
 futures = "0.3.19"
 taffy = "0.3.12"
 
 [dev-dependencies]
-dioxus = { path = "../dioxus" }
+dioxus = { workspace = true }
 tokio = { version = "1" }
 criterion = "0.3.5"
 

+ 10 - 10
packages/dioxus/Cargo.toml

@@ -12,14 +12,14 @@ keywords = ["dom", "ui", "gui", "react", "wasm"]
 rust-version = "1.65.0"
 
 [dependencies]
-dioxus-core = { path = "../core", version = "^0.3.0" }
-dioxus-html = { path = "../html", version = "^0.3.0", optional = true }
-dioxus-core-macro = { path = "../core-macro", version = "^0.3.0", optional = true }
-dioxus-hooks = { path = "../hooks", version = "^0.3.0", optional = true }
-dioxus-rsx = { path = "../rsx", version = "^0.0.3", optional = true }
+dioxus-core = { workspace = true }
+dioxus-html = { workspace = true, optional = true }
+dioxus-core-macro = { workspace = true, optional = true }
+dioxus-hooks = { workspace = true, optional = true }
+dioxus-rsx = { workspace = true, optional = true }
 
 [target.'cfg(not(target_arch = "wasm32"))'.dependencies]
-dioxus-hot-reload = { path = "../hot-reload", version = "0.1.0", optional = true }
+dioxus-hot-reload = { workspace = true, optional = true }
 
 [features]
 default = ["macro", "hooks", "html", "hot-reload"]
@@ -30,14 +30,14 @@ hot-reload = ["dioxus-hot-reload"]
 
 
 [dev-dependencies]
-futures-util = "0.3.21"
-log = "0.4.14"
+futures-util = { workspace = true }
+log = { workspace = true }
 rand = { version = "0.8.4", features = ["small_rng"] }
 criterion = "0.3.5"
 thiserror = "1.0.30"
 env_logger = "0.10.0"
-tokio = { version = "1.21.2", features = ["full"] }
-# dioxus-edit-stream = { path = "../edit-stream" }
+tokio = { workspace = true, features = ["full"] }
+# dioxus-edit-stream = { workspace = true }
 
 
 [[bench]]

+ 2 - 2
packages/fermi/Cargo.toml

@@ -13,9 +13,9 @@ keywords = ["dom", "ui", "gui", "react", "state-management"]
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-dioxus-core = { path = "../core", version = "^0.3.0" }
+dioxus-core = { workspace = true }
 im-rc = { version = "15.0.0", features = ["serde"] }
-log = "0.4.14"
+log = { workspace = true }
 
 [dev-dependencies]
 closure = "0.3.0"

+ 6 - 6
packages/fermi/README.md

@@ -9,22 +9,22 @@
 
 <div align="center">
   <!-- Crates version -->
-  <a href="https://crates.io/crates/dioxus">
-    <img src="https://img.shields.io/crates/v/dioxus.svg?style=flat-square"
+  <a href="https://crates.io/crates/fermi">
+    <img src="https://img.shields.io/crates/v/fermi.svg?style=flat-square"
     alt="Crates.io version" />
   </a>
   <!-- Downloads -->
-  <a href="https://crates.io/crates/dioxus">
-    <img src="https://img.shields.io/crates/d/dioxus.svg?style=flat-square"
+  <a href="https://crates.io/crates/fermi">
+    <img src="https://img.shields.io/crates/d/fermi.svg?style=flat-square"
       alt="Download" />
   </a>
   <!-- docs -->
-  <a href="https://docs.rs/dioxus">
+  <a href="https://docs.rs/fermi">
     <img src="https://img.shields.io/badge/docs-latest-blue.svg?style=flat-square"
       alt="docs.rs docs" />
   </a>
   <!-- CI -->
-  <a href="https://github.com/jkelleyrtp/dioxus/actions">
+  <a href="https://github.com/DioxusLabs/dioxus/actions">
     <img src="https://github.com/dioxuslabs/dioxus/actions/workflows/main.yml/badge.svg"
       alt="CI status" />
   </a>

+ 7 - 7
packages/fullstack/Cargo.toml

@@ -30,30 +30,30 @@ salvo = { version = "0.37.7", optional = true, features = ["serve-static", "ws"]
 serde = "1.0.159"
 
 # Dioxus + SSR
-dioxus = { path = "../dioxus", version = "^0.3.0" }
-dioxus-ssr = { path = "../ssr", version = "^0.3.0", optional = true }
+dioxus = { workspace = true }
+dioxus-ssr = { workspace = true, optional = true }
 hyper = { version = "0.14.25", optional = true }
 http = { version = "0.2.9", optional = true }
 
 # Router Intigration
-dioxus-router = { path = "../router", version = "^0.3.0", optional = true }
+dioxus-router = { workspace = true, optional = true }
 
-log = "0.4.17"
+log = { workspace = true }
 once_cell = "1.17.1"
 thiserror = "1.0.40"
-tokio = { version = "1.27.0", features = ["full"], optional = true }
+tokio = { workspace = true, features = ["full"], optional = true }
 object-pool = "0.5.4"
 anymap = "0.12.1"
 
 serde_json = { version = "1.0.95", optional = true }
 tokio-stream = { version = "0.1.12", features = ["sync"], optional = true }
-futures-util = { version = "0.3.28", optional = true }
+futures-util = { workspace = true, optional = true }
 postcard = { version = "1.0.4", features = ["use-std"] }
 yazi = "0.1.5"
 base64 = "0.21.0"
 
 [target.'cfg(not(target_arch = "wasm32"))'.dependencies]
-dioxus-hot-reload = { path = "../hot-reload" }
+dioxus-hot-reload = { workspace = true }
 
 [target.'cfg(target_arch = "wasm32")'.dependencies]
 web-sys = { version = "0.3.61", features = ["Window", "Document", "Element", "HtmlDocument", "Storage", "console"] }

+ 5 - 5
packages/fullstack/examples/axum-desktop/Cargo.toml

@@ -7,12 +7,12 @@ publish = false
 [lib]
 
 [dependencies]
-dioxus-desktop = { path = "../../../desktop", optional = true }
-dioxus = { path = "../../../dioxus" }
-dioxus-router = { path = "../../../router" }
-dioxus-fullstack = { path = "../../" }
+dioxus-desktop = { workspace = true, optional = true }
+dioxus = { workspace = true }
+dioxus-router = { workspace = true }
+dioxus-fullstack = { workspace = true }
 axum = { version = "0.6.12", optional = true }
-tokio = { version = "1.27.0", features = ["full"], optional = true }
+tokio = { workspace = true, features = ["full"], optional = true }
 serde = "1.0.159"
 
 [features]

+ 4 - 4
packages/fullstack/examples/axum-hello-world/Cargo.toml

@@ -7,11 +7,11 @@ publish = false
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-dioxus-web = { path = "../../../web", features=["hydrate"], optional = true }
-dioxus = { path = "../../../dioxus" }
-dioxus-fullstack = { path = "../../" }
+dioxus-web = { workspace = true, features=["hydrate"], optional = true }
+dioxus = { workspace = true }
+dioxus-fullstack = { workspace = true }
 axum = { version = "0.6.12", optional = true }
-tokio = { version = "1.27.0", features = ["full"], optional = true }
+tokio = { workspace = true, features = ["full"], optional = true }
 serde = "1.0.159"
 execute = "0.2.12"
 

+ 5 - 5
packages/fullstack/examples/axum-router/Cargo.toml

@@ -7,12 +7,12 @@ publish = false
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-dioxus-web = { path = "../../../web", features = ["hydrate"], optional = true }
-dioxus = { path = "../../../dioxus" }
-dioxus-router = { path = "../../../router" }
-dioxus-fullstack = { path = "../../", features = ["router"] }
+dioxus-web = { workspace = true, features = ["hydrate"], optional = true }
+dioxus = { workspace = true }
+dioxus-router = { workspace = true}
+dioxus-fullstack = { workspace = true, features = ["router"] }
 axum = { version = "0.6.12", optional = true }
-tokio = { version = "1.27.0", features = ["full"], optional = true }
+tokio = {workspace = true, features = ["full"], optional = true }
 serde = { version = "1.0.159", features = ["derive"] }
 
 [features]

+ 4 - 4
packages/fullstack/examples/salvo-hello-world/Cargo.toml

@@ -7,10 +7,10 @@ publish = false
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-dioxus-web = { path = "../../../web", features=["hydrate"], optional = true }
-dioxus = { path = "../../../dioxus" }
-dioxus-fullstack = { path = "../../" }
-tokio = { version = "1.27.0", features = ["full"], optional = true }
+dioxus-web = { workspace = true, features=["hydrate"], optional = true }
+dioxus = { workspace = true }
+dioxus-fullstack = { workspace = true }
+tokio = { workspace = true, features = ["full"], optional = true }
 serde = "1.0.159"
 salvo = { version = "0.37.9", optional = true }
 execute = "0.2.12"

+ 4 - 4
packages/fullstack/examples/warp-hello-world/Cargo.toml

@@ -7,10 +7,10 @@ publish = false
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-dioxus-web = { path = "../../../web", features=["hydrate"], optional = true }
-dioxus = { path = "../../../dioxus" }
-dioxus-fullstack = { path = "../../" }
-tokio = { version = "1.27.0", features = ["full"], optional = true }
+dioxus-web = { workspace = true, features=["hydrate"], optional = true }
+dioxus = { workspace = true }
+dioxus-fullstack = { workspace = true }
+tokio = { workspace = true, features = ["full"], optional = true }
 serde = "1.0.159"
 warp = { version = "0.3.3", optional = true }
 execute = "0.2.12"

+ 6 - 6
packages/hooks/Cargo.toml

@@ -12,12 +12,12 @@ keywords = ["dom", "ui", "gui", "react"]
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-dioxus-core = { path = "../../packages/core", version = "^0.3.0" }
-futures-channel = "0.3.21"
-log = "0.4"
+dioxus-core = { workspace = true }
+futures-channel = { workspace = true }
+log = { workspace = true }
 
 
 [dev-dependencies]
-futures-util = { version = "0.3", default-features = false }
-dioxus-core = { path = "../../packages/core", version = "^0.3.0" }
-dioxus = { path = "../../packages/dioxus", version = "^0.3.0" }
+futures-util = { workspace = true, default-features = false }
+dioxus-core = { workspace = true }
+dioxus = { workspace = true }

+ 3 - 3
packages/hot-reload/Cargo.toml

@@ -12,9 +12,9 @@ keywords = ["dom", "ui", "gui", "react", "hot-reloading"]
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-dioxus-rsx = { path = "../rsx" , version = "^0.0.3" }
-dioxus-core = { path = "../core", features = ["serialize"], version = "^0.3.2"}
-dioxus-html = { path = "../html", features = ["hot-reload-context"], version = "^0.3.0" }
+dioxus-rsx = { workspace = true }
+dioxus-core = { workspace = true, features = ["serialize"] }
+dioxus-html = { workspace = true, features = ["hot-reload-context"] }
 
 interprocess = { version = "1.2.1" }
 notify = "5.0.0"

+ 157 - 139
packages/hot-reload/src/lib.rs

@@ -159,172 +159,190 @@ pub fn init<Ctx: HotReloadingContext + Send + 'static>(cfg: Config<Ctx>) {
         }
         let file_map = Arc::new(Mutex::new(file_map));
 
-        if let Ok(local_socket_stream) = LocalSocketListener::bind("@dioxusin") {
-            let aborted = Arc::new(Mutex::new(false));
-
-            // listen for connections
-            std::thread::spawn({
-                let file_map = file_map.clone();
-                let channels = channels.clone();
-                let aborted = aborted.clone();
-                let _ = local_socket_stream.set_nonblocking(true);
-                move || {
-                    loop {
-                        if let Ok(mut connection) = local_socket_stream.accept() {
-                            // send any templates than have changed before the socket connected
-                            let templates: Vec<_> = {
-                                file_map
-                                    .lock()
-                                    .unwrap()
-                                    .map
-                                    .values()
-                                    .filter_map(|(_, template_slot)| *template_slot)
-                                    .collect()
-                            };
-                            for template in templates {
-                                if !send_msg(
-                                    HotReloadMsg::UpdateTemplate(template),
-                                    &mut connection,
-                                ) {
-                                    continue;
+        #[cfg(target_os = "macos")]
+        {
+            // On unix, if you force quit the application, it can leave the file socket open
+            // This will cause the local socket listener to fail to open
+            // We check if the file socket is already open from an old session and then delete it
+            let paths = ["./dioxusin", "./@dioxusin"];
+            for path in paths {
+                let path = PathBuf::from(path);
+                if path.exists() {
+                    let _ = std::fs::remove_file(path);
+                }
+            }
+        }
+
+        match LocalSocketListener::bind("@dioxusin") {
+            Ok(local_socket_stream) => {
+                let aborted = Arc::new(Mutex::new(false));
+
+                // listen for connections
+                std::thread::spawn({
+                    let file_map = file_map.clone();
+                    let channels = channels.clone();
+                    let aborted = aborted.clone();
+                    let _ = local_socket_stream.set_nonblocking(true);
+                    move || {
+                        loop {
+                            if let Ok(mut connection) = local_socket_stream.accept() {
+                                // send any templates than have changed before the socket connected
+                                let templates: Vec<_> = {
+                                    file_map
+                                        .lock()
+                                        .unwrap()
+                                        .map
+                                        .values()
+                                        .filter_map(|(_, template_slot)| *template_slot)
+                                        .collect()
+                                };
+                                for template in templates {
+                                    if !send_msg(
+                                        HotReloadMsg::UpdateTemplate(template),
+                                        &mut connection,
+                                    ) {
+                                        continue;
+                                    }
+                                }
+                                channels.lock().unwrap().push(connection);
+                                if log {
+                                    println!("Connected to hot reloading 🚀");
                                 }
                             }
-                            channels.lock().unwrap().push(connection);
-                            if log {
-                                println!("Connected to hot reloading 🚀");
+                            if *aborted.lock().unwrap() {
+                                break;
                             }
                         }
-                        if *aborted.lock().unwrap() {
-                            break;
-                        }
                     }
-                }
-            });
+                });
 
-            // watch for changes
-            std::thread::spawn(move || {
-                let mut last_update_time = chrono::Local::now().timestamp();
+                // watch for changes
+                std::thread::spawn(move || {
+                    let mut last_update_time = chrono::Local::now().timestamp();
 
-                let (tx, rx) = std::sync::mpsc::channel();
+                    let (tx, rx) = std::sync::mpsc::channel();
 
-                let mut watcher = RecommendedWatcher::new(tx, notify::Config::default()).unwrap();
+                    let mut watcher =
+                        RecommendedWatcher::new(tx, notify::Config::default()).unwrap();
 
-                for path in listening_paths {
-                    let full_path = crate_dir.join(path);
-                    if let Err(err) = watcher.watch(&full_path, RecursiveMode::Recursive) {
-                        if log {
-                            println!(
-                                "hot reloading failed to start watching {full_path:?}:\n{err:?}",
-                            );
+                    for path in listening_paths {
+                        let full_path = crate_dir.join(path);
+                        if let Err(err) = watcher.watch(&full_path, RecursiveMode::Recursive) {
+                            if log {
+                                println!(
+                                    "hot reloading failed to start watching {full_path:?}:\n{err:?}",
+                                );
+                            }
                         }
                     }
-                }
 
-                let mut rebuild = {
-                    let aborted = aborted.clone();
-                    let channels = channels.clone();
-                    move || {
-                        if let Some(rebuild_callback) = &mut rebuild_with {
-                            if log {
-                                println!("Rebuilding the application...");
-                            }
-                            let shutdown = rebuild_callback();
+                    let mut rebuild = {
+                        let aborted = aborted.clone();
+                        let channels = channels.clone();
+                        move || {
+                            if let Some(rebuild_callback) = &mut rebuild_with {
+                                if log {
+                                    println!("Rebuilding the application...");
+                                }
+                                let shutdown = rebuild_callback();
 
-                            if shutdown {
-                                *aborted.lock().unwrap() = true;
-                            }
+                                if shutdown {
+                                    *aborted.lock().unwrap() = true;
+                                }
 
-                            for channel in &mut *channels.lock().unwrap() {
-                                send_msg(HotReloadMsg::Shutdown, channel);
-                            }
+                                for channel in &mut *channels.lock().unwrap() {
+                                    send_msg(HotReloadMsg::Shutdown, channel);
+                                }
 
-                            return shutdown;
-                        } else if log {
-                            println!(
-                                "Rebuild needed... shutting down hot reloading.\nManually rebuild the application to view futher changes."
-                            );
-                        }
-                        true
-                    }
-                };
-
-                for evt in rx {
-                    if chrono::Local::now().timestamp_millis() >= last_update_time {
-                        if let Ok(evt) = evt {
-                            let real_paths = evt
-                                .paths
-                                .iter()
-                                .filter(|path| {
-                                    // skip non rust files
-                                    matches!(
-                                        path.extension().and_then(|p| p.to_str()),
-                                        Some("rs" | "toml" | "css" | "html" | "js")
-                                    ) &&
-                                    // skip excluded paths
-                                    !excluded_paths.iter().any(|p| path.starts_with(p)) &&
-                                    // respect .gitignore
-                                    !gitignore
-                                        .matched_path_or_any_parents(path, false)
-                                        .is_ignore()
-                                })
-                                .collect::<Vec<_>>();
-
-                            // Give time for the change to take effect before reading the file
-                            if !real_paths.is_empty() {
-                                std::thread::sleep(std::time::Duration::from_millis(10));
+                                return shutdown;
+                            } else if log {
+                                println!(
+                                    "Rebuild needed... shutting down hot reloading.\nManually rebuild the application to view futher changes."
+                                );
                             }
-
-                            let mut channels = channels.lock().unwrap();
-                            for path in real_paths {
-                                // if this file type cannot be hot reloaded, rebuild the application
-                                if path.extension().and_then(|p| p.to_str()) != Some("rs")
-                                    && rebuild()
-                                {
-                                    return;
+                            true
+                        }
+                    };
+
+                    for evt in rx {
+                        if chrono::Local::now().timestamp_millis() >= last_update_time {
+                            if let Ok(evt) = evt {
+                                let real_paths = evt
+                                    .paths
+                                    .iter()
+                                    .filter(|path| {
+                                        // skip non rust files
+                                        matches!(
+                                            path.extension().and_then(|p| p.to_str()),
+                                            Some("rs" | "toml" | "css" | "html" | "js")
+                                        ) &&
+                                        // skip excluded paths
+                                        !excluded_paths.iter().any(|p| path.starts_with(p)) &&
+                                        // respect .gitignore
+                                        !gitignore
+                                            .matched_path_or_any_parents(path, false)
+                                            .is_ignore()
+                                    })
+                                    .collect::<Vec<_>>();
+
+                                // Give time for the change to take effect before reading the file
+                                if !real_paths.is_empty() {
+                                    std::thread::sleep(std::time::Duration::from_millis(10));
                                 }
-                                // find changes to the rsx in the file
-                                match file_map
-                                    .lock()
-                                    .unwrap()
-                                    .update_rsx(path, crate_dir.as_path())
-                                {
-                                    Ok(UpdateResult::UpdatedRsx(msgs)) => {
-                                        for msg in msgs {
-                                            let mut i = 0;
-                                            while i < channels.len() {
-                                                let channel = &mut channels[i];
-                                                if send_msg(
-                                                    HotReloadMsg::UpdateTemplate(msg),
-                                                    channel,
-                                                ) {
-                                                    i += 1;
-                                                } else {
-                                                    channels.remove(i);
+
+                                let mut channels = channels.lock().unwrap();
+                                for path in real_paths {
+                                    // if this file type cannot be hot reloaded, rebuild the application
+                                    if path.extension().and_then(|p| p.to_str()) != Some("rs")
+                                        && rebuild()
+                                    {
+                                        return;
+                                    }
+                                    // find changes to the rsx in the file
+                                    match file_map
+                                        .lock()
+                                        .unwrap()
+                                        .update_rsx(path, crate_dir.as_path())
+                                    {
+                                        Ok(UpdateResult::UpdatedRsx(msgs)) => {
+                                            for msg in msgs {
+                                                let mut i = 0;
+                                                while i < channels.len() {
+                                                    let channel = &mut channels[i];
+                                                    if send_msg(
+                                                        HotReloadMsg::UpdateTemplate(msg),
+                                                        channel,
+                                                    ) {
+                                                        i += 1;
+                                                    } else {
+                                                        channels.remove(i);
+                                                    }
                                                 }
                                             }
                                         }
-                                    }
-                                    Ok(UpdateResult::NeedsRebuild) => {
-                                        drop(channels);
-                                        if rebuild() {
-                                            return;
+                                        Ok(UpdateResult::NeedsRebuild) => {
+                                            drop(channels);
+                                            if rebuild() {
+                                                return;
+                                            }
+                                            break;
                                         }
-                                        break;
-                                    }
-                                    Err(err) => {
-                                        if log {
-                                            println!(
-                                                "hot reloading failed to update rsx:\n{err:?}"
-                                            );
+                                        Err(err) => {
+                                            if log {
+                                                println!(
+                                                    "hot reloading failed to update rsx:\n{err:?}"
+                                                );
+                                            }
                                         }
                                     }
                                 }
                             }
+                            last_update_time = chrono::Local::now().timestamp_millis();
                         }
-                        last_update_time = chrono::Local::now().timestamp_millis();
                     }
-                }
-            });
+                });
+            }
+            Err(error) => println!("failed to connect to hot reloading\n{error}"),
         }
     }
 }

+ 4 - 4
packages/html/Cargo.toml

@@ -11,17 +11,17 @@ documentation = "https://dioxuslabs.com"
 keywords = ["dom", "ui", "gui", "react"]
 
 [dependencies]
-dioxus-core = { path = "../core", version = "^0.3.0" }
-dioxus-rsx = { path = "../rsx", version = "^0.0.3", optional = true }
+dioxus-core = { workspace = true }
+dioxus-rsx = { workspace = true, optional = true }
 serde = { version = "1", features = ["derive"], optional = true }
 serde_repr = { version = "0.1", optional = true }
-wasm-bindgen = { version = "0.2.79", optional = true }
+wasm-bindgen = { workspace = true, optional = true }
 euclid = "0.22.7"
 enumset = "1.0.11"
 keyboard-types = "0.6.2"
 async-trait = "0.1.58"
 serde-value = "0.7.0"
-tokio = { version = "1.27", features = ["fs", "io-util"], optional = true }
+tokio = { workspace = true, features = ["fs", "io-util"], optional = true }
 rfd = { version = "0.11.3", optional = true }
 
 [dependencies.web-sys]

+ 1 - 1
packages/interpreter/Cargo.toml

@@ -13,7 +13,7 @@ keywords = ["dom", "ui", "gui", "react", "wasm"]
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-wasm-bindgen = { version = "0.2.79", optional = true }
+wasm-bindgen = { workspace = true, optional = true }
 js-sys = { version = "0.3.56", optional = true }
 web-sys = { version = "0.3.56", optional = true, features = ["Element", "Node"] }
 sledgehammer_bindgen = { version = "0.2.1", optional = true }

+ 11 - 11
packages/liveview/Cargo.toml

@@ -14,21 +14,21 @@ license = "MIT/Apache-2.0"
 
 [dependencies]
 thiserror = "1.0.38"
-log = "0.4.14"
-slab = "0.4"
-futures-util = { version = "0.3.25", default-features = false, features = [
+log = { workspace = true }
+slab = { workspace = true }
+futures-util = { workspace = true, default-features = false, features = [
     "sink",
 ] }
-futures-channel = { version = "0.3.25", features = ["sink"] }
-tokio = { version = "1.22.0", features = ["time", "macros"] }
+futures-channel = { workspace = true }
+tokio = { workspace = true, features = ["time", "macros"] }
 tokio-stream = { version = "0.1.11", features = ["net"] }
 tokio-util = { version = "0.7.4", features = ["rt"] }
 serde = { version = "1.0.151", features = ["derive"] }
 serde_json = "1.0.91"
-dioxus-html = { path = "../html", features = ["serialize"], version = "^0.3.0" }
-dioxus-core = { path = "../core", features = ["serialize"], version = "^0.3.0" }
-dioxus-interpreter-js = { path = "../interpreter", version = "0.3.0" }
-dioxus-hot-reload = { path = "../hot-reload", optional = true }
+dioxus-html = { workspace = true, features = ["serialize"] }
+dioxus-core = { workspace = true, features = ["serialize"] }
+dioxus-interpreter-js = { workspace = true }
+dioxus-hot-reload = { workspace = true, optional = true }
 
 # warp
 warp = { version = "0.3.3", optional = true }
@@ -47,8 +47,8 @@ once_cell = "1.17.1"
 
 [dev-dependencies]
 pretty_env_logger = { version = "0.5.0" }
-tokio = { version = "1.22.0", features = ["full"] }
-dioxus = { path = "../dioxus", version = "0.3.0" }
+tokio = { workspace = true, features = ["full"] }
+dioxus = { workspace = true }
 warp = "0.3.3"
 axum = { version = "0.6.1", features = ["ws"] }
 salvo = { version = "0.37.7", features = ["affix", "ws"] }

+ 1 - 1
packages/mobile/Cargo.toml

@@ -12,7 +12,7 @@ license = "MIT/Apache-2.0"
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-dioxus-desktop = { path = "../desktop", version = "^0.3.0" }
+dioxus-desktop = { workspace = true }
 
 [lib]
 doctest = false

+ 3 - 3
packages/native-core-macro/Cargo.toml

@@ -20,7 +20,7 @@ quote = "1.0"
 
 [dev-dependencies]
 smallvec = "1.6"
-rustc-hash = "1.1.0"
+rustc-hash = { workspace = true }
 anymap = "0.12.1"
-dioxus = { path = "../dioxus" }
-dioxus-native-core = { path = "../native-core" }
+dioxus = { workspace = true }
+dioxus-native-core = { workspace = true }

+ 7 - 7
packages/native-core/Cargo.toml

@@ -11,14 +11,14 @@ keywords = ["dom", "ui", "gui", "react"]
 
 
 [dependencies]
-dioxus-core = { path = "../core", version = "^0.3.0", optional = true }
+dioxus-core = { workspace = true, optional = true }
 
 keyboard-types = "0.6.2"
 taffy = "0.3.12"
 smallvec = "1.6"
-rustc-hash = "1.1.0"
+rustc-hash = { workspace = true }
 anymap = "1.0.0-beta.2"
-slab = "0.4"
+slab = { workspace = true }
 parking_lot = { version = "0.12.1", features = ["send_guard"] }
 crossbeam-deque = "0.8.2"
 dashmap = "5.4.0"
@@ -32,10 +32,10 @@ shipyard = { version = "0.6.2", features = ["proc", "std"], default-features = f
 
 [dev-dependencies]
 rand = "0.8.5"
-dioxus = { path = "../dioxus", version = "^0.3.0" }
-tokio = { version = "*", features = ["full"] }
-dioxus-native-core = { path = ".", features = ["dioxus"] }
-dioxus-native-core-macro = { path = "../native-core-macro" }
+dioxus = { workspace = true }
+tokio = { workspace = true, features = ["full"] }
+dioxus-native-core = { workspace = true, features = ["dioxus"] }
+dioxus-native-core-macro = { workspace = true }
 
 [features]
 default = []

+ 6 - 6
packages/rink/Cargo.toml

@@ -13,20 +13,20 @@ license = "MIT/Apache-2.0"
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-dioxus-html = { path = "../html", version = "^0.3.0" }
-dioxus-native-core = { path = "../native-core", version = "^0.2.0" }
-dioxus-native-core-macro = { path = "../native-core-macro", version = "^0.3.0" }
+dioxus-html = { workspace = true }
+dioxus-native-core = { workspace = true }
+dioxus-native-core-macro = { workspace = true }
 
 tui = "0.17.0"
 crossterm = "0.23.0"
 anyhow = "1.0.42"
-tokio = { version = "1.15.0", features = ["full"] }
+tokio = { workspace = true, features = ["full"] }
 futures = "0.3.19"
 taffy = "0.3.12"
 smallvec = "1.6"
-rustc-hash = "1.1.0"
+rustc-hash = { workspace = true }
 anymap = "1.0.0-beta.2"
-futures-channel = "0.3.25"
+futures-channel = { workspace = true }
 shipyard = { version = "0.6.2", features = ["proc", "std"], default-features = false }
 once_cell = "1.17.1"
 

+ 9 - 9
packages/router/Cargo.toml

@@ -12,19 +12,19 @@ keywords = ["dom", "ui", "gui", "react", "wasm"]
 
 [dependencies]
 anyhow = "1.0.66"
-dioxus = { path="../dioxus" }
-dioxus-router-macro = { path="../router-macro" }
+dioxus = { workspace = true }
+dioxus-router-macro = { workspace = true }
 gloo = { version = "0.8.0", optional = true }
-log = "0.4.17"
-serde = { version = "1.0.163", features = ["derive"], optional = true }
+log = { workspace = true }
+serde = { version = "1", features = ["derive"], optional = true }
 thiserror = "1.0.37"
 url = "2.3.1"
-wasm-bindgen = { version = "0.2.86", optional = true }
+wasm-bindgen = { workspace = true, optional = true }
 web-sys = { version = "0.3.60", optional = true, features = ["ScrollRestoration"] }
 js-sys = { version = "0.3.63", optional = true }
 gloo-utils = { version = "0.1.6", optional = true }
-dioxus-ssr = { path = "../ssr", optional = true }
-tokio = { version = "1.28", features = ["full"], optional = true }
+dioxus-ssr = { workspace = true, optional = true }
+tokio = { workspace = true, features = ["full"], optional = true }
 
 [features]
 default = ["web"]
@@ -52,8 +52,8 @@ dioxus-desktop = { path = "../desktop" }
 
 [target.'cfg(target_family = "wasm")'.dev-dependencies]
 console_error_panic_hook = "0.1.7"
-dioxus-router = { path = ".", features = ["web"] }
-dioxus-web = { path= "../web" }
+dioxus-router = { workspace = true, features = ["web"] }
+dioxus-web = { workspace = true }
 gloo = "0.8.0"
 wasm-bindgen-test = "0.3.33"
 wasm-logger = "0.2.0"

+ 2 - 2
packages/rsx-rosetta/Cargo.toml

@@ -13,8 +13,8 @@ keywords = ["dom", "ui", "gui", "react"]
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-dioxus-autofmt = { path = "../autofmt", version = "0.3.0" }
-dioxus-rsx = { path = "../rsx" , version = "^0.0.3" }
+dioxus-autofmt = { workspace = true }
+dioxus-rsx = { workspace = true }
 html_parser = "0.6.3"
 proc-macro2 = "1.0.49"
 quote = "1.0.23"

+ 1 - 1
packages/rsx/Cargo.toml

@@ -13,7 +13,7 @@ keywords = ["dom", "ui", "gui", "react"]
 
 [dependencies]
 proc-macro2 = { version = "1.0", features = ["span-locations"] }
-dioxus-core = { path = "../core", version = "^0.3.0"}
+dioxus-core = { workspace = true}
 syn = { version = "1.0", features = ["full", "extra-traits"] }
 quote = { version = "1.0" }
 serde = { version = "1.0", features = ["derive"] }

+ 2 - 2
packages/signals/Cargo.toml

@@ -6,5 +6,5 @@ edition = "2018"
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-dioxus-core = { path = "../core" }
-slab = "0.4.7"
+dioxus-core = { workspace = true }
+slab = { workspace = true }

+ 2 - 2
packages/ssr/Cargo.toml

@@ -13,7 +13,7 @@ keywords = ["dom", "ui", "gui", "react", "ssr"]
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-dioxus-core = { path = "../core", version = "^0.3.0", features = ["serialize"] }
+dioxus-core = { workspace = true, features = ["serialize"] }
 askama_escape = "0.10.3"
 thiserror = "1.0.23"
 rustc-hash = "1.1.0"
@@ -23,7 +23,7 @@ http = "0.2.9"
 tokio = { version = "1.28", features = ["full"] }
 
 [dev-dependencies]
-dioxus = { path = "../dioxus", version = "0.3.0" }
+dioxus = { workspace = true }
 fern = { version = "0.6.0", features = ["colored"] }
 anyhow = "1.0"
 argh = "0.1.4"

+ 11 - 11
packages/web/Cargo.toml

@@ -11,25 +11,25 @@ documentation = "https://dioxuslabs.com"
 keywords = ["dom", "ui", "gui", "react", "wasm"]
 
 [dependencies]
-dioxus-core = { path = "../core", version = "^0.3.0", features = ["serialize"] }
-dioxus-html = { path = "../html", version = "^0.3.0", features = ["wasm-bind"] }
-dioxus-interpreter-js = { path = "../interpreter", version = "^0.3.0", features = [
+dioxus-core = { workspace = true, features = ["serialize"] }
+dioxus-html = { workspace = true, features = ["wasm-bind"] }
+dioxus-interpreter-js = { workspace = true, features = [
     "sledgehammer",
     "minimal_bindings",
 ] }
 
 js-sys = "0.3.56"
-wasm-bindgen = { version = "0.2.79", features = ["enable-interning"] }
+wasm-bindgen = { workspace = true, features = ["enable-interning"] }
 wasm-bindgen-futures = "0.4.29"
-log = "0.4.14"
-rustc-hash = "1.1.0"
+log = { workspace = true }
+rustc-hash = { workspace = true }
 console_error_panic_hook = { version = "0.1.7", optional = true }
 once_cell = "1.9.0"
 anyhow = "1.0.53"
 gloo-timers = { version = "0.2.3", features = ["futures"] }
-futures-util = "0.3.19"
+futures-util = { workspace = true, features = ["std", "async-await", "async-await-macro"] }
 smallstr = "0.2.0"
-futures-channel = "0.3.21"
+futures-channel = { workspace = true }
 serde_json = { version = "1.0" }
 serde = { version = "1.0" }
 serde-wasm-bindgen = "0.4.5"
@@ -89,8 +89,8 @@ panic_hook = ["console_error_panic_hook"]
 hydrate = []
 
 [dev-dependencies]
-dioxus = { path = "../dioxus", version = "0.3.0" }
+dioxus = { workspace = true }
 wasm-bindgen-test = "0.3.29"
-dioxus-ssr = { path = "../ssr", version = "0.3.0"}
+dioxus-ssr = { workspace = true}
 wasm-logger = "0.2.0"
-dioxus-web = { path = ".", features = ["hydrate"] }
+dioxus-web = { workspace = true, features = ["hydrate"] }