swc_ecma_minifier/
js.rs

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