diff --git a/Cargo.lock b/Cargo.lock index 9f19fd7f..69bd4e7e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -214,6 +214,7 @@ dependencies = [ "lazy_static", "log", "lz-str", + "minify-js", "ndhistogram", "regex", "serde", @@ -462,6 +463,17 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +[[package]] +name = "minify-js" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e057de7e5b920675f6c9de1a7d1b6862685f4e57953ee083ce01233e4b5cac" +dependencies = [ + "aho-corasick", + "lazy_static", + "memchr", +] + [[package]] name = "ndhistogram" version = "0.8.0" diff --git a/Cargo.toml b/Cargo.toml index f2b5fa39..a0d0dbcb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,7 @@ lazy_static = "1.4.0" regex = "1.6.0" log = "0.4.17" simplelog = "0.12.0" +minify-js = "0.2.4" [dev-dependencies] dir-assert = "0.2.0" \ No newline at end of file diff --git a/src/render/portable/mod.rs b/src/render/portable/mod.rs index aa4419e4..9baa08b4 100644 --- a/src/render/portable/mod.rs +++ b/src/render/portable/mod.rs @@ -3,6 +3,7 @@ pub(crate) mod utils; use crate::render::portable::plot::get_min_max; use crate::render::portable::plot::render_plots; +use crate::render::portable::utils::minify_js; use crate::render::Renderer; use crate::spec::{ CustomPlot, DatasetSpecs, HeaderSpecs, Heatmap, ItemSpecs, ItemsSpec, LinkSpec, @@ -533,8 +534,9 @@ fn render_table_javascript>( let js = templates.render("table.js.tera", &context)?; - let mut file = fs::File::create(file_path)?; - file.write_all(js.as_bytes())?; + let mut file = File::create(file_path)?; + let minified = minify_js(&js)?; + file.write_all(&minified)?; Ok(()) } diff --git a/src/render/portable/plot.rs b/src/render/portable/plot.rs index 6c4afb8e..d5f513e9 100644 --- a/src/render/portable/plot.rs +++ b/src/render/portable/plot.rs @@ -1,3 +1,4 @@ +use crate::render::portable::utils::minify_js; use crate::utils::column_type::{classify_table, ColumnType}; use anyhow::{Context as AnyhowContext, Result}; use csv::Reader; @@ -58,7 +59,8 @@ pub(crate) fn render_plots>( let js = templates.render("plot.js.tera", &context)?; let file_path = path.join(Path::new(&format!("plot_{}", index)).with_extension("js")); let mut file = fs::File::create(file_path)?; - file.write_all(js.as_bytes())?; + let minified = minify_js(&js)?; + file.write_all(&minified)?; } Ok(()) } diff --git a/src/render/portable/utils.rs b/src/render/portable/utils.rs index 2fee0eaf..be41a1d9 100644 --- a/src/render/portable/utils.rs +++ b/src/render/portable/utils.rs @@ -1,5 +1,6 @@ use crate::spec::ItemsSpec; use anyhow::Result; +use minify_js::{minify, TopLevelMode}; use std::fs; use std::fs::File; use std::io::Write; @@ -78,6 +79,17 @@ pub(crate) fn render_static_files>(path: P) -> Result<()> { Ok(()) } +pub(crate) fn minify_js(file: &str) -> Result> { + let mut minified: Vec = Vec::new(); + minify( + TopLevelMode::Global, + file.as_bytes().to_vec(), + &mut minified, + ) + .expect("Failed minifying js"); + Ok(minified) +} + pub(crate) fn render_index_file>(path: P, specs: &ItemsSpec) -> Result<()> { let table = if let Some(default_view) = &specs.default_view { default_view