1use serde::{Deserialize, Serialize};
4use swc_config::{config_types::BoolOrDataConfig, IsModule, SourceMapContent};
5
6use crate::option::{
7 terser::{TerserCompressorOptions, TerserEcmaVersion},
8 MangleOptions,
9};
10
11#[derive(Debug, Clone, Serialize, Deserialize, Default)]
13#[serde(deny_unknown_fields, rename_all = "camelCase")]
14pub struct JsMinifyOptions {
15 #[serde(default)]
16 pub parse: JsMinifyParseOptions,
17
18 #[serde(default)]
19 pub compress: BoolOrDataConfig<TerserCompressorOptions>,
20
21 #[serde(default)]
22 pub mangle: BoolOrDataConfig<MangleOptions>,
23
24 #[serde(default, alias = "output")]
25 pub format: JsMinifyFormatOptions,
26
27 #[serde(default)]
28 pub ecma: TerserEcmaVersion,
29
30 #[serde(default, alias = "keep_classnames")]
31 pub keep_classnames: bool,
32
33 #[serde(default, alias = "keep_fnames")]
34 pub keep_fnames: bool,
35
36 #[serde(default = "default_module")]
37 pub module: IsModule,
38
39 #[serde(default)]
40 pub safari10: bool,
41
42 #[serde(default)]
43 pub toplevel: Option<bool>,
44
45 #[serde(default)]
46 pub source_map: BoolOrDataConfig<TerserSourceMapOption>,
47
48 #[serde(default)]
49 pub output_path: Option<String>,
50
51 #[serde(default = "true_by_default")]
52 pub inline_sources_content: bool,
53
54 #[serde(default = "true_by_default")]
55 pub emit_source_map_columns: bool,
56}
57
58fn true_by_default() -> bool {
59 true
60}
61
62#[derive(Debug, Clone, Default, Serialize, Deserialize)]
66#[serde(deny_unknown_fields, rename_all = "camelCase")]
67pub struct TerserSourceMapOption {
68 #[serde(default)]
69 pub filename: Option<String>,
70
71 #[serde(default)]
72 pub url: Option<String>,
73
74 #[serde(default)]
75 pub root: Option<String>,
76
77 #[serde(default)]
78 pub content: Option<SourceMapContent>,
79}
80
81#[derive(Debug, Clone, Default, Serialize, Deserialize)]
85#[serde(deny_unknown_fields, rename_all = "camelCase")]
86pub struct JsMinifyParseOptions {
87 #[serde(default, alias = "bare_returns")]
89 pub bare_returns: bool,
90
91 #[serde(default = "true_by_default", alias = "html5_comments")]
93 pub html5_comments: bool,
94
95 #[serde(default = "true_by_default")]
97 pub shebang: bool,
98
99 #[serde(default)]
101 pub spidermonkey: bool,
102}
103
104#[derive(Debug, Clone, Serialize, Deserialize)]
106#[serde(deny_unknown_fields, rename_all = "camelCase")]
107pub struct JsMinifyFormatOptions {
108 #[serde(default, alias = "ascii_only")]
110 pub ascii_only: bool,
111
112 #[serde(default)]
114 pub beautify: bool,
115
116 #[serde(default)]
118 pub braces: bool,
119
120 #[serde(default = "default_comments")]
121 pub comments: BoolOrDataConfig<JsMinifyCommentOption>,
122
123 #[serde(default)]
125 pub ecma: usize,
126
127 #[serde(default, alias = "indent_level")]
129 pub indent_level: Option<usize>,
130
131 #[serde(default, alias = "indent_start")]
133 pub indent_start: bool,
134
135 #[serde(default = "true_by_default", alias = "inline_script")]
136 pub inline_script: bool,
137
138 #[serde(default, alias = "keep_numbers")]
140 pub keep_numbers: bool,
141
142 #[serde(default, alias = "keep_quoted_props")]
144 pub keep_quoted_props: bool,
145
146 #[serde(default, alias = "max_line_len")]
148 pub max_line_len: usize,
149
150 #[serde(default)]
152 pub preamble: String,
153
154 #[serde(default, alias = "quote_keys")]
156 pub quote_keys: bool,
157
158 #[serde(default, alias = "quote_style")]
160 pub quote_style: usize,
161
162 #[serde(default, alias = "preserve_annotations")]
164 pub preserve_annotations: bool,
165
166 #[serde(default)]
168 pub safari10: bool,
169
170 #[serde(default)]
172 pub semicolons: bool,
173
174 #[serde(default)]
176 pub shebang: bool,
177
178 #[serde(default)]
180 pub webkit: bool,
181
182 #[serde(default, alias = "warp_iife")]
184 pub wrap_iife: bool,
185
186 #[serde(default, alias = "wrap_func_args")]
188 pub wrap_func_args: bool,
189
190 #[serde(default)]
191 pub emit_assert_for_import_attributes: bool,
192}
193
194impl Default for JsMinifyFormatOptions {
195 fn default() -> Self {
196 serde_json::from_str("{}").unwrap()
198 }
199}
200
201fn default_comments() -> BoolOrDataConfig<JsMinifyCommentOption> {
202 BoolOrDataConfig::from_bool(false)
203}
204
205#[derive(Debug, Clone, Serialize, Deserialize, Default)]
206pub enum JsMinifyCommentOption {
207 #[serde(rename = "some")]
208 #[default]
209 PreserveSomeComments,
210 #[serde(rename = "all")]
211 PreserveAllComments,
212}
213
214fn default_module() -> IsModule {
215 IsModule::Bool(false)
216}