Skip to content

Commit eff0cac

Browse files
authored
feat(es/minifier): Support mangle.eval (#7777)
**Related issue:** - Closes #7754
1 parent 0edc420 commit eff0cac

File tree

11 files changed

+33
-6
lines changed

11 files changed

+33
-6
lines changed

crates/swc_ecma_minifier/benches/full.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ fn run(src: &str) {
8484
keep_private_props: false,
8585
ie8: false,
8686
safari10: false,
87-
reserved: Default::default(),
87+
..Default::default()
8888
}),
8989
wrap: false,
9090
enclose: false,

crates/swc_ecma_minifier/src/option/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ pub struct MangleOptions {
8181

8282
#[serde(default, alias = "reserved")]
8383
pub reserved: Vec<JsWord>,
84+
85+
/// mangle names visible in scopes where eval or with are used
86+
#[serde(default)]
87+
pub eval: bool,
8488
}
8589

8690
#[derive(Debug, Clone, Default, Serialize, Deserialize, Merge)]

crates/swc_ecma_minifier/src/pass/mangle_names/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ pub(crate) fn name_mangler(
2828
swc_ecma_transforms_base::hygiene::Config {
2929
keep_class_names: options.keep_class_names,
3030
safari_10: options.safari10,
31-
top_level_mark
31+
top_level_mark,
32+
ignore_eval: options.eval,
3233
},
3334
ManglingRenamer { chars, preserved }
3435
)
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
const foo = 1;
2+
console.log(foo);
3+
4+
eval(`console.log(foo)`)
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"toplevel": true,
3+
"eval": true
4+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
const o = 1;
2+
console.log(o), eval("console.log(foo)");
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
const foo = 1;
2+
console.log(foo);
3+
4+
eval(`console.log(foo)`)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"toplevel": true
3+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
const foo = 1;
2+
console.log(foo), eval("console.log(foo)");

crates/swc_ecma_transforms_base/src/hygiene/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ pub struct Config {
1919
/// The marks derived from this marks will treated as `specified by user`
2020
/// and other marks will be treated as `generated by swc`.
2121
pub top_level_mark: Mark,
22+
23+
/// Mangle even if vars are visible to `eval` or `with`.
24+
pub ignore_eval: bool,
2225
}
2326

2427
/// See [hygiene_with_config] for doc. Creates a `hygiene` pass with default

crates/swc_ecma_transforms_base/src/rename/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ macro_rules! unit {
187187
($name:ident, $T:ty) => {
188188
/// Only called if `eval` exists
189189
fn $name(&mut self, n: &mut $T) {
190-
if contains_eval(n, true) {
190+
if !self.config.ignore_eval && contains_eval(n, true) {
191191
n.visit_mut_children_with(self);
192192
} else {
193193
let map = self.get_map(n, false, false, false);
@@ -199,7 +199,7 @@ macro_rules! unit {
199199
($name:ident, $T:ty, true) => {
200200
/// Only called if `eval` exists
201201
fn $name(&mut self, n: &mut $T) {
202-
if contains_eval(n, true) {
202+
if !self.config.ignore_eval && contains_eval(n, true) {
203203
n.visit_mut_children_with(self);
204204
} else {
205205
let map = self.get_map(n, true, false, false);
@@ -239,7 +239,7 @@ where
239239
fn visit_mut_module(&mut self, m: &mut Module) {
240240
self.preserved = self.renamer.preserved_ids_for_module(m);
241241

242-
let has_eval = contains_eval(m, true);
242+
let has_eval = !self.config.ignore_eval && contains_eval(m, true);
243243

244244
self.unresolved = self.get_unresolved(m, has_eval);
245245

@@ -276,7 +276,7 @@ where
276276
fn visit_mut_script(&mut self, m: &mut Script) {
277277
self.preserved = self.renamer.preserved_ids_for_script(m);
278278

279-
let has_eval = contains_eval(m, true);
279+
let has_eval = !self.config.ignore_eval && contains_eval(m, true);
280280

281281
self.unresolved = self.get_unresolved(m, has_eval);
282282

0 commit comments

Comments
 (0)