use std::path::Path;
use std::process::Command;
fn main() {
println!("cargo:rerun-if-changed=ui/src");
println!("cargo:rerun-if-changed=ui/index.html");
println!("cargo:rerun-if-changed=ui/package.json");
println!("cargo:rerun-if-changed=ui/package-lock.json");
println!("cargo:rerun-if-changed=ui/vite.config.ts");
println!("cargo:rerun-if-changed=ui/tsconfig.json");
println!("cargo:rerun-if-changed=ui/scripts/copy-to-rust.mjs");
println!("cargo:rerun-if-changed=src/ui/index.html");
let target = Path::new("src/ui/index.html");
if !Path::new("ui/package.json").exists() {
assert!(
target.exists(),
"src/ui/index.html is missing and ui/ is not present. \
This crate's tarball must include the built UI."
);
return;
}
if !Path::new("ui/node_modules").exists() {
warn("installing ui/ dependencies (npm ci)...");
npm(&["--prefix", "ui", "ci"]);
}
warn("building ui/ via vite...");
npm(&["--prefix", "ui", "run", "build"]);
}
fn warn(msg: &str) {
println!("cargo:warning={msg}");
}
fn npm(args: &[&str]) {
let cmd = if cfg!(windows) { "npm.cmd" } else { "npm" };
let status = Command::new(cmd).args(args).status().unwrap_or_else(|e| {
panic!("failed to spawn `{cmd}`: {e}. Install Node.js to build the UI.")
});
assert!(status.success(), "`{cmd} {}` failed", args.join(" "));
}