Skip to content

Commit

Permalink
feat(es/module): Preserve custom use directives (#7528)
Browse files Browse the repository at this point in the history
**Related issue:**

 - Closes #7315.
  • Loading branch information
kdy1 committed Jun 16, 2023
1 parent 37c7296 commit 3e9dd88
Show file tree
Hide file tree
Showing 12 changed files with 113 additions and 12 deletions.
5 changes: 5 additions & 0 deletions crates/swc/tests/fixture/issues-7xxx/7315/1/input/.swcrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"module": {
"type": "commonjs"
}
}
6 changes: 6 additions & 0 deletions crates/swc/tests/fixture/issues-7xxx/7315/1/input/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// input.ts
"use client"

export function ReactClientComponent() {
return "Hello world"
}
14 changes: 14 additions & 0 deletions crates/swc/tests/fixture/issues-7xxx/7315/1/output/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// input.ts
"use client";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "ReactClientComponent", {
enumerable: true,
get: function() {
return ReactClientComponent;
}
});
function ReactClientComponent() {
return "Hello world";
}
6 changes: 3 additions & 3 deletions crates/swc_ecma_transforms_module/src/amd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ use crate::{
module_ref_rewriter::{ImportMap, ModuleRefRewriter},
path::{ImportResolver, Resolver},
util::{
clone_first_use_strict, define_es_module, emit_export_stmts, local_name_for_src,
clone_first_use_directive, define_es_module, emit_export_stmts, local_name_for_src,
use_strict, ImportInterop,
},
};
Expand Down Expand Up @@ -145,7 +145,7 @@ where

// "use strict";
if self.config.strict_mode {
stmts.push(clone_first_use_strict(n).unwrap_or_else(use_strict));
stmts.push(clone_first_use_directive(n).unwrap_or_else(use_strict));
}

let ModuleDeclStrip {
Expand All @@ -170,7 +170,7 @@ where
);

stmts.extend(n.take().into_iter().filter_map(|item| match item {
ModuleItem::Stmt(stmt) if !stmt.is_use_strict() => Some(stmt),
ModuleItem::Stmt(stmt) if !stmt.is_directive() => Some(stmt),
_ => None,
}));

Expand Down
12 changes: 8 additions & 4 deletions crates/swc_ecma_transforms_module/src/common_js.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ use crate::{
module_ref_rewriter::{ImportMap, ModuleRefRewriter},
path::{ImportResolver, Resolver},
util::{
clone_first_use_strict, define_es_module, emit_export_stmts, local_name_for_src, prop_name,
use_strict, ImportInterop, ObjPropKeyIdent,
clone_first_use_directive, define_es_module, emit_export_stmts, local_name_for_src,
prop_name, use_strict, ImportInterop, ObjPropKeyIdent,
},
};

Expand Down Expand Up @@ -115,7 +115,11 @@ where

// "use strict";
if self.config.strict_mode {
stmts.push(clone_first_use_strict(n).unwrap_or_else(use_strict).into());
stmts.push(
clone_first_use_directive(n)
.unwrap_or_else(use_strict)
.into(),
);
}

let ModuleDeclStrip {
Expand Down Expand Up @@ -150,7 +154,7 @@ where
);

stmts.extend(n.take().into_iter().filter(|item| match item {
ModuleItem::Stmt(stmt) => !stmt.is_use_strict(),
ModuleItem::Stmt(stmt) => !stmt.is_directive(),
_ => false,
}));

Expand Down
6 changes: 3 additions & 3 deletions crates/swc_ecma_transforms_module/src/umd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ use crate::{
module_ref_rewriter::{ImportMap, ModuleRefRewriter},
path::{ImportResolver, Resolver},
util::{
clone_first_use_strict, define_es_module, emit_export_stmts, local_name_for_src,
clone_first_use_directive, define_es_module, emit_export_stmts, local_name_for_src,
use_strict, ImportInterop,
},
};
Expand Down Expand Up @@ -122,7 +122,7 @@ where

// "use strict";
if self.config.config.strict_mode {
stmts.push(clone_first_use_strict(module_items).unwrap_or_else(use_strict));
stmts.push(clone_first_use_directive(module_items).unwrap_or_else(use_strict));
}

let ModuleDeclStrip {
Expand All @@ -147,7 +147,7 @@ where
);

