2021-10-10 07:25:15 +02:00
|
|
|
use next_swc::{
|
|
|
|
amp_attributes::amp_attributes, next_dynamic::next_dynamic, next_ssg::next_ssg,
|
|
|
|
styled_jsx::styled_jsx,
|
|
|
|
};
|
2021-08-03 14:02:23 +02:00
|
|
|
use std::path::PathBuf;
|
2021-10-17 09:50:01 +02:00
|
|
|
use swc_common::{chain, comments::SingleThreadedComments, FileName, Mark, Span, DUMMY_SP};
|
2021-08-03 14:02:23 +02:00
|
|
|
use swc_ecma_transforms_testing::{test, test_fixture};
|
|
|
|
use swc_ecmascript::{
|
2021-09-13 13:37:07 +02:00
|
|
|
parser::{EsConfig, Syntax},
|
2021-10-17 12:17:13 +02:00
|
|
|
transforms::{react::jsx, resolver},
|
2021-10-17 09:50:01 +02:00
|
|
|
visit::as_folder,
|
2021-08-03 14:02:23 +02:00
|
|
|
};
|
|
|
|
use testing::fixture;
|
|
|
|
|
|
|
|
fn syntax() -> Syntax {
|
2021-09-13 13:37:07 +02:00
|
|
|
Syntax::Es(EsConfig {
|
|
|
|
jsx: true,
|
|
|
|
dynamic_import: true,
|
|
|
|
..Default::default()
|
|
|
|
})
|
2021-08-03 18:54:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#[fixture("tests/fixture/amp/**/input.js")]
|
|
|
|
fn amp_attributes_fixture(input: PathBuf) {
|
2021-09-13 13:37:07 +02:00
|
|
|
let output = input.parent().unwrap().join("output.js");
|
|
|
|
test_fixture(syntax(), &|_tr| amp_attributes(), &input, &output);
|
2021-08-03 14:02:23 +02:00
|
|
|
}
|
|
|
|
|
2021-08-06 18:53:32 +02:00
|
|
|
#[fixture("tests/fixture/next-dynamic/**/input.js")]
|
|
|
|
fn next_dynamic_fixture(input: PathBuf) {
|
2021-09-13 13:37:07 +02:00
|
|
|
let output = input.parent().unwrap().join("output.js");
|
|
|
|
test_fixture(
|
|
|
|
syntax(),
|
|
|
|
&|_tr| {
|
|
|
|
next_dynamic(
|
|
|
|
FileName::Real(PathBuf::from("/some-project/src/some-file.js")),
|
|
|
|
Some("/some-project/src".into()),
|
|
|
|
)
|
|
|
|
},
|
|
|
|
&input,
|
|
|
|
&output,
|
|
|
|
);
|
2021-08-06 18:53:32 +02:00
|
|
|
}
|
|
|
|
|
2021-08-03 14:02:23 +02:00
|
|
|
#[fixture("tests/fixture/ssg/**/input.js")]
|
|
|
|
fn next_ssg_fixture(input: PathBuf) {
|
2021-09-13 13:37:07 +02:00
|
|
|
let output = input.parent().unwrap().join("output.js");
|
|
|
|
test_fixture(
|
|
|
|
syntax(),
|
|
|
|
&|tr| {
|
2021-10-07 12:11:53 +02:00
|
|
|
let top_level_mark = Mark::fresh(Mark::root());
|
2021-09-13 13:37:07 +02:00
|
|
|
let jsx = jsx::<SingleThreadedComments>(
|
|
|
|
tr.cm.clone(),
|
|
|
|
None,
|
|
|
|
swc_ecmascript::transforms::react::Options {
|
|
|
|
next: false,
|
|
|
|
runtime: None,
|
|
|
|
import_source: "".into(),
|
|
|
|
pragma: "__jsx".into(),
|
|
|
|
pragma_frag: "__jsxFrag".into(),
|
|
|
|
throw_if_namespace: false,
|
|
|
|
development: false,
|
|
|
|
use_builtins: true,
|
|
|
|
use_spread: true,
|
|
|
|
refresh: Default::default(),
|
|
|
|
},
|
2021-10-07 12:11:53 +02:00
|
|
|
top_level_mark,
|
2021-09-13 13:37:07 +02:00
|
|
|
);
|
|
|
|
chain!(next_ssg(), jsx)
|
2021-08-03 14:02:23 +02:00
|
|
|
},
|
2021-09-13 13:37:07 +02:00
|
|
|
&input,
|
|
|
|
&output,
|
|
|
|
);
|
2021-08-03 14:02:23 +02:00
|
|
|
}
|
2021-09-15 09:24:31 +02:00
|
|
|
|
|
|
|
#[fixture("tests/fixture/styled-jsx/**/input.js")]
|
|
|
|
fn styled_jsx_fixture(input: PathBuf) {
|
2021-09-16 15:08:42 +02:00
|
|
|
let output = input.parent().unwrap().join("output.js");
|
2021-10-17 12:17:13 +02:00
|
|
|
test_fixture(
|
|
|
|
syntax(),
|
|
|
|
&|_tr| chain!(resolver(), styled_jsx()),
|
|
|
|
&input,
|
|
|
|
&output,
|
|
|
|
);
|
2021-09-15 09:24:31 +02:00
|
|
|
}
|
2021-10-17 09:50:01 +02:00
|
|
|
|
|
|
|
pub struct DropSpan;
|
|
|
|
impl swc_ecmascript::visit::VisitMut for DropSpan {
|
|
|
|
fn visit_mut_span(&mut self, span: &mut Span) {
|
|
|
|
*span = DUMMY_SP
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Hash of styled-jsx should not depend on the span of expressions.
|
|
|
|
#[fixture("tests/fixture/styled-jsx/**/input.js")]
|
|
|
|
fn styled_jsx_span_should_not_affect_hash(input: PathBuf) {
|
|
|
|
let output = input.parent().unwrap().join("output.js");
|
|
|
|
test_fixture(
|
|
|
|
syntax(),
|
2021-10-17 12:17:13 +02:00
|
|
|
&|_tr| {
|
|
|
|
// `resolver` uses `Mark` which is stored in a thread-local storage (namely
|
|
|
|
// swc_common::GLOBALS), and this loop will make `Mark` to be different from the
|
2021-10-19 09:16:59 +02:00
|
|
|
// invocation above.
|
2021-10-17 12:17:13 +02:00
|
|
|
//
|
|
|
|
// 1000 is used because in future I (kdy1) may optimize logic of resolver.
|
|
|
|
for _ in 0..1000 {
|
|
|
|
let _mark = Mark::fresh(Mark::root());
|
|
|
|
}
|
|
|
|
|
|
|
|
chain!(as_folder(DropSpan), resolver(), styled_jsx())
|
|
|
|
},
|
2021-10-17 09:50:01 +02:00
|
|
|
&input,
|
|
|
|
&output,
|
|
|
|
);
|
|
|
|
}
|