From 3ca8861d85da3af6a85789b4ebbe6189236cdec0 Mon Sep 17 00:00:00 2001 From: Valerio Ageno Date: Tue, 25 Jun 2024 18:48:55 +0200 Subject: [PATCH] feat: use the correct public folder according to the mode --- crates/tuono/src/source_builder.rs | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/crates/tuono/src/source_builder.rs b/crates/tuono/src/source_builder.rs index 4aef864f..0c5152fc 100644 --- a/crates/tuono/src/source_builder.rs +++ b/crates/tuono/src/source_builder.rs @@ -73,10 +73,7 @@ async fn main() { let app = Router::new() // ROUTE_BUILDER - .fallback_service( - ServeDir::new("public")) - .fallback_service(ServeDir::new("out/client") - .fallback(get(catch_all))) + .fallback_service(ServeDir::new("/*public_dir*/").fallback(get(catch_all))) .with_state(fetch); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); @@ -112,6 +109,8 @@ async fn catch_all(Path(params): Path>, request: Request const ROOT_FOLDER: &str = "src/routes"; const DEV_FOLDER: &str = ".tuono"; +const DEV_PUBLIC_DIR: &str = "public"; +const PROD_PUBLIC_DIR: &str = "out/client"; #[derive(Debug, PartialEq, Eq)] struct Route { @@ -255,6 +254,12 @@ pub fn bundle_axum_source(mode: Mode) -> io::Result<()> { } fn generate_axum_source(source_builder: &SourceBuilder, mode: Mode) -> String { + let public_dir = if mode == Mode::Prod { + PROD_PUBLIC_DIR + } else { + DEV_PUBLIC_DIR + }; + AXUM_ENTRY_POINT .replace( "// ROUTE_BUILDER\n", @@ -264,6 +269,7 @@ fn generate_axum_source(source_builder: &SourceBuilder, mode: Mode) -> String { "// MODULE_IMPORTS\n", &create_modules_declaration(&source_builder.route_map), ) + .replace("/*public_dir*/", public_dir) .replace("/*MODE*/", mode.as_str()) } @@ -404,4 +410,20 @@ mod tests { assert_eq!(dev, "Mode::Dev"); assert_eq!(prod, "Mode::Prod"); } + + #[test] + fn should_replace_the_correct_public_folder_dev() { + let source_builder = SourceBuilder::new(); + let source = generate_axum_source(&source_builder, Mode::Dev); + + assert!(source.contains(r#"ServeDir::new("public")"#)) + } + + #[test] + fn should_replace_the_correct_public_folder_prod() { + let source_builder = SourceBuilder::new(); + let source = generate_axum_source(&source_builder, Mode::Prod); + + assert!(source.contains(r#"ServeDir::new("out/client")"#)) + } }