euv-cli 0.24.7

The official CLI tool for the euv UI framework, providing dev/release profiles with run/build modes, hot reload, and wasm-pack integration.
Documentation
use super::*;

fn write_snippet(dir: &Path, body: &str) {
    fs::create_dir_all(dir).unwrap();
    fs::write(dir.join("inline0.js"), body).unwrap();
}

#[tokio::test]
async fn minifies_uncompressed_snippet() {
    let tmp = tempfile::tempdir().unwrap();
    let pkg = tmp.path().join("pkg");
    let crate_dir = pkg.join("snippets").join("euv-core-abc123");
    let original = include_str!("minify_inline_js_snippet_input.txt");
    write_snippet(&crate_dir, original);
    euv_cli::minify_inline_js_snippets(&pkg).await.unwrap();
    let minified = fs::read_to_string(crate_dir.join("inline0.js")).unwrap();
    assert!(
        minified.len() < original.len() / 2,
        "minified({}) should be < 50% of original({})",
        minified.len(),
        original.len()
    );
    assert!(minified.contains("euv_event_collect_id_chain"));
    assert!(!minified.contains("//"));
    assert!(!minified.contains("\n    "));
}

#[tokio::test]
async fn skips_missing_snippets_dir() {
    let tmp = tempfile::tempdir().unwrap();
    let pkg = tmp.path().join("pkg");
    euv_cli::minify_inline_js_snippets(&pkg).await.unwrap();
}

#[tokio::test]
async fn leaves_non_inline_js_files_alone() {
    let tmp = tempfile::tempdir().unwrap();
    let pkg = tmp.path().join("pkg");
    let crate_dir = pkg.join("snippets").join("euv-core-abc123");
    fs::create_dir_all(&crate_dir).unwrap();
    let unrelated = "// not an inline snippet\nconst x = 1;\n";
    fs::write(crate_dir.join("helper.js"), unrelated).unwrap();
    euv_cli::minify_inline_js_snippets(&pkg).await.unwrap();
    let untouched = fs::read_to_string(crate_dir.join("helper.js")).unwrap();
    assert_eq!(untouched, unrelated);
}

const HTML_INPUT: &str = "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <!-- comment -->\n    <title>Euv</title>\n  </head>\n  <body>\n    <div id=\"app\">    </div>\n    <script>  const x = 1;   const y = 2;  </script>\n    <style>body  {   margin: 0;  }</style>\n  </body>\n</html>\n";
const HTML_EXPECTED: &str = "<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\" /><title>Euv</title></head><body><div id=\"app\"></div><script>  const x = 1;   const y = 2;  </script><style>body  {   margin: 0;  }</style></body></html>";

#[test]
fn minifies_html_template() {
    let minified = euv_cli::minify_html_template(HTML_INPUT);
    assert_eq!(minified, HTML_EXPECTED);
}

#[test]
fn html_minify_strips_comments_and_indentation() {
    let input = "<div>\n  <!-- keep nothing -->\n  <span>   hello   world   </span>\n</div>\n";
    let minified = euv_cli::minify_html_template(input);
    assert!(!minified.contains("<!--"), "got: {minified:?}");
    assert!(!minified.contains("  "), "got: {minified:?}");
    assert!(!minified.contains("\n"), "got: {minified:?}");
    assert!(minified.contains("hello world"), "got: {minified:?}");
}

#[test]
fn html_minify_preserves_script_and_style_contents() {
    let input = "<script>  if (a)  {  return  b  ;  }  </script>\n";
    let minified = euv_cli::minify_html_template(input);
    assert!(minified.contains("  if (a)  {  return  b  ;  }  "));
}

#[test]
fn html_minify_shrinks_realistic_template() {
    let input = "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <title>Euv</title>\n  </head>\n  <body>\n    <div id=\"app\"></div>\n    <script type=\"module\">init();</script>\n  </body>\n</html>\n";
    let minified = euv_cli::minify_html_template(input);
    assert!(minified.len() < input.len());
    assert!(!minified.contains("\n"));
    assert!(!minified.contains("  "));
    assert!(minified.contains("__NOTHING__") || minified.contains("init"));
}