diff --git a/packages/cli/Cargo.toml b/packages/cli/Cargo.toml index c6a7aeb03..87301100c 100644 --- a/packages/cli/Cargo.toml +++ b/packages/cli/Cargo.toml @@ -81,7 +81,7 @@ toml_edit = "0.19.11" tauri-bundler = { version = "1.2", features = ["native-tls-vendored"] } tauri-utils = "1.3" -collect-assets = { git = "https://github.com/DioxusLabs/collect-assets" } +assets-cli-support = { git = "https://github.com/DioxusLabs/collect-assets" } dioxus-autofmt = { workspace = true } dioxus-check = { workspace = true } diff --git a/packages/cli/src/builder.rs b/packages/cli/src/builder.rs index 332490fda..ee5e5ff89 100644 --- a/packages/cli/src/builder.rs +++ b/packages/cli/src/builder.rs @@ -2,8 +2,8 @@ use crate::{ config::{CrateConfig, ExecutableType}, error::{Error, Result}, tools::Tool, - DioxusConfig, }; +use assets_cli_support::AssetManifestExt; use cargo_metadata::{diagnostic::Diagnostic, Message}; use indicatif::{ProgressBar, ProgressStyle}; use serde::Serialize; @@ -239,6 +239,8 @@ pub fn build(config: &CrateConfig, quiet: bool) -> Result { } } + process_assets(config)?; + Ok(BuildResult { warnings: warning_messages, elapsed_time: t_start.elapsed().as_millis(), @@ -428,7 +430,7 @@ fn prettier_build(cmd: subprocess::Exec) -> anyhow::Result> { Ok(warning_messages) } -pub fn gen_page(config: &DioxusConfig, serve: bool) -> String { +pub fn gen_page(config: &CrateConfig, serve: bool) -> String { let crate_root = crate::cargo::crate_root().unwrap(); let custom_html_file = crate_root.join("index.html"); let mut html = if custom_html_file.is_file() { @@ -443,7 +445,7 @@ pub fn gen_page(config: &DioxusConfig, serve: bool) -> String { String::from(include_str!("./assets/index.html")) }; - let resouces = config.web.resource.clone(); + let resouces = config.dioxus_config.web.resource.clone(); let mut style_list = resouces.style.unwrap_or_default(); let mut script_list = resouces.script.unwrap_or_default(); @@ -462,7 +464,7 @@ pub fn gen_page(config: &DioxusConfig, serve: bool) -> String { &style.to_str().unwrap(), )) } - if config + if config.dioxus_config .application .tools .clone() @@ -471,6 +473,26 @@ pub fn gen_page(config: &DioxusConfig, serve: bool) -> String { { style_str.push_str("\n"); } + let manifest = config.asset_manifest(); + for package in manifest.packages() { + for asset in package.assets(){ + if let assets_cli_support::AssetType::File(file) = asset { + match file.options(){ + assets_cli_support::FileOptions::Css(_) => { + let asset_path = file.served_location(); + style_str.push_str(&format!("\n")) + } + assets_cli_support::FileOptions::Image(image_options) => { + if image_options.preload(){ + let asset_path = file.served_location(); + style_str.push_str(&format!("\n")) + } + } + _ => {} + } + } + } + } replace_or_insert_before("{style_include}", &style_str, " String { ); } - let base_path = match &config.web.app.base_path { + let base_path = match &config.dioxus_config.web.app.base_path { Some(path) => path, None => ".", }; - let app_name = &config.application.name; + let app_name = &config.dioxus_config.application.name; // Check if a script already exists if html.contains("{app_name}") && html.contains("{base_path}") { html = html.replace("{app_name}", app_name); @@ -520,7 +542,7 @@ pub fn gen_page(config: &DioxusConfig, serve: bool) -> String { } let title = config - .web + .dioxus_config.web .app .title .clone() @@ -687,9 +709,33 @@ fn build_assets(config: &CrateConfig) -> Result> { } // SASS END + // Set up the collect asset config + let config = assets_cli_support::Config::default().with_assets_serve_location("/"); + config.save(); + Ok(result) } +/// Process any assets collected from the binary +fn process_assets(config: &CrateConfig) -> anyhow::Result<()> { + let manifest = config.asset_manifest(); + + let static_asset_output_dir = PathBuf::from( + config + .dioxus_config + .web + .app + .base_path + .clone() + .unwrap_or_default(), + ); + let static_asset_output_dir = config.out_dir.join(static_asset_output_dir); + + manifest.copy_static_assets_to(&static_asset_output_dir)?; + + Ok(()) +} + // use binary_install::{Cache, Download}; // /// Attempts to find `wasm-opt` in `PATH` locally, or failing that downloads a diff --git a/packages/cli/src/cli/build.rs b/packages/cli/src/cli/build.rs index 3053a6e5a..9d264c366 100644 --- a/packages/cli/src/cli/build.rs +++ b/packages/cli/src/cli/build.rs @@ -49,7 +49,7 @@ impl Build { } } - let temp = gen_page(&crate_config.dioxus_config, false); + let temp = gen_page(&crate_config, false); let mut file = std::fs::File::create( crate_config diff --git a/packages/cli/src/cli/serve.rs b/packages/cli/src/cli/serve.rs index 433d611b7..774241b0f 100644 --- a/packages/cli/src/cli/serve.rs +++ b/packages/cli/src/cli/serve.rs @@ -56,7 +56,7 @@ impl Serve { } pub fn regen_dev_page(crate_config: &CrateConfig) -> Result<()> { - let serve_html = gen_page(&crate_config.dioxus_config, true); + let serve_html = gen_page(&crate_config, true); let dist_path = crate_config.crate_dir.join( crate_config diff --git a/packages/cli/src/config.rs b/packages/cli/src/config.rs index 2e499451f..a93570803 100644 --- a/packages/cli/src/config.rs +++ b/packages/cli/src/config.rs @@ -1,4 +1,5 @@ -use crate::{cfg::Platform, error::Result}; +use assets_cli_support::AssetManifest;use crate::{cfg::Platform, error::Result}; +use assets_cli_support::AssetManifestExt; use serde::{Deserialize, Serialize}; use std::{ collections::HashMap, @@ -297,6 +298,13 @@ impl CrateConfig { }) } + pub fn asset_manifest(&self) -> AssetManifest { + AssetManifest::load_from_path( + self.crate_dir.join("cargo.toml"), + self.workspace_dir.join("cargo.lock"), + ) + } + pub fn as_example(&mut self, example_name: String) -> &mut Self { self.executable = ExecutableType::Example(example_name); self