From 7e64201ddb193af985cacee726da2348082504b1 Mon Sep 17 00:00:00 2001 From: hulxv Date: Sat, 24 Aug 2024 17:18:27 +0300 Subject: [PATCH 1/3] fix(cli): return default values for cli --- metassr-cli/src/cli/mod.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/metassr-cli/src/cli/mod.rs b/metassr-cli/src/cli/mod.rs index cf3207f..11ba45b 100644 --- a/metassr-cli/src/cli/mod.rs +++ b/metassr-cli/src/cli/mod.rs @@ -19,7 +19,7 @@ Command line interface application for MetaSSR framework. This CLI tool helps yo )] pub struct Args { /// The path of the project root directory. - #[arg(long)] + #[arg(long, default_value_t = String::from("."))] pub root: String, /// Enable debug mode to provide more detailed logs. @@ -49,18 +49,18 @@ pub enum Commands { /// Builds your web application into a deployable format. Build { /// The output directory where build files will be saved. - #[arg(long)] + #[arg(long, default_value_t = String::from("dist"))] out_dir: String, /// The type of build to perform. Choose between SSR (Server-Side Rendering) and SSG (Static Site Generation). - #[arg(short = 't', long = "type")] + #[arg(short = 't', long = "type", default_value_t = BuildingType::SSR)] build_type: BuildingType, }, /// Runs the Server-Side Rendered (SSR) application. Run { /// The port number on which the HTTP server will run. - #[arg(long)] + #[arg(long, default_value_t = 8080)] port: u16, /// Serve the generated static site directly. @@ -75,15 +75,15 @@ pub enum Commands { project_name: String, /// The version of your web application. - #[arg(long, short)] + #[arg(long, short, default_value_t = String::from("1.0.0"))] version: String, /// A brief description of your web application. - #[arg(long, short)] + #[arg(long, short, default_value_t = String::from("A web application built with MetaSSR framework"))] description: String, /// The template to use for creating the new project. - #[arg(long, short)] + #[arg(long, short, default_value_t = Template::Javascript)] template: Template, }, } From 1b1f046b61c97a4bdecbc62195ae7cb3a13547c2 Mon Sep 17 00:00:00 2001 From: hulxv Date: Sat, 24 Aug 2024 18:42:24 +0300 Subject: [PATCH 2/3] fix(builder): `render_head` not found --- crates/metassr-build/src/server/manifest.rs | 2 +- .../src/server/pages_generator.rs | 2 +- .../metassr-build/src/server/renderer/head.rs | 41 +++++++++++-------- .../metassr-build/src/server/renderer/page.rs | 2 +- crates/metassr-build/src/utils.rs | 10 +---- 5 files changed, 28 insertions(+), 29 deletions(-) diff --git a/crates/metassr-build/src/server/manifest.rs b/crates/metassr-build/src/server/manifest.rs index 3e12780..e108c5a 100644 --- a/crates/metassr-build/src/server/manifest.rs +++ b/crates/metassr-build/src/server/manifest.rs @@ -46,7 +46,7 @@ impl GlobalEntry { { Ok(Self { head: PathBuf::from(head).canonicalize()?, - cache: PathBuf::from(cache).canonicalize()?, + cache: PathBuf::from(cache), }) } } diff --git a/crates/metassr-build/src/server/pages_generator.rs b/crates/metassr-build/src/server/pages_generator.rs index e5488fb..b8fe4ea 100644 --- a/crates/metassr-build/src/server/pages_generator.rs +++ b/crates/metassr-build/src/server/pages_generator.rs @@ -33,7 +33,7 @@ impl PagesGenerator { cache_dir: CacheDir, ) -> Result { let dist = DistDir::new(dist_path)?.analyze()?; - let head = HeadRenderer::new(&head_path, cache_dir.clone()).render()?; + let head = HeadRenderer::new(&head_path, cache_dir.clone()).render(true)?; let cache = cache_dir.dir_path(); let output = MultiRenderExec::new(targets.ready_for_exec())?.exec()?; diff --git a/crates/metassr-build/src/server/renderer/head.rs b/crates/metassr-build/src/server/renderer/head.rs index d692541..1ec75a3 100644 --- a/crates/metassr-build/src/server/renderer/head.rs +++ b/crates/metassr-build/src/server/renderer/head.rs @@ -51,9 +51,11 @@ impl HeadRenderer { } } - pub fn render(&mut self) -> Result { - let script = format!( - r#" + pub fn render(&mut self, bundler: bool) -> Result { + if !IS_HEAD_SCRIPT_LOADED.lock().unwrap().is_loaded() { + if bundler { + let script = format!( + r#" import Head from "{}" import {{ renderToString }} from "react-dom/server" import React from "react" @@ -61,27 +63,30 @@ import React from "react" export function render_head() {{ return renderToString(); }} - "#, - self.path.canonicalize()?.display() - ); + + "#, + self.path.canonicalize()?.display() + ); - let path = self.cache_dir.insert("head.js", script.as_bytes())?; + let path = self.cache_dir.insert("head.js", script.as_bytes())?; - if !IS_HEAD_SCRIPT_LOADED.lock().unwrap().is_loaded() { - let mut name = path.clone(); - name.set_extension(""); - let name = name.to_str().unwrap().to_string(); + let name = PathBuf::from(path.clone().file_name().unwrap()) + .with_extension("") + .to_str() + .unwrap() + .to_string(); - let fullpath = path.canonicalize()?.to_str().unwrap().to_string(); + let fullpath = path.canonicalize()?.to_str().unwrap().to_string(); - let target = HashMap::from([(name, fullpath)]); + let target = HashMap::from([(name, fullpath)]); - if let Err(e) = WebBundler::new(&target, &self.cache_dir.dir_path()).exec() { - return Err(anyhow!("Cannot bundling head: {e}")); - } + if let Err(e) = WebBundler::new(&target, &self.cache_dir.dir_path()).exec() { + return Err(anyhow!("Cannot bundling head: {e}")); + } - // TODO: remove this line - sleep(Duration::from_millis(500)); + // TODO: remove this line + sleep(Duration::from_millis(500)); + } let _ = loaders::from_single_file( "node", diff --git a/crates/metassr-build/src/server/renderer/page.rs b/crates/metassr-build/src/server/renderer/page.rs index ff3ea3b..a57f559 100644 --- a/crates/metassr-build/src/server/renderer/page.rs +++ b/crates/metassr-build/src/server/renderer/page.rs @@ -28,7 +28,7 @@ impl PageRenderer { let exec = RenderExec::new(entry.id, &entry.renderer)?; let body = exec.exec()?; - let head = HeadRenderer::new(&manifest.global.head, cache).render()?; + let head = HeadRenderer::new(&manifest.global.head, cache).render(false)?; Ok(Self { head, diff --git a/crates/metassr-build/src/utils.rs b/crates/metassr-build/src/utils.rs index fdca076..eb32fdf 100644 --- a/crates/metassr-build/src/utils.rs +++ b/crates/metassr-build/src/utils.rs @@ -6,15 +6,9 @@ use std::{ pub fn setup_page_path(page: &str, ext: &str) -> PathBuf { match Path::new(page) { path if path.file_stem() != Some(OsStr::new("index")) => { - let mut path = path.to_path_buf(); - path.set_extension(""); - path.join(format!("index.{ext}")) + path.to_path_buf().with_extension("").join(format!("index.{ext}")) } - path => { - let mut path = path.to_path_buf(); - path.set_extension(ext); - path - } + path => path.to_path_buf().with_extension(ext), } } From eb0be022d8974a08965f365e1fe5b3fb24a96f26 Mon Sep 17 00:00:00 2001 From: hulxv Date: Sat, 24 Aug 2024 18:43:05 +0300 Subject: [PATCH 3/3] feat(builder): render `head` at build-time --- crates/metassr-build/src/server/mod.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/crates/metassr-build/src/server/mod.rs b/crates/metassr-build/src/server/mod.rs index 2fd53fa..e8ecf00 100644 --- a/crates/metassr-build/src/server/mod.rs +++ b/crates/metassr-build/src/server/mod.rs @@ -18,6 +18,7 @@ use metassr_utils::{ traits::AnalyzeDir, }; use pages_generator::PagesGenerator; +use renderer::head::HeadRenderer; use std::{ ffi::OsStr, @@ -79,7 +80,6 @@ impl Build for ServerSideBuilder { Err(e) => return Err(anyhow!("Couldn't generate targets: {e}")), }; - if let Err(e) = WebBundler::new( &targets.ready_for_bundling(&self.dist_path), &self.dist_path, @@ -93,9 +93,13 @@ impl Build for ServerSideBuilder { sleep(Duration::from_secs(1)); let dist = DistDir::new(&self.dist_path)?.analyze()?; - ManifestGenerator::new(targets.clone(), cache_dir.clone(), dist) - .generate(&head)? - .write(&self.dist_path)?; + let manifest = + ManifestGenerator::new(targets.clone(), cache_dir.clone(), dist).generate(&head)?; + manifest.write(&self.dist_path.clone())?; + + if let Err(e) = HeadRenderer::new(&manifest.global.head, cache_dir.clone()).render(true) { + return Err(anyhow!("Coludn't render head: {e}")); + } if self.building_type == BuildingType::StaticSiteGeneration { if let Err(e) =