swc_ecma_minifier/
js.rs

1//! NOT A PUBLIC API
2
3use 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/// Second argument of `minify`.
15#[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/// `sourceMap` of `minify()`.`
69///
70/// `jsc.minify.sourceMap`
71#[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/// Parser options for `minify()`, which should have the same API as terser.
88///
89/// `jsc.minify.parse` is ignored.
90#[derive(Debug, Clone, Default, Serialize, Deserialize)]
91#[serde(deny_unknown_fields, rename_all = "camelCase")]
92pub struct JsMinifyParseOptions {
93    /// Not supported.
94    #[serde(default, alias = "bare_returns")]
95    pub bare_returns: bool,
96
97    /// Ignored, and always parsed.
98    #[serde(default = "true_by_default", alias = "html5_comments")]
99    pub html5_comments: bool,
100
101    /// Ignored, and always parsed.
102    #[serde(default = "true_by_default")]
103    pub shebang: bool,
104
105    /// Not supported.
106    #[serde(default)]
107    pub spidermonkey: bool,
108}
109
110/// `jsc.minify.format`.
111#[derive(Debug, Clone, Serialize, Deserialize)]
112#[serde(deny_unknown_fields, rename_all = "camelCase")]
113pub struct JsMinifyFormatOptions {
114    /// Not implemented yet.
115    #[serde(default, alias = "ascii_only")]
116    pub ascii_only: bool,
117
118    /// Not implemented yet.
119    #[serde(default)]
120    pub beautify: bool,
121
122    /// Not implemented yet.
123    #[serde(default)]
124    pub braces: bool,
125
126    #[serde(default = "default_comments")]
127    pub comments: BoolOrDataConfig<JsMinifyCommentOption>,
128
129    /// Not implemented yet.
130    #[serde(default)]
131    pub ecma: usize,
132
133    /// Not implemented yet.
134    #[serde(default, alias = "indent_level")]
135    pub indent_level: Option<usize>,
136
137    /// Not implemented yet.
138    #[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    /// Not implemented yet.
145    #[serde(default, alias = "keep_numbers")]
146    pub keep_numbers: bool,
147
148    /// Not implemented yet.
149    #[serde(default, alias = "keep_quoted_props")]
150    pub keep_quoted_props: bool,
151
152    /// Not implemented yet.
153    #[serde(default, alias = "max_line_len")]
154    pub max_line_len: usize,
155
156    /// Not implemented yet.
157    #[serde(default)]
158    pub preamble: String,
159
160    /// Not implemented yet.
161    #[serde(default, alias = "quote_keys")]
162    pub quote_keys: bool,
163
164    /// Not implemented yet.
165    #[serde(default, alias = "quote_style")]
166    pub quote_style: usize,
167
168    /// Not implemented yet.
169    #[serde(default, alias = "preserve_annotations")]
170    pub preserve_annotations: bool,
171
172    /// Not implemented yet.
173    #[serde(default)]
174    pub safari10: bool,
175
176    /// Not implemented yet.
177    #[serde(default)]
178    pub semicolons: bool,
179
180    /// Not implemented yet.
181    #[serde(default)]
182    pub shebang: bool,
183
184    /// Not implemented yet.
185    #[serde(default)]
186    pub webkit: bool,
187
188    /// Not implemented yet.
189    #[serde(default, alias = "wrap_iife")]
190    pub wrap_iife: bool,
191
192    /// Not implemented yet.
193    #[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        // Well, this should be a macro IMHO, but it's not so let's just use hacky way.
203        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}