dbg_swc/es/minifier/
compare.rs1use std::{path::PathBuf, process::Command, sync::Arc};
2
3use anyhow::{Context, Result};
4use clap::Args;
5use swc_common::SourceMap;
6
7use crate::util::{
8 make_pretty,
9 minifier::{get_minified, get_terser_output},
10 print_js,
11};
12
13#[derive(Debug, Args)]
16pub struct CompareCommand {
17 pub path: PathBuf,
18}
19
20impl CompareCommand {
21 pub fn run(self, cm: Arc<SourceMap>) -> Result<()> {
22 let record = get_minified(cm.clone(), &self.path, true, false)?;
23 let code = print_js(cm, &record.module, true).context("failed to convert ast to code")?;
24
25 let terser_mangled = get_terser_output(&self.path, true, false)?;
26
27 eprintln!("swc: {} bytes", code.len());
28 eprintln!(
29 "swc: {} bytes (newline stripped)",
30 code.replace("\\n", "_").len()
31 );
32 std::fs::write("swc.output.js", code.as_bytes())
33 .context("failed to write swc.output.js")?;
34
35 make_pretty("swc.output.js".as_ref())?;
36
37 std::fs::write("terser.output.js", terser_mangled.as_bytes())
38 .context("failed to write terser.output.js")?;
39
40 eprintln!("terser: {} bytes", terser_mangled.len());
41 make_pretty("terser.output.js".as_ref())?;
42
43 {
44 let mut c = Command::new("code");
45 c.arg("--diff");
46 c.arg("swc.output.js");
47 c.arg("terser.output.js");
48 c.output().context("failed to run vscode")?;
49 }
50
51 Ok(())
52 }
53}