diff --git a/packages/cli/src/build/request.rs b/packages/cli/src/build/request.rs
index 0e5ca3960..55a0fd187 100644
--- a/packages/cli/src/build/request.rs
+++ b/packages/cli/src/build/request.rs
@@ -3841,7 +3841,7 @@ impl BuildRequest {
};
// Inject any resources from the config into the html
- self.inject_resources(assets, &mut html)?;
+ self.inject_resources(assets, wasm_path, &mut html)?;
// Inject loading scripts if they are not already present
self.inject_loading_scripts(&mut html);
@@ -3860,7 +3860,12 @@ impl BuildRequest {
}
// Inject any resources from the config into the html
- fn inject_resources(&self, assets: &AssetManifest, html: &mut String) -> Result<()> {
+ fn inject_resources(
+ &self,
+ assets: &AssetManifest,
+ wasm_path: &str,
+ html: &mut String,
+ ) -> Result<()> {
use std::fmt::Write;
// Collect all resources into a list of styles and scripts
@@ -3930,19 +3935,10 @@ impl BuildRequest {
}
// Manually inject the wasm file for preloading. WASM currently doesn't support preloading in the manganis asset system
- let wasm_source_path = self.wasm_bindgen_wasm_output_file();
- if let Some(wasm_assets) = assets.get_assets_for_source(&wasm_source_path) {
- let wasm_path = wasm_assets
- .iter()
- .next()
- .expect("There should be exactly one optimized wasm asset");
- let wasm_path = wasm_path.bundled_path();
- head_resources.push_str(&format!(
- ""
- ));
-
- Self::replace_or_insert_before("{style_include}", ""
+ ));
+ Self::replace_or_insert_before("{style_include}", " Element {
NavigationTarget::Internal(url) => url.clone(),
NavigationTarget::External(route) => route.clone(),
};
- // Add the history's prefix to the href for use in the rsx
- let full_href = router.prefix().unwrap_or_default() + &href;
+ // Add the history's prefix to internal hrefs for use in the rsx
+ let full_href = match &to {
+ NavigationTarget::Internal(url) => router.prefix().unwrap_or_default() + url,
+ NavigationTarget::External(route) => route.clone(),
+ };
let mut class_ = String::new();
if let Some(c) = class {
diff --git a/packages/router/tests/via_ssr/link.rs b/packages/router/tests/via_ssr/link.rs
index 58c64e8d5..c9f3fbaf3 100644
--- a/packages/router/tests/via_ssr/link.rs
+++ b/packages/router/tests/via_ssr/link.rs
@@ -8,10 +8,15 @@ fn prepare() -> String {
}
fn prepare_at(at: impl ToString) -> String {
+ prepare_at_with_base_path::(at, "")
+}
+
+fn prepare_at_with_base_path(at: impl ToString, base_path: impl ToString) -> String {
let mut vdom = VirtualDom::new_with_props(
App,
AppProps:: {
at: at.to_string(),
+ base_path: base_path.to_string(),
phantom: std::marker::PhantomData,
},
);
@@ -21,6 +26,7 @@ fn prepare_at(at: impl ToString) -> String {
#[derive(Props)]
struct AppProps {
at: String,
+ base_path: String,
phantom: std::marker::PhantomData,
}
@@ -28,6 +34,7 @@ fn prepare_at(at: impl ToString) -> String {
fn clone(&self) -> Self {
Self {
at: self.at.clone(),
+ base_path: self.base_path.clone(),
phantom: std::marker::PhantomData,
}
}
@@ -44,7 +51,7 @@ fn prepare_at(at: impl ToString) -> String {
rsx! {
h1 { "App" }
HistoryProvider {
- history: move |_| Rc::new(MemoryHistory::with_initial_path(props.at.clone())) as Rc,
+ history: move |_| Rc::new(MemoryHistory::with_initial_path(props.at.clone()).with_prefix(props.base_path.clone())) as Rc,
Router:: {}
}
}
@@ -79,6 +86,15 @@ fn href_internal() {
let expected = format!("
App
Link", href = r#"href="/test""#,);
assert_eq!(prepare::(), expected);
+
+ // The base path should be added to the front of internal links
+ let base_path = "/deeply/nested/path";
+ let expected = format!(
+ "