Skip to content

Commit 05a2815

Browse files
authoredMar 27, 2023
feat(es/react): Support script within automatic runtime (#7126)
**Description:** Inject `const { jsx: _jsx} = require("react/jsx-runtime")` when sourceType is `script` **Related issue:** - Closes #7119.
1 parent 47f15f9 commit 05a2815

File tree

31 files changed

+476
-100
lines changed

31 files changed

+476
-100
lines changed
 

‎crates/swc/src/config/mod.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -749,7 +749,13 @@ impl Options {
749749
custom_before_pass(&program),
750750
// handle jsx
751751
Optional::new(
752-
react::react(cm.clone(), comments, transform.react, top_level_mark),
752+
react::react(
753+
cm.clone(),
754+
comments,
755+
transform.react,
756+
top_level_mark,
757+
unresolved_mark
758+
),
753759
syntax.jsx()
754760
),
755761
pass,

‎crates/swc_bundler/tests/common/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ impl Load for Loader {
146146
None,
147147
Default::default(),
148148
top_level_mark,
149+
unresolved_mark,
149150
))
150151
.fold_with(&mut inject_helpers(unresolved_mark))
151152
});

‎crates/swc_ecma_transforms_react/src/jsx/mod.rs

+154-90
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ use swc_common::{
1818
use swc_config::merge::Merge;
1919
use swc_ecma_ast::*;
2020
use swc_ecma_parser::{parse_file_as_expr, Syntax};
21-
use swc_ecma_utils::{drop_span, prepend_stmt, private_ident, quote_ident, undefined, ExprFactory};
21+
use swc_ecma_utils::{
22+
drop_span, prepend_stmt, private_ident, quote_ident, undefined, ExprFactory, StmtLike,
23+
};
2224
use swc_ecma_visit::{as_folder, noop_visit_mut_type, Fold, VisitMut, VisitMutWith};
2325

2426
use self::static_check::should_use_create_element;
@@ -187,13 +189,15 @@ pub fn jsx<C>(
187189
comments: Option<C>,
188190
options: Options,
189191
top_level_mark: Mark,
192+
unresolved_mark: Mark,
190193
) -> impl Fold + VisitMut
191194
where
192195
C: Comments,
193196
{
194197
as_folder(Jsx {
195198
cm: cm.clone(),
196199
top_level_mark,
200+
unresolved_mark,
197201
runtime: options.runtime.unwrap_or_default(),
198202
import_source: options
199203
.import_source
@@ -232,6 +236,7 @@ where
232236
cm: Lrc<SourceMap>,
233237

234238
top_level_mark: Mark,
239+
unresolved_mark: Mark,
235240

236241
runtime: Runtime,
237242
/// For automatic runtime.
@@ -376,6 +381,62 @@ impl<C> Jsx<C>
376381
where
377382
C: Comments,
378383
{
384+
fn inject_runtime<T, F>(&mut self, body: &mut Vec<T>, inject: F)
385+
where
386+
T: StmtLike,
387+
// Fn(Vec<(local, imported)>, src, body)
388+
F: Fn(Vec<(Ident, Ident)>, &str, &mut Vec<T>),
389+
{
390+
if self.runtime == Runtime::Automatic {
391+
if let Some(local) = self.import_create_element.take() {
392+
inject(
393+
vec![(local, quote_ident!("createElement"))],
394+
&self.import_source,
395+
body,
396+
);
397+
}
398+
399+
let imports = self.import_jsx.take();
400+
let imports = if self.development {
401+
imports
402+
.map(|local| (local, quote_ident!("jsxDEV")))
403+
.into_iter()
404+
.chain(
405+
self.import_fragment
406+
.take()
407+
.map(|local| (local, quote_ident!("Fragment"))),
408+
)
409+
.collect::<Vec<_>>()
410+
} else {
411+
imports
412+
.map(|local| (local, quote_ident!("jsx")))
413+
.into_iter()
414+
.chain(
415+
self.import_jsxs
416+
.take()
417+
.map(|local| (local, quote_ident!("jsxs"))),
418+
)
419+
.chain(
420+
self.import_fragment
421+
.take()
422+
.map(|local| (local, quote_ident!("Fragment"))),
423+
)
424+
.collect::<Vec<_>>()
425+
};
426+
427+
if !imports.is_empty() {
428+
let jsx_runtime = if self.development {
429+
"jsx-dev-runtime"
430+
} else {
431+
"jsx-runtime"
432+
};
433+
434+
let value = format!("{}/{}", self.import_source, jsx_runtime);
435+
inject(imports, &value, body)
436+
}
437+
}
438+
}
439+
379440
fn jsx_frag_to_expr(&mut self, el: JSXFragment) -> Expr {
380441
let span = el.span();
381442

@@ -477,7 +538,7 @@ where
477538

478539
/// # Automatic
479540
///
480-
///
541+
/// <div></div> => jsx('div', null);
481542
///
482543
/// # Classic
483544
///
@@ -975,113 +1036,116 @@ where
9751036
module.visit_mut_children_with(self);
9761037

9771038
if self.runtime == Runtime::Automatic {
978-
if let Some(local) = self.import_create_element.take() {
979-
let specifier = ImportSpecifier::Named(ImportNamedSpecifier {
980-
span: DUMMY_SP,
981-
local,
982-
imported: Some(ModuleExportName::Ident(Ident::new(
983-
"createElement".into(),
984-
DUMMY_SP,
985-
))),
986-
is_type_only: false,
987-
});
988-
prepend_stmt(
989-
&mut module.body,
990-
ModuleItem::ModuleDecl(ModuleDecl::Import(ImportDecl {
991-
span: DUMMY_SP,
992-
specifiers: vec![specifier],
993-
src: Str {
994-
span: DUMMY_SP,
995-
raw: None,
996-
value: self.import_source.clone(),
997-
}
998-
.into(),
999-
type_only: Default::default(),
1000-
asserts: Default::default(),
1001-
})),
1002-
);
1003-
}
1004-
1005-
let imports = self.import_jsx.take();
1006-
let imports = if self.development {
1007-
imports
1008-
.map(|local| ImportNamedSpecifier {
1009-
span: DUMMY_SP,
1010-
local,
1011-
imported: Some(ModuleExportName::Ident(quote_ident!("jsxDEV"))),
1012-
is_type_only: false,
1013-
})
1039+
self.inject_runtime(&mut module.body, |imports, src, stmts| {
1040+
let specifiers = imports
10141041
.into_iter()
1015-
.chain(
1016-
self.import_fragment
1017-
.take()
1018-
.map(|local| ImportNamedSpecifier {
1019-
span: DUMMY_SP,
1020-
local,
1021-
imported: Some(ModuleExportName::Ident(quote_ident!("Fragment"))),
1022-
is_type_only: false,
1023-
}),
1024-
)
1025-
.map(ImportSpecifier::Named)
1026-
.collect::<Vec<_>>()
1027-
} else {
1028-
imports
1029-
.map(|local| ImportNamedSpecifier {
1030-
span: DUMMY_SP,
1031-
local,
1032-
imported: Some(ModuleExportName::Ident(quote_ident!("jsx"))),
1033-
is_type_only: false,
1042+
.map(|(local, imported)| {
1043+
ImportSpecifier::Named(ImportNamedSpecifier {
1044+
span: DUMMY_SP,
1045+
local,
1046+
imported: Some(ModuleExportName::Ident(imported)),
1047+
is_type_only: false,
1048+
})
10341049
})
1035-
.into_iter()
1036-
.chain(self.import_jsxs.take().map(|local| ImportNamedSpecifier {
1037-
span: DUMMY_SP,
1038-
local,
1039-
imported: Some(ModuleExportName::Ident(quote_ident!("jsxs"))),
1040-
is_type_only: false,
1041-
}))
1042-
.chain(
1043-
self.import_fragment
1044-
.take()
1045-
.map(|local| ImportNamedSpecifier {
1046-
span: DUMMY_SP,
1047-
local,
1048-
imported: Some(ModuleExportName::Ident(quote_ident!("Fragment"))),
1049-
is_type_only: false,
1050-
}),
1051-
)
1052-
.map(ImportSpecifier::Named)
1053-
.collect::<Vec<_>>()
1054-
};
1055-
1056-
if !imports.is_empty() {
1057-
let jsx_runtime = if self.development {
1058-
"jsx-dev-runtime"
1059-
} else {
1060-
"jsx-runtime"
1061-
};
1062-
1063-
let value = format!("{}/{}", self.import_source, jsx_runtime);
1050+
.collect();
10641051

10651052
prepend_stmt(
1066-
&mut module.body,
1053+
stmts,
10671054
ModuleItem::ModuleDecl(ModuleDecl::Import(ImportDecl {
10681055
span: DUMMY_SP,
1069-
specifiers: imports,
1056+
specifiers,
10701057
src: Str {
10711058
span: DUMMY_SP,
10721059
raw: None,
1073-
value: value.into(),
1060+
value: src.into(),
10741061
}
10751062
.into(),
10761063
type_only: Default::default(),
10771064
asserts: Default::default(),
10781065
})),
1079-
);
1066+
)
1067+
});
1068+
}
1069+
}
1070+
1071+
fn visit_mut_script(&mut self, script: &mut Script) {
1072+
self.parse_directives(script.span);
1073+
1074+
for item in &script.body {
1075+
let span = item.span();
1076+
if self.parse_directives(span) {
1077+
break;
10801078
}
10811079
}
1080+
1081+
script.visit_mut_children_with(self);
1082+
1083+
if self.runtime == Runtime::Automatic {
1084+
let mark = self.unresolved_mark;
1085+
self.inject_runtime(&mut script.body, |imports, src, stmts| {
1086+
prepend_stmt(stmts, add_require(imports, src, mark))
1087+
});
1088+
}
10821089
}
10831090
}
10841091

1092+
// const { createElement } = require('react')
1093+
// const { jsx: jsx } = require('react/jsx-runtime')
1094+
fn add_require(imports: Vec<(Ident, Ident)>, src: &str, unresolved_mark: Mark) -> Stmt {
1095+
Stmt::Decl(Decl::Var(Box::new(VarDecl {
1096+
span: DUMMY_SP,
1097+
kind: VarDeclKind::Const,
1098+
declare: false,
1099+
decls: vec![VarDeclarator {
1100+
span: DUMMY_SP,
1101+
name: Pat::Object(ObjectPat {
1102+
span: DUMMY_SP,
1103+
props: imports
1104+
.into_iter()
1105+
.map(|(local, imported)| {
1106+
if imported.sym != local.sym {
1107+
ObjectPatProp::KeyValue(KeyValuePatProp {
1108+
key: PropName::Ident(imported),
1109+
value: Box::new(Pat::Ident(BindingIdent {
1110+
id: local,
1111+
type_ann: None,
1112+
})),
1113+
})
1114+
} else {
1115+
ObjectPatProp::Assign(AssignPatProp {
1116+
span: DUMMY_SP,
1117+
key: local,
1118+
value: None,
1119+
})
1120+
}
1121+
})
1122+
.collect(),
1123+
optional: false,
1124+
type_ann: None,
1125+
}),
1126+
// require('react')
1127+
init: Some(Box::new(Expr::Call(CallExpr {
1128+
span: DUMMY_SP,
1129+
callee: Callee::Expr(Box::new(Expr::Ident(Ident {
1130+
span: DUMMY_SP.apply_mark(unresolved_mark),
1131+
sym: js_word!("require"),
1132+
optional: false,
1133+
}))),
1134+
args: vec![ExprOrSpread {
1135+
spread: None,
1136+
expr: Box::new(Expr::Lit(Lit::Str(Str {
1137+
span: DUMMY_SP,
1138+
value: src.into(),
1139+
raw: None,
1140+
}))),
1141+
}],
1142+
type_args: None,
1143+
}))),
1144+
definite: false,
1145+
}],
1146+
})))
1147+
}
1148+
10851149
impl<C> Jsx<C>
10861150
where
10871151
C: Comments,

‎crates/swc_ecma_transforms_react/src/jsx/tests.rs

+91-8
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
11
#![allow(dead_code)]
22

3-
use std::path::PathBuf;
3+
use std::{
4+
fs,
5+
path::{Path, PathBuf},
6+
};
47

58
use swc_common::{chain, Mark};
6-
use swc_ecma_parser::EsConfig;
7-
use swc_ecma_transforms_base::resolver;
9+
use swc_ecma_codegen::{Config, Emitter};
10+
use swc_ecma_parser::{EsConfig, Parser, StringInput};
11+
use swc_ecma_transforms_base::{fixer::fixer, hygiene, resolver};
812
use swc_ecma_transforms_compat::{
913
es2015::{arrow, classes},
1014
es3::property_literals,
1115
};
1216
use swc_ecma_transforms_module::common_js::common_js;
1317
use swc_ecma_transforms_testing::{parse_options, test, test_fixture, FixtureTestConfig, Tester};
18+
use swc_ecma_visit::FoldWith;
19+
use testing::NormalizedOutput;
1420

1521
use super::*;
1622
use crate::{display_name, pure_annotations, react};
@@ -24,7 +30,8 @@ fn tr(t: &mut Tester, options: Options, top_level_mark: Mark) -> impl Fold {
2430
t.cm.clone(),
2531
Some(t.comments.clone()),
2632
options,
27-
top_level_mark
33+
top_level_mark,
34+
unresolved_mark
2835
),
2936
display_name(),
3037
classes(Some(t.comments.clone()), Default::default()),
@@ -71,7 +78,8 @@ fn fixture_tr(t: &mut Tester, mut options: FixtureOptions) -> impl Fold {
7178
t.cm.clone(),
7279
Some(t.comments.clone()),
7380
options.options,
74-
top_level_mark
81+
top_level_mark,
82+
unresolved_mark,
7583
),
7684
display_name(),
7785
pure_annotations(Some(t.comments.clone()))
@@ -94,7 +102,8 @@ fn integration_tr(t: &mut Tester, mut options: FixtureOptions) -> impl Fold {
94102
t.cm.clone(),
95103
Some(t.comments.clone()),
96104
options.options,
97-
top_level_mark
105+
top_level_mark,
106+
unresolved_mark
98107
),
99108
display_name(),
100109
)
@@ -1338,14 +1347,16 @@ test!(
13381347
}),
13391348
|t| {
13401349
let top_level_mark = Mark::fresh(Mark::root());
1350+
let unresolved_mark = Mark::fresh(Mark::root());
13411351

13421352
chain!(
13431353
classes(Some(t.comments.clone()), Default::default()),
13441354
jsx(
13451355
t.cm.clone(),
13461356
Some(t.comments.clone()),
13471357
Default::default(),
1348-
top_level_mark
1358+
top_level_mark,
1359+
unresolved_mark
13491360
)
13501361
)
13511362
},
@@ -1419,7 +1430,8 @@ test!(
14191430
t.cm.clone(),
14201431
Some(t.comments.clone()),
14211432
Default::default(),
1422-
top_level_mark
1433+
top_level_mark,
1434+
unresolved_mark
14231435
)
14241436
)
14251437
},
@@ -1483,3 +1495,74 @@ fn integration(input: PathBuf) {
14831495
},
14841496
);
14851497
}
1498+
1499+
#[testing::fixture("tests/script/**/input.js")]
1500+
fn script(input: PathBuf) {
1501+
let output = input.with_file_name("output.js");
1502+
1503+
let options = parse_options(input.parent().unwrap());
1504+
1505+
let input = fs::read_to_string(&input).unwrap();
1506+
1507+
test_script(&input, &output, options);
1508+
}
1509+
1510+
fn test_script(src: &str, output: &Path, options: Options) {
1511+
Tester::run(|tester| {
1512+
let fm = tester
1513+
.cm
1514+
.new_source_file(FileName::Real("input.js".into()), src.into());
1515+
1516+
let syntax = Syntax::Es(EsConfig {
1517+
jsx: true,
1518+
..Default::default()
1519+
});
1520+
1521+
let mut parser = Parser::new(syntax, StringInput::from(&*fm), Some(&tester.comments));
1522+
1523+
let script = parser.parse_script().unwrap();
1524+
1525+
let top_level_mark = Mark::new();
1526+
let unresolved_mark = Mark::new();
1527+
1528+
let script = script.fold_with(&mut chain!(
1529+
resolver(Mark::new(), top_level_mark, false),
1530+
react(
1531+
tester.cm.clone(),
1532+
Some(&tester.comments),
1533+
options,
1534+
top_level_mark,
1535+
unresolved_mark,
1536+
),
1537+
hygiene::hygiene(),
1538+
fixer(Some(&tester.comments))
1539+
));
1540+
1541+
let mut buf = vec![];
1542+
1543+
let mut emitter = Emitter {
1544+
cfg: Config {
1545+
target: Default::default(),
1546+
ascii_only: true,
1547+
minify: false,
1548+
omit_last_semi: true,
1549+
},
1550+
cm: tester.cm.clone(),
1551+
wr: Box::new(swc_ecma_codegen::text_writer::JsWriter::new(
1552+
tester.cm.clone(),
1553+
"\n",
1554+
&mut buf,
1555+
None,
1556+
)),
1557+
comments: Some(&tester.comments),
1558+
};
1559+
1560+
// println!("Emitting: {:?}", module);
1561+
emitter.emit_script(&script).unwrap();
1562+
1563+
let s = String::from_utf8_lossy(&buf).to_string();
1564+
assert!(NormalizedOutput::new_raw(s).compare_to_file(output).is_ok());
1565+
1566+
Ok(())
1567+
})
1568+
}

