Skip to content

Commit f42fdd2

Browse files
authoredJun 16, 2023
fix(es/module): Add "use strict" while preserving directives (#7537)
**Related issue:** - Closes #7536.
1 parent b9acc83 commit f42fdd2

File tree

8 files changed

+22
-12
lines changed

8 files changed

+22
-12
lines changed
 

‎crates/swc/tests/fixture/issues-7xxx/7315/1/output/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// input.ts
22
"use client";
3+
"use strict";
34
Object.defineProperty(exports, "__esModule", {
45
value: true
56
});

‎crates/swc_ecma_transforms_module/src/amd.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ where
145145

146146
// "use strict";
147147
if self.config.strict_mode {
148-
stmts.push(clone_first_use_directive(n).unwrap_or_else(use_strict));
148+
stmts.push(clone_first_use_directive(n, true).unwrap_or_else(use_strict));
149149
}
150150

151151
let ModuleDeclStrip {

‎crates/swc_ecma_transforms_module/src/common_js.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,14 @@ where
111111
let mut strip = ModuleDeclStrip::new(self.const_var_kind);
112112
n.visit_mut_with(&mut strip);
113113

114-
let mut stmts: Vec<ModuleItem> = Vec::with_capacity(n.len() + 4);
114+
let mut stmts: Vec<ModuleItem> = Vec::with_capacity(n.len() + 6);
115+
116+
stmts.extend(clone_first_use_directive(n, false).map(From::from));
115117

116118
// "use strict";
117119
if self.config.strict_mode {
118120
stmts.push(
119-
clone_first_use_directive(n)
121+
clone_first_use_directive(n, true)
120122
.unwrap_or_else(use_strict)
121123
.into(),
122124
);

‎crates/swc_ecma_transforms_module/src/umd.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ where
122122

123123
// "use strict";
124124
if self.config.config.strict_mode {
125-
stmts.push(clone_first_use_directive(module_items).unwrap_or_else(use_strict));
125+
stmts.push(clone_first_use_directive(module_items, true).unwrap_or_else(use_strict));
126126
}
127127

128128
let ModuleDeclStrip {

‎crates/swc_ecma_transforms_module/src/util.rs

+12-6
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use swc_common::{Span, Spanned, DUMMY_SP};
66
use swc_ecma_ast::*;
77
use swc_ecma_utils::{
88
is_valid_prop_ident, member_expr, private_ident, quote_ident, quote_str, ExprFactory,
9-
FunctionFactory,
9+
FunctionFactory, IsDirective,
1010
};
1111

1212
#[derive(Debug, Clone, Serialize, Deserialize)]
@@ -190,18 +190,24 @@ pub(super) fn define_es_module(exports: Ident) -> Stmt {
190190
.into_stmt()
191191
}
192192

193-
pub(super) fn clone_first_use_directive(stmts: &[ModuleItem]) -> Option<Stmt> {
193+
pub(super) fn clone_first_use_directive(
194+
stmts: &[ModuleItem],
195+
want_use_strict: bool,
196+
) -> Option<Stmt> {
194197
if stmts.is_empty() {
195198
return None;
196199
}
197200

198201
stmts.iter().find_map(|item| match item {
199-
ModuleItem::Stmt(stmt @ Stmt::Expr(ExprStmt { expr, .. })) => match **expr {
200-
Expr::Lit(Lit::Str(Str { ref value, .. })) if value.starts_with("use ") => {
202+
ModuleItem::Stmt(stmt) => {
203+
if (want_use_strict && stmt.is_use_strict())
204+
|| (!want_use_strict && !stmt.is_use_strict() && stmt.is_directive())
205+
{
201206
Some(stmt.clone())
207+
} else {
208+
None
202209
}
203-
_ => None,
204-
},
210+
}
205211
_ => None,
206212
})
207213
}

‎crates/swc_ecma_transforms_module/tests/fixture/common/issue-7315/output.amd.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ define([
33
"require",
44
"exports"
55
], function(require, exports) {
6-
"use client";
6+
"use strict";
77
Object.defineProperty(exports, "__esModule", {
88
value: true
99
});

‎crates/swc_ecma_transforms_module/tests/fixture/common/issue-7315/output.cjs

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// input.ts
22
"use client";
3+
"use strict";
34
Object.defineProperty(exports, "__esModule", {
45
value: true
56
});

‎crates/swc_ecma_transforms_module/tests/fixture/common/issue-7315/output.umd.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
], factory);
77
else if (global = typeof globalThis !== "undefined" ? globalThis : global || self) factory(global.input = {});
88
})(this, function(exports) {
9-
"use client";
9+
"use strict";
1010
Object.defineProperty(exports, "__esModule", {
1111
value: true
1212
});

1 commit comments

Comments
 (1)

github-actions[bot] commented on Jun 16, 2023

@github-actions[bot]

Benchmark

Benchmark suite Current: f42fdd2 Previous: e5152d3 Ratio
es/full/bugs-1 357387 ns/iter (± 7209) 394241 ns/iter (± 8933) 0.91
es/full/minify/libraries/antd 1894867384 ns/iter (± 33413328) 2185916721 ns/iter (± 35506136) 0.87
es/full/minify/libraries/d3 374257258 ns/iter (± 8553329) 468193493 ns/iter (± 4786125) 0.80
es/full/minify/libraries/echarts 1463349284 ns/iter (± 12068537) 1700100689 ns/iter (± 7955526) 0.86
es/full/minify/libraries/jquery 110091642 ns/iter (± 698406) 134320058 ns/iter (± 5636985) 0.82
es/full/minify/libraries/lodash 133334890 ns/iter (± 1196348) 162882355 ns/iter (± 2390880) 0.82
es/full/minify/libraries/moment 63503576 ns/iter (± 583521) 77353697 ns/iter (± 2111696) 0.82
es/full/minify/libraries/react 22693856 ns/iter (± 148355) 26285648 ns/iter (± 1441768) 0.86
es/full/minify/libraries/terser 297997336 ns/iter (± 3515108) 355146809 ns/iter (± 3993943) 0.84
es/full/minify/libraries/three 538296215 ns/iter (± 7296576) 635643603 ns/iter (± 4937961) 0.85
es/full/minify/libraries/typescript 3625496829 ns/iter (± 34903132) 3968552127 ns/iter (± 16001342) 0.91
es/full/minify/libraries/victory 787749259 ns/iter (± 11179036) 919048975 ns/iter (± 5262795) 0.86
es/full/minify/libraries/vue 160447566 ns/iter (± 1044031) 184949826 ns/iter (± 1395934) 0.87
es/full/codegen/es3 40065 ns/iter (± 95) 40383 ns/iter (± 101) 0.99
es/full/codegen/es5 40085 ns/iter (± 103) 40476 ns/iter (± 56) 0.99
es/full/codegen/es2015 40127 ns/iter (± 97) 40494 ns/iter (± 98) 0.99
es/full/codegen/es2016 40067 ns/iter (± 60) 40471 ns/iter (± 73) 0.99
es/full/codegen/es2017 40063 ns/iter (± 55) 40514 ns/iter (± 32) 0.99
es/full/codegen/es2018 40131 ns/iter (± 85) 40437 ns/iter (± 49) 0.99
es/full/codegen/es2019 40112 ns/iter (± 59) 40488 ns/iter (± 67) 0.99
es/full/codegen/es2020 40078 ns/iter (± 128) 40461 ns/iter (± 85) 0.99
es/full/all/es3 208556208 ns/iter (± 2721954) 217501486 ns/iter (± 7692973) 0.96
es/full/all/es5 199644111 ns/iter (± 1970020) 207134490 ns/iter (± 3131771) 0.96
es/full/all/es2015 154141040 ns/iter (± 1312433) 158758212 ns/iter (± 3727526) 0.97
es/full/all/es2016 152819690 ns/iter (± 2139082) 159426852 ns/iter (± 3029796) 0.96
es/full/all/es2017 154190833 ns/iter (± 2252918) 159625834 ns/iter (± 3859732) 0.97
es/full/all/es2018 150423451 ns/iter (± 1848015) 156535262 ns/iter (± 5158806) 0.96
es/full/all/es2019 151297696 ns/iter (± 2376093) 155489761 ns/iter (± 4439555) 0.97
es/full/all/es2020 144884929 ns/iter (± 2090087) 150430464 ns/iter (± 3895919) 0.96
es/full/parser 596592 ns/iter (± 8859) 605697 ns/iter (± 12947) 0.98
es/full/base/fixer 25806 ns/iter (± 45) 24619 ns/iter (± 29) 1.05
es/full/base/resolver_and_hygiene 106146 ns/iter (± 154) 105301 ns/iter (± 112) 1.01
serialization of serde 282 ns/iter (± 0) 282 ns/iter (± 0) 1
css/minify/libraries/bootstrap 35884146 ns/iter (± 343779) 39199907 ns/iter (± 156352) 0.92
css/visitor/compare/clone 2364138 ns/iter (± 4527) 2740990 ns/iter (± 30920) 0.86
css/visitor/compare/visit_mut_span 2510393 ns/iter (± 5200) 2943904 ns/iter (± 17686) 0.85
css/visitor/compare/visit_mut_span_panic 2615062 ns/iter (± 4354) 3002516 ns/iter (± 17238) 0.87
css/visitor/compare/fold_span 3321902 ns/iter (± 11985) 3880597 ns/iter (± 31665) 0.86
css/visitor/compare/fold_span_panic 3497685 ns/iter (± 11626) 4118501 ns/iter (± 37911) 0.85
css/lexer/bootstrap_5_1_3 5538881 ns/iter (± 998) 5539610 ns/iter (± 13133) 1.00
css/lexer/foundation_6_7_4 4675091 ns/iter (± 2459) 4676898 ns/iter (± 1936) 1.00
css/lexer/tailwind_3_1_1 888340 ns/iter (± 226) 886881 ns/iter (± 959) 1.00
css/parser/bootstrap_5_1_3 23940380 ns/iter (± 143394) 25486296 ns/iter (± 96522) 0.94
css/parser/foundation_6_7_4 19088951 ns/iter (± 37967) 20261960 ns/iter (± 38408) 0.94
css/parser/tailwind_3_1_1 3680254 ns/iter (± 2267) 3770625 ns/iter (± 5092) 0.98
es/codegen/colors 742581 ns/iter (± 406560) 705746 ns/iter (± 386103) 1.05
es/codegen/large 3102986 ns/iter (± 1610663) 2883969 ns/iter (± 1511670) 1.08
es/codegen/with-parser/colors 57997 ns/iter (± 686) 57705 ns/iter (± 535) 1.01
es/codegen/with-parser/large 578294 ns/iter (± 3573) 578146 ns/iter (± 1763) 1.00
es/minify/libraries/antd 1648536078 ns/iter (± 23640967) 1885328154 ns/iter (± 18123446) 0.87
es/minify/libraries/d3 325818389 ns/iter (± 2318996) 405635563 ns/iter (± 3002875) 0.80
es/minify/libraries/echarts 1282293853 ns/iter (± 21331060) 1450686901 ns/iter (± 14853702) 0.88
es/minify/libraries/jquery 97436003 ns/iter (± 747454) 113347538 ns/iter (± 2264313) 0.86
es/minify/libraries/lodash 121504456 ns/iter (± 890482) 142482672 ns/iter (± 1916644) 0.85
es/minify/libraries/moment 56500367 ns/iter (± 353232) 64996317 ns/iter (± 555570) 0.87
es/minify/libraries/react 20385651 ns/iter (± 87517) 22661424 ns/iter (± 184229) 0.90
es/minify/libraries/terser 251428860 ns/iter (± 2344845) 309632615 ns/iter (± 5107825) 0.81
es/minify/libraries/three 444376043 ns/iter (± 6030289) 542927181 ns/iter (± 6459145) 0.82
es/minify/libraries/typescript 3139761059 ns/iter (± 26384918) 3337830470 ns/iter (± 21074002) 0.94
es/minify/libraries/victory 671476685 ns/iter (± 10742456) 788673438 ns/iter (± 8594767) 0.85
es/minify/libraries/vue 143049634 ns/iter (± 1739867) 167790350 ns/iter (± 7215474) 0.85
es/visitor/compare/clone 2401065 ns/iter (± 11694) 2581490 ns/iter (± 21071) 0.93
es/visitor/compare/visit_mut_span 2799594 ns/iter (± 1670) 3030685 ns/iter (± 36901) 0.92
es/visitor/compare/visit_mut_span_panic 2831883 ns/iter (± 3820) 3026094 ns/iter (± 32712) 0.94
es/visitor/compare/fold_span 3939581 ns/iter (± 3787) 4280186 ns/iter (± 26861) 0.92
es/visitor/compare/fold_span_panic 4043698 ns/iter (± 9276) 4446006 ns/iter (± 39623) 0.91
es/lexer/colors 14875 ns/iter (± 34) 14842 ns/iter (± 12) 1.00
es/lexer/angular 6915369 ns/iter (± 11947) 6981001 ns/iter (± 1873) 0.99
es/lexer/backbone 844062 ns/iter (± 2470) 851551 ns/iter (± 490) 0.99
es/lexer/jquery 4743355 ns/iter (± 7684) 4793769 ns/iter (± 3899) 0.99
es/lexer/jquery mobile 7314221 ns/iter (± 5640) 7426989 ns/iter (± 13158) 0.98
es/lexer/mootools 3736501 ns/iter (± 7242) 3773709 ns/iter (± 3088) 0.99
es/lexer/underscore 699791 ns/iter (± 2597) 707435 ns/iter (± 1805) 0.99
es/lexer/three 22275434 ns/iter (± 11124) 22636777 ns/iter (± 18489) 0.98
es/lexer/yui 4268864 ns/iter (± 1643) 4312009 ns/iter (± 2442) 0.99
es/parser/colors 33846 ns/iter (± 64) 33844 ns/iter (± 87) 1.00
es/parser/angular 16912234 ns/iter (± 91147) 19054921 ns/iter (± 168719) 0.89
es/parser/backbone 2440338 ns/iter (± 9275) 2488103 ns/iter (± 15274) 0.98
es/parser/jquery 13282318 ns/iter (± 92514) 15071938 ns/iter (± 381198) 0.88
es/parser/jquery mobile 20266332 ns/iter (± 177813) 23291137 ns/iter (± 322614) 0.87
es/parser/mootools 10083158 ns/iter (± 24016) 11086417 ns/iter (± 66934) 0.91
es/parser/underscore 2077804 ns/iter (± 12329) 2107932 ns/iter (± 11809) 0.99
es/parser/three 58948393 ns/iter (± 778075) 65130698 ns/iter (± 200304) 0.91
es/parser/yui 10218187 ns/iter (± 103146) 11373428 ns/iter (± 188220) 0.90
es/preset-env/usage/builtin_type 155279 ns/iter (± 33816) 154648 ns/iter (± 33617) 1.00
es/preset-env/usage/property 29527 ns/iter (± 62) 30168 ns/iter (± 99) 0.98
es/resolver/typescript 129382169 ns/iter (± 3577586) 134973317 ns/iter (± 2560594) 0.96
es/fixer/typescript 91606178 ns/iter (± 1654351) 93370888 ns/iter (± 1401400) 0.98
es/hygiene/typescript 205329028 ns/iter (± 1988120) 216350759 ns/iter (± 2758961) 0.95
es/resolver_with_hygiene/typescript 406587463 ns/iter (± 3015924) 441191281 ns/iter (± 7580852) 0.92
es/visitor/base-perf/module_clone 85462 ns/iter (± 486) 85566 ns/iter (± 328) 1.00
es/visitor/base-perf/fold_empty 94931 ns/iter (± 410) 94722 ns/iter (± 1171) 1.00
es/visitor/base-perf/fold_noop_impl_all 95307 ns/iter (± 259) 95449 ns/iter (± 209) 1.00
es/visitor/base-perf/fold_noop_impl_vec 95460 ns/iter (± 600) 95432 ns/iter (± 358) 1.00
es/visitor/base-perf/boxing_boxed_clone 62 ns/iter (± 0) 60 ns/iter (± 0) 1.03
es/visitor/base-perf/boxing_unboxed_clone 44 ns/iter (± 0) 44 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 109 ns/iter (± 0) 107 ns/iter (± 0) 1.02
es/visitor/base-perf/boxing_unboxed 82 ns/iter (± 0) 81 ns/iter (± 0) 1.01
es/visitor/base-perf/visit_contains_this 3526 ns/iter (± 64) 3381 ns/iter (± 111) 1.04
es/base/parallel/resolver/typescript 7031201283 ns/iter (± 434464736) 7342841466 ns/iter (± 535041466) 0.96
es/base/parallel/hygiene/typescript 2341099419 ns/iter (± 24921406) 2534282292 ns/iter (± 35622891) 0.92
misc/visitors/time-complexity/time 5 106 ns/iter (± 0) 104 ns/iter (± 0) 1.02
misc/visitors/time-complexity/time 10 346 ns/iter (± 5) 351 ns/iter (± 4) 0.99
misc/visitors/time-complexity/time 15 672 ns/iter (± 0) 678 ns/iter (± 0) 0.99
misc/visitors/time-complexity/time 20 1262 ns/iter (± 25) 1245 ns/iter (± 2) 1.01
misc/visitors/time-complexity/time 40 6854 ns/iter (± 33) 6293 ns/iter (± 25) 1.09
misc/visitors/time-complexity/time 60 17509 ns/iter (± 48) 15801 ns/iter (± 5) 1.11
es/full-target/es2016 270177 ns/iter (± 668) 270676 ns/iter (± 1900) 1.00
es/full-target/es2017 260399 ns/iter (± 468) 260423 ns/iter (± 374) 1.00
es/full-target/es2018 249178 ns/iter (± 627) 249216 ns/iter (± 248) 1.00
es2020_nullish_coalescing 99689 ns/iter (± 431) 99021 ns/iter (± 370) 1.01
es2020_optional_chaining 121999 ns/iter (± 385) 122184 ns/iter (± 343) 1.00
es2022_class_properties 157001 ns/iter (± 358) 157251 ns/iter (± 137) 1.00
es2018_object_rest_spread 101007 ns/iter (± 204) 99979 ns/iter (± 170) 1.01
es2019_optional_catch_binding 89319 ns/iter (± 318) 88606 ns/iter (± 231) 1.01
es2017_async_to_generator 90271 ns/iter (± 117) 89501 ns/iter (± 208) 1.01
es2016_exponentiation 96726 ns/iter (± 235) 95807 ns/iter (± 319) 1.01
es2015_arrow 99438 ns/iter (± 260) 98825 ns/iter (± 288) 1.01
es2015_block_scoped_fn 97592 ns/iter (± 261) 97147 ns/iter (± 341) 1.00
es2015_block_scoping 184758 ns/iter (± 224) 185086 ns/iter (± 305) 1.00

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

Please sign in to comment.