1use serde::{Deserialize, Serialize};
4use swc_config::{
5 file_pattern::FilePattern, is_module::IsModule, regex_js::CachedJsRegex,
6 source_map::SourceMapContent, types::BoolOrDataConfig,
7};
8
9use crate::option::{
10 terser::{TerserCompressorOptions, TerserEcmaVersion},
11 MangleOptions,
12};
13
14#[derive(Debug, Clone, Serialize, Deserialize, Default)]
16#[serde(deny_unknown_fields, rename_all = "camelCase")]
17pub struct JsMinifyOptions {
18 #[serde(default)]
19 pub parse: JsMinifyParseOptions,
20
21 #[serde(default)]
22 pub compress: BoolOrDataConfig<TerserCompressorOptions>,
23
24 #[serde(default)]
25 pub mangle: BoolOrDataConfig<MangleOptions>,
26
27 #[serde(default, alias = "output")]
28 pub format: JsMinifyFormatOptions,
29
30 #[serde(default)]
31 pub ecma: TerserEcmaVersion,
32
33 #[serde(default, alias = "keep_classnames")]
34 pub keep_classnames: bool,
35
36 #[serde(default, alias = "keep_fnames")]
37 pub keep_fnames: bool,
38
39 #[serde(default = "default_module")]
40 pub module: IsModule,
41
42 #[serde(default)]
43 pub safari10: bool,
44
45 #[serde(default)]
46 pub toplevel: Option<bool>,
47
48 #[serde(default)]
49 pub source_map: BoolOrDataConfig<TerserSourceMapOption>,
50
51 #[serde(default)]
52 pub source_map_ignore_list: Option<FilePattern>,
53
54 #[serde(default)]
55 pub output_path: Option<String>,
56
57 #[serde(default = "true_by_default")]
58 pub inline_sources_content: bool,
59
60 #[serde(default = "true_by_default")]
61 pub emit_source_map_columns: bool,
62}
63
64fn true_by_default() -> bool {
65 true
66}
67
68#[derive(Debug, Clone, Default, Serialize, Deserialize)]
72#[serde(deny_unknown_fields, rename_all = "camelCase")]
73pub struct TerserSourceMapOption {
74 #[serde(default)]
75 pub filename: Option<String>,
76
77 #[serde(default)]
78 pub url: Option<String>,
79
80 #[serde(default)]
81 pub root: Option<String>,
82
83 #[serde(default)]
84 pub content: Option<SourceMapContent>,
85}
86
87#[derive(Debug, Clone, Default, Serialize, Deserialize)]
91#[serde(deny_unknown_fields, rename_all = "camelCase")]
92pub struct JsMinifyParseOptions {
93 #[serde(default, alias = "bare_returns")]
95 pub bare_returns: bool,
96
97 #[serde(default = "true_by_default", alias = "html5_comments")]
99 pub html5_comments: bool,
100
101 #[serde(default = "true_by_default")]
103 pub shebang: bool,
104
105 #[serde(default)]
107 pub spidermonkey: bool,
108}
109
110#[derive(Debug, Clone, Serialize, Deserialize)]
112#[serde(deny_unknown_fields, rename_all = "camelCase")]
113pub struct JsMinifyFormatOptions {
114 #[serde(default, alias = "ascii_only")]
116 pub ascii_only: bool,
117
118 #[serde(default)]
120 pub beautify: bool,
121
122 #[serde(default)]
124 pub braces: bool,
125
126 #[serde(default = "default_comments")]
127 pub comments: BoolOrDataConfig<JsMinifyCommentOption>,
128
129 #[serde(default)]
131 pub ecma: usize,
132
133 #[serde(default, alias = "indent_level")]
135 pub indent_level: Option<usize>,
136
137 #[serde(default, alias = "indent_start")]
139 pub indent_start: bool,
140
141 #[serde(default = "true_by_default", alias = "inline_script")]
142 pub inline_script: bool,
143
144 #[serde(default, alias = "keep_numbers")]
146 pub keep_numbers: bool,
147
148 #[serde(default, alias = "keep_quoted_props")]
150 pub keep_quoted_props: bool,
151
152 #[serde(default, alias = "max_line_len")]
154 pub max_line_len: usize,
155
156 #[serde(default)]
158 pub preamble: String,
159
160 #[serde(default, alias = "quote_keys")]
162 pub quote_keys: bool,
163
164 #[serde(default, alias = "quote_style")]
166 pub quote_style: usize,
167
168 #[serde(default, alias = "preserve_annotations")]
170 pub preserve_annotations: bool,
171
172 #[serde(default)]
174 pub safari10: bool,
175
176 #[serde(default)]
178 pub semicolons: bool,
179
180 #[serde(default)]
182 pub shebang: bool,
183
184 #[serde(default)]
186 pub webkit: bool,
187
188 #[serde(default, alias = "wrap_iife")]
190 pub wrap_iife: bool,
191
192 #[serde(default, alias = "wrap_func_args")]
194 pub wrap_func_args: bool,
195
196 #[serde(default)]
197 pub emit_assert_for_import_attributes: bool,
198}
199
200impl Default for JsMinifyFormatOptions {
201 fn default() -> Self {
202 serde_json::from_str("{}").unwrap()
204 }
205}
206
207fn default_comments() -> BoolOrDataConfig<JsMinifyCommentOption> {
208 BoolOrDataConfig::from_bool(false)
209}
210
211#[derive(Debug, Clone, Serialize, Deserialize, Default)]
212pub enum JsMinifyCommentOption {
213 #[serde(rename = "some")]
214 #[default]
215 PreserveSomeComments,
216 #[serde(rename = "all")]
217 PreserveAllComments,
218 #[serde(untagged)]
219 PreserveRegexComments { regex: CachedJsRegex },
220}
221
222fn default_module() -> IsModule {
223 IsModule::Bool(false)
224}