dbg_swc/es/minifier/
compare_opts.rs

1use std::{path::PathBuf, sync::Arc};
2
3use anyhow::{Context, Result};
4use clap::Args;
5use swc_common::SourceMap;
6use swc_ecma_minifier::option::{CompressOptions, MangleOptions};
7
8use crate::util::{
9    all_js_files,
10    minifier::{get_minified, get_minified_with_opts},
11    print_js,
12};
13
14/// [Experimental] Internal command to check the size difference caused by
15/// options.
16#[derive(Debug, Args)]
17pub struct CompareOptsCommand {
18    pub path: PathBuf,
19}
20
21impl CompareOptsCommand {
22    pub fn run(self, cm: Arc<SourceMap>) -> Result<()> {
23        let files = all_js_files(&self.path)?;
24
25        let mut default_sum = 0;
26        let mut new_sum = 0;
27
28        for file in files {
29            let default_record = get_minified(cm.clone(), &file, true, true)?;
30            let default_code = print_js(cm.clone(), &default_record.module, true)
31                .context("failed to convert ast to code")?;
32
33            eprintln!("default: {} bytes", default_code.len());
34            default_sum += default_code.len();
35
36            let new_record = get_minified_with_opts(
37                cm.clone(),
38                &file,
39                Some(CompressOptions {
40                    keep_classnames: true,
41                    keep_fnames: true,
42                    ..Default::default()
43                }),
44                Some(MangleOptions {
45                    keep_class_names: true,
46                    keep_fn_names: true,
47                    ..Default::default()
48                }),
49            )?;
50            let new_code = print_js(cm.clone(), &new_record.module, true)
51                .context("failed to convert ast to code")?;
52
53            eprintln!("new: {} bytes", new_code.len());
54            new_sum += new_code.len();
55        }
56
57        eprintln!("default (total): {default_sum} bytes");
58        eprintln!("new (total): {new_sum} bytes");
59
60        Ok(())
61    }
62}