use crate::cfg::Cfg;
use minify_html_common::whitespace::trimmed;
use oxc_allocator::Allocator;
use oxc_codegen::Codegen;
use oxc_codegen::CodegenOptions;
use oxc_minifier::CompressOptions;
use oxc_minifier::MangleOptions;
use oxc_minifier::Minifier;
use oxc_minifier::MinifierOptions;
use oxc_parser::Parser;
use oxc_span::SourceType;
#[derive(Debug, Clone, Copy)]
pub enum TopLevelMode {
Global,
Module,
}
pub fn minify_js(cfg: &Cfg, mode: TopLevelMode, out: &mut Vec<u8>, code: &[u8]) {
if cfg.minify_js {
if let Ok(source_text) = std::str::from_utf8(code) {
let allocator = Allocator::default();
let source_type = match mode {
TopLevelMode::Module => SourceType::mjs(),
TopLevelMode::Global => SourceType::default(),
};
let parser_ret = Parser::new(&allocator, source_text, source_type).parse();
if parser_ret.errors.is_empty() {
let mut program = parser_ret.program;
let _minifier_ret = Minifier::new(MinifierOptions {
mangle: Some(MangleOptions::default()),
compress: Some(CompressOptions::safest()),
}).minify(&allocator, &mut program);
let codegen_options = CodegenOptions {
minify: true,
..CodegenOptions::default()
};
let minified = Codegen::new()
.with_options(codegen_options)
.build(&program)
.code;
if minified.len() < code.len() {
out.extend_from_slice(minified.as_bytes());
return;
}
}
}
}
out.extend_from_slice(trimmed(code));
}