use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
pub enum Target {
ES5,
ES2015,
ES2016,
ES2017,
ES2018,
ES2019,
#[default]
ES2020,
ES2021,
ES2022,
ES2023,
ES2024,
ESNext,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[allow(clippy::struct_excessive_bools)]
pub struct MinifyOptions {
pub target: Target,
pub mangle: bool,
pub mangle_props: bool,
pub reserved: Vec<String>,
pub compress: bool,
pub compress_options: CompressOptions,
pub source_map: bool,
pub sources_content: bool,
pub keep_classnames: bool,
pub keep_fnames: bool,
pub toplevel: bool,
pub parallel: bool,
}
impl Default for MinifyOptions {
fn default() -> Self {
Self {
target: Target::default(),
mangle: true,
mangle_props: false,
reserved: Vec::new(),
compress: true,
compress_options: CompressOptions::default(),
source_map: false,
sources_content: true,
keep_classnames: false,
keep_fnames: false,
toplevel: false,
parallel: true,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[allow(clippy::struct_excessive_bools)]
pub struct CompressOptions {
pub dead_code: bool,
pub evaluate: bool,
pub join_vars: bool,
pub loops: bool,
pub unused: bool,
pub collapse_vars: bool,
pub conditionals: bool,
pub comparisons: bool,
pub booleans: bool,
pub drop_console: bool,
pub drop_debugger: bool,
pub hoist_funs: bool,
pub hoist_vars: bool,
pub passes: usize,
pub unsafe_opt: bool,
pub unsafe_arrows: bool,
pub unsafe_math: bool,
pub unsafe_methods: bool,
pub unsafe_proto: bool,
pub unsafe_regexp: bool,
pub inline: InlineLevel,
}
impl Default for CompressOptions {
fn default() -> Self {
Self {
dead_code: true,
evaluate: true,
join_vars: true,
loops: true,
unused: true,
collapse_vars: false, conditionals: true,
comparisons: true,
booleans: true,
drop_console: false,
drop_debugger: true,
hoist_funs: false,
hoist_vars: false,
passes: 1,
unsafe_opt: false,
unsafe_arrows: false,
unsafe_math: false,
unsafe_methods: false,
unsafe_proto: false,
unsafe_regexp: false,
inline: InlineLevel::None, }
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum InlineLevel {
None,
Simple,
Aggressive,
}
impl MinifyOptions {
#[must_use]
pub fn production() -> Self {
Self {
mangle: true,
compress: true,
compress_options: CompressOptions {
passes: 2,
..Default::default()
},
..Default::default()
}
}
#[must_use]
pub fn development() -> Self {
Self {
mangle: false,
compress: false,
source_map: true,
..Default::default()
}
}
#[must_use]
pub fn aggressive() -> Self {
Self {
mangle: true,
compress: true,
compress_options: CompressOptions {
passes: 3,
inline: InlineLevel::Aggressive,
collapse_vars: true,
unused: true,
dead_code: true,
..Default::default()
},
toplevel: true,
..Default::default()
}
}
}