From 8636ada3a420f51b6522c4ac815d7493509ffead Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Thu, 25 Jul 2024 02:52:28 +0200 Subject: [PATCH] Add a deprecation warning for the resource option in dioxus.toml (#2642) * Add a deprecation warning for the resource option in dioxus.toml * fix name of resource config * fix tab spacing issue --------- Co-authored-by: Jonathan Kelley --- examples/PWA-example/Dioxus.toml | 15 ---- examples/openid_connect_demo/Dioxus.toml | 15 ---- examples/tailwind/Dioxus.toml | 19 ----- packages/cli/Dioxus.toml | 23 ------ packages/cli/assets/dioxus.toml | 15 ---- packages/cli/src/builder/prepare_html.rs | 97 ++++++++++++++++++++++-- packages/cli/src/builder/web.rs | 2 +- 7 files changed, 91 insertions(+), 95 deletions(-) diff --git a/examples/PWA-example/Dioxus.toml b/examples/PWA-example/Dioxus.toml index e3a472520..a831a28ff 100644 --- a/examples/PWA-example/Dioxus.toml +++ b/examples/PWA-example/Dioxus.toml @@ -25,18 +25,3 @@ reload_html = true # which files or dirs will be watcher monitoring watch_path = ["src", "public"] - -# include `assets` in web platform -[web.resource] - -# CSS style file -style = [] - -# Javascript code file -script = [] - -[web.resource.dev] - -# Javascript code file -# serve: [dev-server] only -script = [] diff --git a/examples/openid_connect_demo/Dioxus.toml b/examples/openid_connect_demo/Dioxus.toml index d924a5d4f..3a130e2ea 100644 --- a/examples/openid_connect_demo/Dioxus.toml +++ b/examples/openid_connect_demo/Dioxus.toml @@ -28,21 +28,6 @@ index_on_404 = true watch_path = ["src"] -# include `assets` in web platform -[web.resource] - -# CSS style file -style = [] - -# Javascript code file -script = [] - -[web.resource.dev] - -# Javascript code file -# serve: [dev-server] only -script = [] - [application.plugins] available = true diff --git a/examples/tailwind/Dioxus.toml b/examples/tailwind/Dioxus.toml index b7e78ff7f..af7fcf3b8 100644 --- a/examples/tailwind/Dioxus.toml +++ b/examples/tailwind/Dioxus.toml @@ -25,22 +25,3 @@ reload_html = true # which files or dirs will be watcher monitoring watch_path = ["src", "public"] - -# include `assets` in web platform -[web.resource] - -# CSS style file -style = [] - -# Javascript code file -script = [] - -[web.resource.dev] - -# serve: [dev-server] only - -# CSS style file -style = [] - -# Javascript code file -script = [] diff --git a/packages/cli/Dioxus.toml b/packages/cli/Dioxus.toml index b314e4310..b8ee45bd4 100644 --- a/packages/cli/Dioxus.toml +++ b/packages/cli/Dioxus.toml @@ -25,28 +25,5 @@ reload_html = true # Which files or dirs will be monitored watch_path = ["src", "public"] -# Include style or script assets -[web.resource] - -# CSS style file -style = [] - -# Javascript code file -script = [] - -[web.resource.dev] - -# Same as [web.resource], but for development servers - -# CSS style file -style = [] - -# JavaScript files -script = [] - [[web.proxy]] backend = "http://localhost:8000/api/" - -# [cli_settings] -# always_hot_reload = true -# always_open_browser = true \ No newline at end of file diff --git a/packages/cli/assets/dioxus.toml b/packages/cli/assets/dioxus.toml index 0ce138a8c..6461b2806 100644 --- a/packages/cli/assets/dioxus.toml +++ b/packages/cli/assets/dioxus.toml @@ -32,21 +32,6 @@ index_on_404 = true watch_path = ["src", "examples"] -# include `assets` in web platform -[web.resource] - -# CSS style file -style = [] - -# Javascript code file -script = [] - -[web.resource.dev] - -# Javascript code file -# serve: [dev-server] only -script = [] - [bundler] # Bundle identifier identifier = "io.github.{{project-name}}" diff --git a/packages/cli/src/builder/prepare_html.rs b/packages/cli/src/builder/prepare_html.rs index 39c894bc9..f82922bff 100644 --- a/packages/cli/src/builder/prepare_html.rs +++ b/packages/cli/src/builder/prepare_html.rs @@ -1,19 +1,26 @@ //! Build the HTML file to load a web application. The index.html file may be created from scratch or modified from the `index.html` file in the crate root. -use super::BuildRequest; +use super::{BuildRequest, UpdateBuildProgress}; +use crate::builder::Stage; use crate::Result; +use futures_channel::mpsc::UnboundedSender; use manganis_cli_support::AssetManifest; use std::fmt::Write; -use std::path::Path; +use std::path::{Path, PathBuf}; +use tracing::Level; const DEFAULT_HTML: &str = include_str!("../../assets/index.html"); impl BuildRequest { - pub(crate) fn prepare_html(&self, assets: Option<&AssetManifest>) -> Result { + pub(crate) fn prepare_html( + &self, + assets: Option<&AssetManifest>, + progress: &mut UnboundedSender, + ) -> Result { let mut html = html_or_default(&self.dioxus_crate.crate_dir()); // Inject any resources from the config into the html - self.inject_resources(&mut html, assets)?; + self.inject_resources(&mut html, assets, progress)?; // Inject loading scripts if they are not already present self.inject_loading_scripts(&mut html); @@ -29,7 +36,12 @@ impl BuildRequest { } // Inject any resources from the config into the html - fn inject_resources(&self, html: &mut String, assets: Option<&AssetManifest>) -> Result<()> { + fn inject_resources( + &self, + html: &mut String, + assets: Option<&AssetManifest>, + progress: &mut UnboundedSender, + ) -> Result<()> { // Collect all resources into a list of styles and scripts let resources = &self.dioxus_crate.dioxus_config.web.resource; let mut style_list = resources.style.clone().unwrap_or_default(); @@ -42,7 +54,7 @@ impl BuildRequest { let mut head_resources = String::new(); // Add all styles to the head - for style in style_list { + for style in &style_list { writeln!( &mut head_resources, "", @@ -50,8 +62,12 @@ impl BuildRequest { )?; } + if !style_list.is_empty() { + self.send_resource_deprecation_warning(progress, style_list, ResourceType::Style); + } + // Add all scripts to the head - for script in script_list { + for script in &script_list { writeln!( &mut head_resources, "", @@ -59,6 +75,10 @@ impl BuildRequest { )?; } + if !script_list.is_empty() { + self.send_resource_deprecation_warning(progress, script_list, ResourceType::Script); + } + // Inject any resources from manganis into the head if let Some(assets) = assets { head_resources.push_str(&assets.head()); @@ -109,6 +129,69 @@ impl BuildRequest { let app_name = &self.dioxus_crate.dioxus_config.application.name; *html = html.replace("{app_name}", app_name); } + + fn send_resource_deprecation_warning( + &self, + progress: &mut UnboundedSender, + paths: Vec, + variant: ResourceType, + ) { + const RESOURCE_DEPRECATION_MESSAGE: &str = r#"The `web.resource` config has been deprecated in favor of head components and will be removed in a future release. Instead of including assets in the config, you can include assets with the `asset!` macro and add them to the head with `head::Link` and `Script` components."#; + + let replacement_components = paths + .iter() + .map(|path| { + let path = if path.exists() { + path.to_path_buf() + } else { + // If the path is absolute, make it relative to the current directory before we join it + // The path is actually a web path which is relative to the root of the website + let path = path.strip_prefix("/").unwrap_or(path); + let asset_dir_path = self.dioxus_crate.asset_dir().join(path); + if let Ok(absolute_path) = asset_dir_path.canonicalize() { + let absolute_crate_root = + self.dioxus_crate.crate_dir().canonicalize().unwrap(); + PathBuf::from("./") + .join(absolute_path.strip_prefix(absolute_crate_root).unwrap()) + } else { + path.to_path_buf() + } + }; + match variant { + ResourceType::Style => format!( + " head::Link {{ rel: \"stylesheet\", href: asset!(css(\"{}\")) }}", + path.display() + ), + ResourceType::Script => { + format!(" Script {{ src: asset!(file(\"{}\")) }}", path.display()) + } + } + }) + .collect::>(); + let replacement_components = format!("rsx! {{\n{}\n}}", replacement_components.join("\n")); + let section_name = match variant { + ResourceType::Style => "web.resource.style", + ResourceType::Script => "web.resource.script", + }; + + let message = format!( + "{RESOURCE_DEPRECATION_MESSAGE}\nTo migrate to head components, remove `{section_name}` and include the following rsx in your root component:\n```rust\n{replacement_components}\n```" + ); + + _ = progress.unbounded_send(UpdateBuildProgress { + stage: Stage::OptimizingWasm, + update: super::UpdateStage::AddMessage(super::BuildMessage { + level: Level::WARN, + message: super::MessageType::Text(message), + source: None, + }), + }); + } +} + +enum ResourceType { + Style, + Script, } /// Read the html file from the crate root or use the default html file diff --git a/packages/cli/src/builder/web.rs b/packages/cli/src/builder/web.rs index 7530f44a5..5275d7220 100644 --- a/packages/cli/src/builder/web.rs +++ b/packages/cli/src/builder/web.rs @@ -176,7 +176,7 @@ impl BuildRequest { // Note that we do this last since the webserver will attempt to serve the index.html file // If we do this too early, the wasm won't be ready but the index.html will be served, leading // to test failures and broken pages. - let html = self.prepare_html(assets)?; + let html = self.prepare_html(assets, progress)?; let html_path = self.dioxus_crate.out_dir().join("index.html"); std::fs::write(html_path, html)?;