diff --git a/.gitignore b/.gitignore index 694342365..5a122c180 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ trace-*.json **/.temp .DS_Store .cargo +server/assets_tmp diff --git a/.vscode/settings.json b/.vscode/settings.json index 05774d35e..9a83dfac5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -24,7 +24,7 @@ "eslint.packageManager": "pnpm", "eslint.quiet": true, "editor.codeActionsOnSave": { - "source.fixAll.eslint": true, + "source.fixAll.eslint": "explicit" }, "jest.enableInlineErrorMessages": true, "jest.showCoverageOnLoad": true, diff --git a/Cargo.lock b/Cargo.lock index 3f5d47856..c59440207 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -520,6 +520,7 @@ dependencies = [ "clap 4.0.26", "colored", "dialoguer", + "dircpy", "directories", "dotenv", "futures", @@ -1432,6 +1433,17 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "dircpy" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8466f8d28ca6da4c9dfbbef6ad4bff6f2fdd5e412d821025b0d3f0a9d74a8c1e" +dependencies = [ + "jwalk", + "log", + "walkdir", +] + [[package]] name = "directories" version = "4.0.1" @@ -2616,6 +2628,16 @@ dependencies = [ "treediff", ] +[[package]] +name = "jwalk" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2735847566356cd2179a2a38264839308f7079fa96e6bd5a42d740460e003c56" +dependencies = [ + "crossbeam", + "rayon", +] + [[package]] name = "kuchiki" version = "0.8.1" diff --git a/server/Cargo.toml b/server/Cargo.toml index d260b761a..c7b88cad7 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -17,6 +17,7 @@ path = "src/bin.rs" [build-dependencies] static-files = "0.2" walkdir = "2" +dircpy = "0.3.15" [dependencies] actix = ">= 0.12, < 0.14" diff --git a/server/build.rs b/server/build.rs index 9b921306a..b2437e39a 100644 --- a/server/build.rs +++ b/server/build.rs @@ -2,9 +2,10 @@ use std::time::SystemTime; use static_files::resource_dir; -const JS_DIST: &str = "../browser/data-browser/dist"; +const JS_DIST_SOURCE: &str = "../browser/data-browser/dist"; const SRC_BROWSER: &str = "../browser/data-browser/src"; const BROWSER_ROOT: &str = "../browser/"; +const JS_DIST_TMP: &str = "./assets_tmp"; macro_rules! p { ($($tokens: tt)*) => { @@ -16,20 +17,26 @@ fn main() -> std::io::Result<()> { println!("cargo:rerun-if-changed={}", BROWSER_ROOT); if should_build() { - build_js() + build_js(); + // copy files to server folder + dircpy::copy_dir(JS_DIST_SOURCE, JS_DIST_TMP)?; } - resource_dir(JS_DIST) + resource_dir(JS_DIST_TMP) .build() - .unwrap_or_else(|_| panic!("failed to open data browser assets from {}", JS_DIST)); + .unwrap_or_else(|e| panic!("failed to open data browser assets from {JS_DIST_TMP}. {e}")); Ok(()) } -/// Check if any JS files were modified since the last build fn should_build() -> bool { - if let Ok(index_html) = std::fs::metadata(format!("{}/index.html", JS_DIST)) { - let dist_time = index_html + if !std::path::Path::new(BROWSER_ROOT).exists() { + p!("Could not find browser folder, assuming this is a `cargo publish` run. Skipping JS build."); + return false; + } + // Check if any JS files were modified since the last build + if let Ok(tmp_dist_index_html) = std::fs::metadata(format!("{}/index.html", JS_DIST_TMP)) { + let dist_time = tmp_dist_index_html .modified() .unwrap() .duration_since(SystemTime::UNIX_EPOCH)