dbg_swc/es/minifier/
compare.rs

1use 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/// [Experimental] Opens vscode for diffing output of swc minifier and
14/// terser/esbuild
15#[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}