‎crates/swc_ecma_transforms_react/src/lib.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ pub fn react<C>(
3737
comments: Option<C>,
3838
mut options: Options,
3939
top_level_mark: Mark,
40+
unresolved_mark: Mark,
4041
) -> impl Fold + VisitMut
4142
where
4243
C: Comments + Clone,
@@ -56,7 +57,13 @@ where
5657
comments.clone(),
5758
top_level_mark
5859
),
59-
jsx(cm, comments.clone(), options, top_level_mark),
60+
jsx(
61+
cm,
62+
comments.clone(),
63+
options,
64+
top_level_mark,
65+
unresolved_mark
66+
),
6067
display_name(),
6168
pure_annotations(comments),
6269
)

‎crates/swc_ecma_transforms_react/src/pure_annotations/tests.rs

+1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ fn run_test(input: &str, expected: &str) {
7474
Some(&actual_comments),
7575
Default::default(),
7676
top_level_mark,
77+
unresolved_mark,
7778
));
7879

7980
let actual_src = emit(actual_sm, actual_comments, &actual);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
const App = (
2+
<div>
3+
<div />
4+
<>
5+
<div key={1}>hoge</div>
6+
</>
7+
</div>
8+
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{ "runtime": "automatic", "development": true }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
const { jsxDEV: _jsxDEV , Fragment: _Fragment } = require("react/jsx-dev-runtime");
2+
const App = /*#__PURE__*/ _jsxDEV("div", {
3+
children: [
4+
/*#__PURE__*/ _jsxDEV("div", {}, void 0, false, {
5+
fileName: "input.js",
6+
lineNumber: 3,
7+
columnNumber: 9
8+
}, this),
9+
/*#__PURE__*/ _jsxDEV(_Fragment, {
10+
children: /*#__PURE__*/ _jsxDEV("div", {
11+
children: "hoge"
12+
}, 1, false, {
13+
fileName: "input.js",
14+
lineNumber: 5,
15+
columnNumber: 13
16+
}, this)
17+
}, void 0, false)
18+
]
19+
}, void 0, true, {
20+
fileName: "input.js",
21+
lineNumber: 2,
22+
columnNumber: 5
23+
}, this);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
const App = (
2+
<div>
3+
<div />
4+
<>
5+
<div key={1}>hoge</div>
6+
</>
7+
</div>
8+
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{ "runtime": "automatic" }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
const { jsx: _jsx , jsxs: _jsxs , Fragment: _Fragment } = require("react/jsx-runtime");
2+
const App = /*#__PURE__*/ _jsxs("div", {
3+
children: [
4+
/*#__PURE__*/ _jsx("div", {}),
5+
/*#__PURE__*/ _jsx(_Fragment, {
6+
children: /*#__PURE__*/ _jsx("div", {
7+
children: "hoge"
8+
}, 1)
9+
})
10+
]
11+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
var x = (
2+
<>
3+
<div>hoge</div>
4+
<div>fuga</div>
5+
</>
6+
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{ "runtime": "automatic", "development": true }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
const { jsxDEV: _jsxDEV , Fragment: _Fragment } = require("react/jsx-dev-runtime");
2+
var x = /*#__PURE__*/ _jsxDEV(_Fragment, {
3+
children: [
4+
/*#__PURE__*/ _jsxDEV("div", {
5+
children: "hoge"
6+
}, void 0, false, {
7+
fileName: "input.js",
8+
lineNumber: 3,
9+
columnNumber: 9
10+
}, this),
11+
/*#__PURE__*/ _jsxDEV("div", {
12+
children: "fuga"
13+
}, void 0, false, {
14+
fileName: "input.js",
15+
lineNumber: 4,
16+
columnNumber: 9
17+
}, this)
18+
]
19+
}, void 0, true);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
const App = (
2+
<>
3+
<div>hoge</div>
4+
<div>fuga</div>
5+
</>
6+
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{ "runtime": "automatic", "development": true }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
const { jsxDEV: _jsxDEV , Fragment: _Fragment } = require("react/jsx-dev-runtime");
2+
const App = /*#__PURE__*/ _jsxDEV(_Fragment, {
3+
children: [
4+
/*#__PURE__*/ _jsxDEV("div", {
5+
children: "hoge"
6+
}, void 0, false, {
7+
fileName: "input.js",
8+
lineNumber: 3,
9+
columnNumber: 9
10+
}, this),
11+
/*#__PURE__*/ _jsxDEV("div", {
12+
children: "fuga"
13+
}, void 0, false, {
14+
fileName: "input.js",
15+
lineNumber: 4,
16+
columnNumber: 9
17+
}, this)
18+
]
19+
}, void 0, true);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/**@jsxRuntime automatic */
2+
const App = (
3+
<div>
4+
<div />
5+
<>
6+
<div>hoge</div>
7+
</>
8+
</div>
9+
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{ "development": true }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**@jsxRuntime automatic */ const { jsxDEV: _jsxDEV , Fragment: _Fragment } = require("react/jsx-dev-runtime");
2+
const App = /*#__PURE__*/ _jsxDEV("div", {
3+
children: [
4+
/*#__PURE__*/ _jsxDEV("div", {}, void 0, false, {
5+
fileName: "input.js",
6+
lineNumber: 4,
7+
columnNumber: 9
8+
}, this),
9+
/*#__PURE__*/ _jsxDEV(_Fragment, {
10+
children: /*#__PURE__*/ _jsxDEV("div", {
11+
children: "hoge"
12+
}, void 0, false, {
13+
fileName: "input.js",
14+
lineNumber: 6,
15+
columnNumber: 13
16+
}, this)
17+
}, void 0, false)
18+
]
19+
}, void 0, true, {
20+
fileName: "input.js",
21+
lineNumber: 3,
22+
columnNumber: 5
23+
}, this);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// https://github.com/babel/babel/issues/12522
2+
3+
require("react-app-polyfill/ie11");
4+
require("react-app-polyfill/stable");
5+
const ReactDOM = require("react-dom");
6+
7+
ReactDOM.render(<p>Hello, World!</p>, document.getElementById("root"));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{ "runtime": "automatic" }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// https://github.com/babel/babel/issues/12522
2+
const { jsx: _jsx } = require("react/jsx-runtime");
3+
require("react-app-polyfill/ie11");
4+
require("react-app-polyfill/stable");
5+
const ReactDOM = require("react-dom");
6+
ReactDOM.render(/*#__PURE__*/ _jsx("p", {
7+
children: "Hello, World!"
8+
}), document.getElementById("root"));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
var x = (
2+
<>
3+
<div>
4+
<div key="1" />
5+
<div key="2" meow="wolf" />
6+
<div key="3" />
7+
<div {...props} key="4" />
8+
</div>
9+
</>
10+
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{ "runtime": "automatic" }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
const { jsx: _jsx , jsxs: _jsxs , Fragment: _Fragment } = require("react/jsx-runtime");
2+
const { createElement: _createElement } = require("react");
3+
var x = /*#__PURE__*/ _jsx(_Fragment, {
4+
children: /*#__PURE__*/ _jsxs("div", {
5+
children: [
6+
/*#__PURE__*/ _jsx("div", {}, "1"),
7+
/*#__PURE__*/ _jsx("div", {
8+
meow: "wolf"
9+
}, "2"),
10+
/*#__PURE__*/ _jsx("div", {}, "3"),
11+
/*#__PURE__*/ _createElement("div", {
12+
...props,
13+
key: "4"
14+
})
15+
]
16+
})
17+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const Bar = () => {
2+
const Foo = () => {
3+
const Component = ({ thing, ..._react }) => {
4+
if (!thing) {
5+
var _react2 = "something useless";
6+
var b = _react3();
7+
var c = _react5();
8+
var jsx = 1;
9+
var _jsx = 2;
10+
return <div />;
11+
}
12+
return <span />;
13+
};
14+
};
15+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{ "runtime": "automatic" }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
const { jsx: _jsx } = require("react/jsx-runtime");
2+
const Bar = ()=>{
3+
const Foo = ()=>{
4+
const Component = ({ thing , ..._react })=>{
5+
if (!thing) {
6+
var _react2 = "something useless";
7+
var b = _react3();
8+
var c = _react5();
9+
var jsx = 1;
10+
var _jsx1 = 2;
11+
return /*#__PURE__*/ _jsx("div", {});
12+
}
13+
return /*#__PURE__*/ _jsx("span", {});
14+
};
15+
};
16+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{ "runtime": "automatic" }

1 commit comments

Comments
 (1)

github-actions[bot] commented on Mar 27, 2023

@github-actions[bot]

Benchmark

Benchmark suite Current: 05a2815 Previous: 5e58b3e Ratio
es/full/bugs-1 286166 ns/iter (± 15485) 321166 ns/iter (± 9915) 0.89
es/full/minify/libraries/antd 1543084670 ns/iter (± 18233636) 1696865161 ns/iter (± 21535551) 0.91
es/full/minify/libraries/d3 296337470 ns/iter (± 5455452) 313692167 ns/iter (± 6256167) 0.94
es/full/minify/libraries/echarts 1223230043 ns/iter (± 14589295) 1296385284 ns/iter (± 8905118) 0.94
es/full/minify/libraries/jquery 91280937 ns/iter (± 824052) 93143658 ns/iter (± 965435) 0.98
es/full/minify/libraries/lodash 106991231 ns/iter (± 1803421) 107692497 ns/iter (± 648653) 0.99
es/full/minify/libraries/moment 53406124 ns/iter (± 729148) 53019876 ns/iter (± 389759) 1.01
es/full/minify/libraries/react 19099732 ns/iter (± 202787) 19415099 ns/iter (± 123640) 0.98
es/full/minify/libraries/terser 248350503 ns/iter (± 3862224) 262504666 ns/iter (± 4313641) 0.95
es/full/minify/libraries/three 450547656 ns/iter (± 3810626) 468573847 ns/iter (± 6154713) 0.96
es/full/minify/libraries/typescript 2952506531 ns/iter (± 17589907) 3157176870 ns/iter (± 25110170) 0.94
es/full/minify/libraries/victory 679908761 ns/iter (± 22557648) 710493550 ns/iter (± 12366296) 0.96
es/full/minify/libraries/vue 130657592 ns/iter (± 1956663) 135678896 ns/iter (± 3469723) 0.96
es/full/codegen/es3 28185 ns/iter (± 175) 28842 ns/iter (± 61) 0.98
es/full/codegen/es5 28232 ns/iter (± 99) 28944 ns/iter (± 32) 0.98
es/full/codegen/es2015 28211 ns/iter (± 67) 28943 ns/iter (± 54) 0.97
es/full/codegen/es2016 28232 ns/iter (± 69) 28977 ns/iter (± 40) 0.97
es/full/codegen/es2017 28295 ns/iter (± 50) 28983 ns/iter (± 41) 0.98
es/full/codegen/es2018 28192 ns/iter (± 57) 29007 ns/iter (± 108) 0.97
es/full/codegen/es2019 28229 ns/iter (± 75) 28930 ns/iter (± 62) 0.98
es/full/codegen/es2020 28245 ns/iter (± 58) 28916 ns/iter (± 31) 0.98
es/full/all/es3 181033595 ns/iter (± 2429937) 183049960 ns/iter (± 3149603) 0.99
es/full/all/es5 170024824 ns/iter (± 2683427) 173836522 ns/iter (± 5615868) 0.98
es/full/all/es2015 135054447 ns/iter (± 2890752) 136937388 ns/iter (± 3523173) 0.99
es/full/all/es2016 133665622 ns/iter (± 1884542) 136855340 ns/iter (± 1226229) 0.98
es/full/all/es2017 131329988 ns/iter (± 2846115) 135492180 ns/iter (± 1544865) 0.97
es/full/all/es2018 128086947 ns/iter (± 1014312) 130228192 ns/iter (± 1955189) 0.98
es/full/all/es2019 125727742 ns/iter (± 1614292) 127531131 ns/iter (± 2627234) 0.99
es/full/all/es2020 118660944 ns/iter (± 804444) 119261666 ns/iter (± 2563132) 0.99
es/full/parser 529893 ns/iter (± 9136) 530885 ns/iter (± 8816) 1.00
es/full/base/fixer 22346 ns/iter (± 23) 22268 ns/iter (± 58) 1.00
es/full/base/resolver_and_hygiene 83652 ns/iter (± 124) 83013 ns/iter (± 81) 1.01
serialization of serde 130 ns/iter (± 0) 131 ns/iter (± 0) 0.99
css/minify/libraries/bootstrap 28527350 ns/iter (± 87830) 29157784 ns/iter (± 181940) 0.98
css/visitor/compare/clone 2088044 ns/iter (± 18958) 2116153 ns/iter (± 14182) 0.99
css/visitor/compare/visit_mut_span 2248870 ns/iter (± 5201) 2319363 ns/iter (± 8713) 0.97
css/visitor/compare/visit_mut_span_panic 2324306 ns/iter (± 4042) 2329788 ns/iter (± 8009) 1.00
css/visitor/compare/fold_span 3072586 ns/iter (± 29319) 3070910 ns/iter (± 28022) 1.00
css/visitor/compare/fold_span_panic 3191617 ns/iter (± 20953) 3212730 ns/iter (± 36358) 0.99
css/lexer/bootstrap_5_1_3 5159365 ns/iter (± 18311) 5168666 ns/iter (± 47299) 1.00
css/lexer/foundation_6_7_4 4386063 ns/iter (± 2657) 4354804 ns/iter (± 2481) 1.01
css/lexer/tailwind_3_1_1 833038 ns/iter (± 552) 829740 ns/iter (± 556) 1.00
css/parser/bootstrap_5_1_3 21960986 ns/iter (± 78217) 22336897 ns/iter (± 127454) 0.98
css/parser/foundation_6_7_4 17469137 ns/iter (± 29803) 17668465 ns/iter (± 67392) 0.99
css/parser/tailwind_3_1_1 3334509 ns/iter (± 4936) 3336438 ns/iter (± 21971) 1.00
es/codegen/colors 327689 ns/iter (± 184517) 319184 ns/iter (± 178600) 1.03
es/codegen/large 1216705 ns/iter (± 614071) 1219426 ns/iter (± 622306) 1.00
es/codegen/with-parser/colors 47497 ns/iter (± 337) 46872 ns/iter (± 281) 1.01
es/codegen/with-parser/large 514271 ns/iter (± 918) 521006 ns/iter (± 6828) 0.99
es/minify/libraries/antd 1359479667 ns/iter (± 11280520) 1522420124 ns/iter (± 25776815) 0.89
es/minify/libraries/d3 265851221 ns/iter (± 3370610) 284018759 ns/iter (± 4143792) 0.94
es/minify/libraries/echarts 1066883398 ns/iter (± 7216198) 1138477782 ns/iter (± 9822477) 0.94
es/minify/libraries/jquery 80453409 ns/iter (± 869798) 82673836 ns/iter (± 669631) 0.97
es/minify/libraries/lodash 95718585 ns/iter (± 2094633) 101185029 ns/iter (± 1125005) 0.95
es/minify/libraries/moment 46443692 ns/iter (± 392193) 47915011 ns/iter (± 1374721) 0.97
es/minify/libraries/react 17400288 ns/iter (± 236821) 17631394 ns/iter (± 895074) 0.99
es/minify/libraries/terser 224126661 ns/iter (± 2526292) 227296954 ns/iter (± 2097549) 0.99
es/minify/libraries/three 383293868 ns/iter (± 6556151) 402899473 ns/iter (± 3969379) 0.95
es/minify/libraries/typescript 2502044579 ns/iter (± 11658688) 2665350947 ns/iter (± 18873397) 0.94
es/minify/libraries/victory 574791298 ns/iter (± 12135616) 624843143 ns/iter (± 9730967) 0.92
es/minify/libraries/vue 116773786 ns/iter (± 2775983) 118182178 ns/iter (± 686052) 0.99
es/visitor/compare/clone 2278690 ns/iter (± 12423) 2327502 ns/iter (± 8823) 0.98
es/visitor/compare/visit_mut_span 2663724 ns/iter (± 14370) 2705698 ns/iter (± 11687) 0.98
es/visitor/compare/visit_mut_span_panic 2732186 ns/iter (± 14752) 2724638 ns/iter (± 14923) 1.00
es/visitor/compare/fold_span 3800752 ns/iter (± 13652) 3846202 ns/iter (± 33190) 0.99
es/visitor/compare/fold_span_panic 3976919 ns/iter (± 20207) 4025253 ns/iter (± 28468) 0.99
es/lexer/colors 15474 ns/iter (± 13) 15366 ns/iter (± 9) 1.01
es/lexer/angular 7502821 ns/iter (± 5728) 7481608 ns/iter (± 2054) 1.00
es/lexer/backbone 964795 ns/iter (± 414) 954148 ns/iter (± 428) 1.01
es/lexer/jquery 5404499 ns/iter (± 1864) 5381144 ns/iter (± 3188) 1.00
es/lexer/jquery mobile 8342515 ns/iter (± 5922) 8292624 ns/iter (± 4725) 1.01
es/lexer/mootools 4264017 ns/iter (± 2618) 4254264 ns/iter (± 3245) 1.00
es/lexer/underscore 807891 ns/iter (± 334) 802347 ns/iter (± 616) 1.01
es/lexer/three 25389681 ns/iter (± 39511) 25377846 ns/iter (± 55789) 1.00
es/lexer/yui 4613323 ns/iter (± 1311) 4592482 ns/iter (± 3715) 1.00
es/parser/colors 29566 ns/iter (± 42) 29254 ns/iter (± 81) 1.01
es/parser/angular 15965980 ns/iter (± 265989) 15633597 ns/iter (± 165972) 1.02
es/parser/backbone 2196965 ns/iter (± 10624) 2197989 ns/iter (± 7020) 1.00
es/parser/jquery 12311797 ns/iter (± 106232) 12315066 ns/iter (± 209245) 1.00
es/parser/jquery mobile 19923757 ns/iter (± 350753) 20206127 ns/iter (± 515772) 0.99
es/parser/mootools 9197569 ns/iter (± 38435) 9125385 ns/iter (± 45383) 1.01
es/parser/underscore 1862669 ns/iter (± 9920) 1863137 ns/iter (± 10863) 1.00
es/parser/three 56261470 ns/iter (± 284307) 56737017 ns/iter (± 224822) 0.99
es/parser/yui 9378293 ns/iter (± 102851) 9310638 ns/iter (± 80911) 1.01
es/preset-env/usage/builtin_type 140989 ns/iter (± 33530) 142176 ns/iter (± 32564) 0.99
es/preset-env/usage/property 20827 ns/iter (± 88) 21142 ns/iter (± 92) 0.99
es/resolver/typescript 118238098 ns/iter (± 2807283) 124986356 ns/iter (± 1614793) 0.95
es/fixer/typescript 79606479 ns/iter (± 1240222) 88100644 ns/iter (± 2561498) 0.90
es/hygiene/typescript 167954784 ns/iter (± 1230164) 183790986 ns/iter (± 1352309) 0.91
es/resolver_with_hygiene/typescript 319740106 ns/iter (± 1956497) 327934195 ns/iter (± 2211042) 0.98
es/visitor/base-perf/module_clone 79571 ns/iter (± 1405) 80176 ns/iter (± 1203) 0.99
es/visitor/base-perf/fold_empty 88331 ns/iter (± 1370) 90516 ns/iter (± 1356) 0.98
es/visitor/base-perf/fold_noop_impl_all 90131 ns/iter (± 1871) 90146 ns/iter (± 1309) 1.00
es/visitor/base-perf/fold_noop_impl_vec 91029 ns/iter (± 1285) 90908 ns/iter (± 1204) 1.00
es/visitor/base-perf/boxing_boxed_clone 56 ns/iter (± 0) 59 ns/iter (± 0) 0.95
es/visitor/base-perf/boxing_unboxed_clone 53 ns/iter (± 0) 53 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 101 ns/iter (± 0) 104 ns/iter (± 0) 0.97
es/visitor/base-perf/boxing_unboxed 97 ns/iter (± 0) 100 ns/iter (± 0) 0.97
es/visitor/base-perf/visit_contains_this 3617 ns/iter (± 48) 3473 ns/iter (± 57) 1.04
es/base/parallel/resolver/typescript 6736891945 ns/iter (± 444399279) 6747873954 ns/iter (± 367723472) 1.00
es/base/parallel/hygiene/typescript 1971385546 ns/iter (± 23498942) 2149697465 ns/iter (± 20697184) 0.92
misc/visitors/time-complexity/time 5 91 ns/iter (± 0) 97 ns/iter (± 0) 0.94
misc/visitors/time-complexity/time 10 290 ns/iter (± 4) 295 ns/iter (± 1) 0.98
misc/visitors/time-complexity/time 15 638 ns/iter (± 7) 608 ns/iter (± 25) 1.05
misc/visitors/time-complexity/time 20 1125 ns/iter (± 14) 1138 ns/iter (± 10) 0.99
misc/visitors/time-complexity/time 40 5780 ns/iter (± 44) 6019 ns/iter (± 18) 0.96
misc/visitors/time-complexity/time 60 12859 ns/iter (± 8) 15181 ns/iter (± 47) 0.85
es/full-target/es2016 251233 ns/iter (± 1175) 250498 ns/iter (± 407) 1.00
es/full-target/es2017 243531 ns/iter (± 459) 242543 ns/iter (± 389) 1.00
es/full-target/es2018 232733 ns/iter (± 466) 230954 ns/iter (± 445) 1.01
es2020_nullish_coalescing 91252 ns/iter (± 558) 90560 ns/iter (± 261) 1.01
es2020_optional_chaining 124061 ns/iter (± 268) 124043 ns/iter (± 528) 1.00
es2022_class_properties 148462 ns/iter (± 332) 146017 ns/iter (± 210) 1.02
es2018_object_rest_spread 95164 ns/iter (± 132) 94724 ns/iter (± 257) 1.00
es2019_optional_catch_binding 84714 ns/iter (± 209) 83861 ns/iter (± 181) 1.01
es2017_async_to_generator 85507 ns/iter (± 157) 85012 ns/iter (± 262) 1.01
es2016_exponentiation 89605 ns/iter (± 185) 88882 ns/iter (± 233) 1.01
es2015_arrow 94039 ns/iter (± 289) 93027 ns/iter (± 147) 1.01
es2015_block_scoped_fn 90948 ns/iter (± 288) 90537 ns/iter (± 260) 1.00
es2015_block_scoping 169621 ns/iter (± 400) 168304 ns/iter (± 331) 1.01

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

Please sign in to comment.