stmts.extend(module_items.take().into_iter().filter_map(|i| match i {
ModuleItem::Stmt(stmt) if !stmt.is_use_strict() => Some(stmt),
ModuleItem::Stmt(stmt) if !stmt.is_directive() => Some(stmt),
_ => None,
}));

Expand Down
4 changes: 2 additions & 2 deletions crates/swc_ecma_transforms_module/src/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -190,14 +190,14 @@ pub(super) fn define_es_module(exports: Ident) -> Stmt {
.into_stmt()
}

pub(super) fn clone_first_use_strict(stmts: &[ModuleItem]) -> Option<Stmt> {
pub(super) fn clone_first_use_directive(stmts: &[ModuleItem]) -> Option<Stmt> {
if stmts.is_empty() {
return None;
}

stmts.iter().find_map(|item| match item {
ModuleItem::Stmt(stmt @ Stmt::Expr(ExprStmt { expr, .. })) => match **expr {
Expr::Lit(Lit::Str(Str { ref value, .. })) if value == "use strict" => {
Expr::Lit(Lit::Str(Str { ref value, .. })) if value.starts_with("use ") => {
Some(stmt.clone())
}
_ => None,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// input.ts
"use client"

export function ReactClientComponent() {
return "Hello world"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// input.ts
define([
"require",
"exports"
], function(require, exports) {
"use client";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "ReactClientComponent", {
enumerable: true,
get: function() {
return ReactClientComponent;
}
});
function ReactClientComponent() {
return "Hello world";
}
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// input.ts
"use client";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "ReactClientComponent", {
enumerable: true,
get: function() {
return ReactClientComponent;
}
});
function ReactClientComponent() {
return "Hello world";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// input.ts
(function(global, factory) {
if (typeof module === "object" && typeof module.exports === "object") factory(exports);
else if (typeof define === "function" && define.amd) define([
"exports"
], factory);
else if (global = typeof globalThis !== "undefined" ? globalThis : global || self) factory(global.input = {});
})(this, function(exports) {
"use client";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "ReactClientComponent", {
enumerable: true,
get: function() {
return ReactClientComponent;
}
});
function ReactClientComponent() {
return "Hello world";
}
});
11 changes: 11 additions & 0 deletions crates/swc_ecma_utils/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2267,6 +2267,17 @@ pub fn prepend_stmts<T: StmtLike>(

pub trait IsDirective {
fn as_ref(&self) -> Option<&Stmt>;
fn is_directive(&self) -> bool {
match self.as_ref() {
Some(Stmt::Expr(expr)) => match &*expr.expr {
Expr::Lit(Lit::Str(Str {
raw: Some(value), ..
})) => value.starts_with("\"use ") || value.starts_with("'use "),
_ => false,
},
_ => false,
}
}
fn is_use_strict(&self) -> bool {
match self.as_ref() {
Some(Stmt::Expr(expr)) => match *expr.expr {
Expand Down

1 comment on commit 3e9dd88

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 3e9dd88 Previous: 4644d00 Ratio
es/full/bugs-1 354741 ns/iter (± 8408) 304153 ns/iter (± 5492) 1.17
es/full/minify/libraries/antd 1883111306 ns/iter (± 42725918) 1483866841 ns/iter (± 18861783) 1.27
es/full/minify/libraries/d3 380538712 ns/iter (± 9628116) 322636044 ns/iter (± 3794972) 1.18
es/full/minify/libraries/echarts 1493162388 ns/iter (± 27390300) 1198622962 ns/iter (± 14568743) 1.25
es/full/minify/libraries/jquery 112425787 ns/iter (± 1808490) 95340550 ns/iter (± 253333) 1.18
es/full/minify/libraries/lodash 136060382 ns/iter (± 1985616) 113368652 ns/iter (± 684447) 1.20
es/full/minify/libraries/moment 65301177 ns/iter (± 1092931) 56008518 ns/iter (± 167457) 1.17
es/full/minify/libraries/react 23324390 ns/iter (± 359987) 20048551 ns/iter (± 289696) 1.16
es/full/minify/libraries/terser 309599536 ns/iter (± 6645035) 253682300 ns/iter (± 3082147) 1.22
es/full/minify/libraries/three 551678303 ns/iter (± 17426404) 451636968 ns/iter (± 4999127) 1.22
es/full/minify/libraries/typescript 3549833712 ns/iter (± 32263514) 3060965657 ns/iter (± 30418870) 1.16
es/full/minify/libraries/victory 819343557 ns/iter (± 27873892) 668433489 ns/iter (± 15808709) 1.23
es/full/minify/libraries/vue 165111390 ns/iter (± 5442482) 139537256 ns/iter (± 1150223) 1.18
es/full/codegen/es3 40468 ns/iter (± 116) 37524 ns/iter (± 81) 1.08
es/full/codegen/es5 40588 ns/iter (± 71) 37370 ns/iter (± 97) 1.09
es/full/codegen/es2015 40518 ns/iter (± 59) 37641 ns/iter (± 102) 1.08
es/full/codegen/es2016 40503 ns/iter (± 65) 37693 ns/iter (± 77) 1.07
es/full/codegen/es2017 40498 ns/iter (± 52) 37668 ns/iter (± 86) 1.08
es/full/codegen/es2018 40521 ns/iter (± 30) 37534 ns/iter (± 155) 1.08
es/full/codegen/es2019 40525 ns/iter (± 69) 37528 ns/iter (± 70) 1.08
es/full/codegen/es2020 40509 ns/iter (± 85) 37631 ns/iter (± 100) 1.08
es/full/all/es3 211493430 ns/iter (± 3306548) 186101369 ns/iter (± 1140863) 1.14
es/full/all/es5 200380439 ns/iter (± 3324200) 176629216 ns/iter (± 918711) 1.13
es/full/all/es2015 154387074 ns/iter (± 2394086) 131638514 ns/iter (± 854114) 1.17
es/full/all/es2016 157328397 ns/iter (± 2049725) 130670730 ns/iter (± 660325) 1.20
es/full/all/es2017 154446124 ns/iter (± 1878568) 129222869 ns/iter (± 760088) 1.20
es/full/all/es2018 150440971 ns/iter (± 2625157) 127492029 ns/iter (± 1094307) 1.18
es/full/all/es2019 151850156 ns/iter (± 2211187) 126626378 ns/iter (± 878091) 1.20
es/full/all/es2020 145828683 ns/iter (± 1563779) 120929211 ns/iter (± 714934) 1.21
es/full/parser 596106 ns/iter (± 11110) 534422 ns/iter (± 8838) 1.12
es/full/base/fixer 26188 ns/iter (± 33) 18489 ns/iter (± 159) 1.42
es/full/base/resolver_and_hygiene 105063 ns/iter (± 107) 95376 ns/iter (± 236) 1.10
serialization of serde 284 ns/iter (± 0) 330 ns/iter (± 3) 0.86
css/minify/libraries/bootstrap 36111913 ns/iter (± 263788) 31533365 ns/iter (± 136321) 1.15
css/visitor/compare/clone 2368737 ns/iter (± 19830) 1908555 ns/iter (± 3662) 1.24
css/visitor/compare/visit_mut_span 2566869 ns/iter (± 26020) 2039449 ns/iter (± 4434) 1.26
css/visitor/compare/visit_mut_span_panic 2610746 ns/iter (± 3570) 2099463 ns/iter (± 7405) 1.24
css/visitor/compare/fold_span 3352037 ns/iter (± 38244) 2810600 ns/iter (± 10350) 1.19
css/visitor/compare/fold_span_panic 3516285 ns/iter (± 31002) 2991807 ns/iter (± 6880) 1.18
css/lexer/bootstrap_5_1_3 5596537 ns/iter (± 3739) 4787743 ns/iter (± 6245) 1.17
css/lexer/foundation_6_7_4 4686248 ns/iter (± 6958) 4023698 ns/iter (± 1445) 1.16
css/lexer/tailwind_3_1_1 889105 ns/iter (± 492) 758971 ns/iter (± 472) 1.17
css/parser/bootstrap_5_1_3 24031441 ns/iter (± 199962) 21234058 ns/iter (± 79725) 1.13
css/parser/foundation_6_7_4 19286149 ns/iter (± 170386) 17142011 ns/iter (± 110602) 1.13
css/parser/tailwind_3_1_1 3694708 ns/iter (± 5549) 3266860 ns/iter (± 2665) 1.13
es/codegen/colors 744151 ns/iter (± 403695) 740595 ns/iter (± 405685) 1.00
es/codegen/large 3105000 ns/iter (± 1633005) 2974969 ns/iter (± 1555976) 1.04
es/codegen/with-parser/colors 57583 ns/iter (± 454) 48633 ns/iter (± 245) 1.18
es/codegen/with-parser/large 581794 ns/iter (± 1495) 520329 ns/iter (± 1213) 1.12
es/minify/libraries/antd 1656501898 ns/iter (± 23865180) 1373784564 ns/iter (± 15447253) 1.21
es/minify/libraries/d3 349451035 ns/iter (± 10587939) 289879623 ns/iter (± 2409954) 1.21
es/minify/libraries/echarts 1295658787 ns/iter (± 23971348) 1098689486 ns/iter (± 20179284) 1.18
es/minify/libraries/jquery 98296272 ns/iter (± 3080791) 84681972 ns/iter (± 481124) 1.16
es/minify/libraries/lodash 122646586 ns/iter (± 2497909) 103490408 ns/iter (± 685998) 1.19
es/minify/libraries/moment 60978718 ns/iter (± 1648180) 49782963 ns/iter (± 208181) 1.22
es/minify/libraries/react 20693193 ns/iter (± 514797) 18103758 ns/iter (± 158160) 1.14
es/minify/libraries/terser 269048717 ns/iter (± 12849310) 220545445 ns/iter (± 1783880) 1.22
es/minify/libraries/three 495598512 ns/iter (± 37442217) 391970013 ns/iter (± 11399270) 1.26
es/minify/libraries/typescript 3119444243 ns/iter (± 42597195) 2653505154 ns/iter (± 26088567) 1.18
es/minify/libraries/victory 719239004 ns/iter (± 38119427) 561335882 ns/iter (± 7232721) 1.28
es/minify/libraries/vue 156180568 ns/iter (± 10319535) 123574005 ns/iter (± 481431) 1.26
es/visitor/compare/clone 2422099 ns/iter (± 9866) 2082514 ns/iter (± 4419) 1.16
es/visitor/compare/visit_mut_span 2953836 ns/iter (± 105359) 2407077 ns/iter (± 4154) 1.23
es/visitor/compare/visit_mut_span_panic 2873322 ns/iter (± 51323) 2447509 ns/iter (± 4947) 1.17
es/visitor/compare/fold_span 4060088 ns/iter (± 126202) 3494593 ns/iter (± 15800) 1.16
es/visitor/compare/fold_span_panic 4145922 ns/iter (± 56715) 3623796 ns/iter (± 8011) 1.14
es/lexer/colors 14754 ns/iter (± 23) 13701 ns/iter (± 57) 1.08
es/lexer/angular 6937325 ns/iter (± 5271) 6238422 ns/iter (± 7134) 1.11
es/lexer/backbone 844503 ns/iter (± 605) 816793 ns/iter (± 1078) 1.03
es/lexer/jquery 4781607 ns/iter (± 7532) 4604799 ns/iter (± 6412) 1.04
es/lexer/jquery mobile 7376982 ns/iter (± 8495) 7165857 ns/iter (± 27693) 1.03
es/lexer/mootools 3761635 ns/iter (± 2694) 3705602 ns/iter (± 6676) 1.02
es/lexer/underscore 702680 ns/iter (± 5756) 677531 ns/iter (± 536) 1.04
es/lexer/three 22447335 ns/iter (± 26065) 21646259 ns/iter (± 34290) 1.04
es/lexer/yui 4279181 ns/iter (± 2368) 4122236 ns/iter (± 24919) 1.04
es/parser/colors 33634 ns/iter (± 50) 28695 ns/iter (± 54) 1.17
es/parser/angular 17052923 ns/iter (± 391602) 14476910 ns/iter (± 83322) 1.18
es/parser/backbone 2442959 ns/iter (± 9597) 2158027 ns/iter (± 15551) 1.13
es/parser/jquery 13953522 ns/iter (± 522097) 11753321 ns/iter (± 141887) 1.19
es/parser/jquery mobile 21359448 ns/iter (± 574075) 17911411 ns/iter (± 128245) 1.19
es/parser/mootools 10073646 ns/iter (± 190202) 8941969 ns/iter (± 13093) 1.13
es/parser/underscore 2075059 ns/iter (± 9504) 1858513 ns/iter (± 9840) 1.12
es/parser/three 62402120 ns/iter (± 939453) 50145851 ns/iter (± 923798) 1.24
es/parser/yui 10607610 ns/iter (± 302611) 9009624 ns/iter (± 25834) 1.18
es/preset-env/usage/builtin_type 155418 ns/iter (± 33913) 146247 ns/iter (± 31827) 1.06
es/preset-env/usage/property 30040 ns/iter (± 60) 20214 ns/iter (± 213) 1.49
es/resolver/typescript 120596334 ns/iter (± 2996426) 98610800 ns/iter (± 1371640) 1.22
es/fixer/typescript 84998766 ns/iter (± 1339515) 68243156 ns/iter (± 743360) 1.25
es/hygiene/typescript 191847233 ns/iter (± 3430370) 147722709 ns/iter (± 1297027) 1.30
es/resolver_with_hygiene/typescript 396273786 ns/iter (± 6041176) 310760166 ns/iter (± 3457144) 1.28
es/visitor/base-perf/module_clone 85651 ns/iter (± 474) 60857 ns/iter (± 190) 1.41
es/visitor/base-perf/fold_empty 95135 ns/iter (± 253) 65258 ns/iter (± 517) 1.46
es/visitor/base-perf/fold_noop_impl_all 95139 ns/iter (± 431) 65040 ns/iter (± 297) 1.46
es/visitor/base-perf/fold_noop_impl_vec 95654 ns/iter (± 311) 64999 ns/iter (± 263) 1.47
es/visitor/base-perf/boxing_boxed_clone 60 ns/iter (± 0) 56 ns/iter (± 0) 1.07
es/visitor/base-perf/boxing_unboxed_clone 44 ns/iter (± 0) 39 ns/iter (± 0) 1.13
es/visitor/base-perf/boxing_boxed 107 ns/iter (± 0) 113 ns/iter (± 0) 0.95
es/visitor/base-perf/boxing_unboxed 84 ns/iter (± 0) 80 ns/iter (± 0) 1.05
es/visitor/base-perf/visit_contains_this 3685 ns/iter (± 63) 2579 ns/iter (± 20) 1.43
es/base/parallel/resolver/typescript 6495943454 ns/iter (± 468732750) 4773739493 ns/iter (± 270617512) 1.36
es/base/parallel/hygiene/typescript 2205643631 ns/iter (± 28964273) 1582708842 ns/iter (± 15121568) 1.39
misc/visitors/time-complexity/time 5 105 ns/iter (± 1) 103 ns/iter (± 1) 1.02
misc/visitors/time-complexity/time 10 351 ns/iter (± 6) 278 ns/iter (± 0) 1.26
misc/visitors/time-complexity/time 15 678 ns/iter (± 0) 615 ns/iter (± 2) 1.10
misc/visitors/time-complexity/time 20 1247 ns/iter (± 12) 1083 ns/iter (± 68) 1.15
misc/visitors/time-complexity/time 40 6289 ns/iter (± 3) 3749 ns/iter (± 320) 1.68
misc/visitors/time-complexity/time 60 15841 ns/iter (± 35) 9293 ns/iter (± 652) 1.70
es/full-target/es2016 270357 ns/iter (± 1351) 245479 ns/iter (± 583) 1.10
es/full-target/es2017 260024 ns/iter (± 277) 230924 ns/iter (± 672) 1.13
es/full-target/es2018 248621 ns/iter (± 476) 217762 ns/iter (± 934) 1.14
es2020_nullish_coalescing 98513 ns/iter (± 335) 71325 ns/iter (± 282) 1.38
es2020_optional_chaining 122153 ns/iter (± 397) 88265 ns/iter (± 352) 1.38
es2022_class_properties 156542 ns/iter (± 271) 121790 ns/iter (± 416) 1.29
es2018_object_rest_spread 100191 ns/iter (± 144) 73966 ns/iter (± 444) 1.35
es2019_optional_catch_binding 88839 ns/iter (± 255) 64932 ns/iter (± 179) 1.37
es2017_async_to_generator 89484 ns/iter (± 281) 65540 ns/iter (± 226) 1.37
es2016_exponentiation 96084 ns/iter (± 289) 70373 ns/iter (± 142) 1.37
es2015_arrow 99350 ns/iter (± 261) 72670 ns/iter (± 299) 1.37
es2015_block_scoped_fn 97386 ns/iter (± 193) 69991 ns/iter (± 342) 1.39
es2015_block_scoping 185246 ns/iter (± 321) 133108 ns/iter (± 482) 1.39

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.