Files
Arian Tron 61f56f997c
Some checks failed
Test examples / Test Examples (20) (push) Has been cancelled
Test examples / Test Examples (22) (push) Has been cancelled
Lock Threads / action (push) Has been cancelled
Trigger Release / start (push) Has been cancelled
Stale issue handler / stale (push) Has been cancelled
Update Font Data / create-pull-request (push) Has been cancelled
build-and-deploy / deploy-target (push) Has been cancelled
build-and-deploy / build (push) Has been cancelled
build-and-deploy / stable - aarch64-unknown-linux-musl - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-unknown-linux-musl - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-unknown-linux-gnu - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-unknown-linux-gnu - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-pc-windows-msvc - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-pc-windows-msvc - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-apple-darwin - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-apple-darwin - node@16 (push) Has been cancelled
build-and-deploy / build-wasm (nodejs) (push) Has been cancelled
build-and-deploy / build-wasm (web) (push) Has been cancelled
build-and-deploy / Deploy preview tarball (push) Has been cancelled
build-and-deploy / Potentially publish release (push) Has been cancelled
build-and-deploy / publish-turbopack-npm-packages (push) Has been cancelled
build-and-deploy / Deploy examples (push) Has been cancelled
build-and-deploy / thank you, build (push) Has been cancelled
build-and-deploy / Upload Turbopack Bytesize metrics to Datadog (push) Has been cancelled
Rspack Next.js development integration tests / Rspack integration tests (push) Has been cancelled
Rspack Next.js production integration tests / Rspack integration tests (push) Has been cancelled
Turbopack Next.js development integration tests / Next.js integration tests (push) Has been cancelled
Turbopack Next.js production integration tests / Next.js integration tests (push) Has been cancelled
Update Rspack test manifest / Update and upload Rspack development test manifest (push) Has been cancelled
Update Rspack test manifest / Update and upload Rspack production test manifest (push) Has been cancelled
Upload bundler test manifests to areweturboyet.com / Upload test results (push) Has been cancelled
Update React / create-pull-request (push) Has been cancelled
test-e2e-project-reset-cron / reset-test-project (push) Has been cancelled
Notify about the top 15 issues/PRs/feature requests (most reacted) in the last 90 days / run (push) Has been cancelled
first commit
2026-03-10 19:37:31 +03:30

1000 lines
31 KiB
Rust

use std::{
env::current_dir,
iter::FromIterator,
path::{Path, PathBuf},
};
use bytes_str::BytesStr;
use next_custom_transforms::transforms::{
cjs_optimizer::cjs_optimizer,
debug_fn_name::debug_fn_name,
debug_instant_stack::debug_instant_stack,
dynamic::{NextDynamicMode, next_dynamic},
fonts::{Config as FontLoaderConfig, next_font_loaders},
named_import_transform::named_import_transform,
next_ssg::next_ssg,
optimize_barrel::optimize_barrel,
optimize_server_react::{self, optimize_server_react},
pure::pure_magic,
react_server_components::server_components,
server_actions::{self, ServerActionsMode, server_actions},
shake_exports::{Config as ShakeExportsConfig, shake_exports},
strip_page_exports::{ExportFilter, next_transform_strip_page_exports},
track_dynamic_imports::track_dynamic_imports,
warn_for_edge_runtime::warn_for_edge_runtime,
};
use rustc_hash::FxHashSet;
use serde::de::DeserializeOwned;
use swc_core::{
atoms::atom,
common::{FileName, Mark, SyntaxContext, comments::SingleThreadedComments},
ecma::{
ast::Pass,
parser::{EsSyntax, Syntax, TsSyntax},
transforms::{
base::resolver,
react::jsx,
testing::{FixtureTestConfig, test_fixture},
},
utils::ExprCtx,
visit::{Visit, visit_mut_pass, visit_pass},
},
};
use swc_relay::{RelayLanguageConfig, relay};
use testing::fixture;
fn syntax() -> Syntax {
Syntax::Es(EsSyntax {
jsx: true,
import_attributes: true,
..Default::default()
})
}
#[fixture("tests/fixture/next-dynamic/**/input.js")]
fn next_dynamic_fixture(input: PathBuf) {
let output_dev = input.parent().unwrap().join("output-dev.js");
let output_prod = input.parent().unwrap().join("output-prod.js");
let output_server = input.parent().unwrap().join("output-server.js");
let output_turbo_dev = input.parent().unwrap().join("output-turbo-dev.js");
let output_turbo_prod = input.parent().unwrap().join("output-turbo-prod.js");
let output_turbo_server = input.parent().unwrap().join("output-turbo-server.js");
test_fixture(
syntax(),
&|_tr| {
next_dynamic(
true,
false,
false,
false,
NextDynamicMode::Webpack,
FileName::Real(PathBuf::from("/some-project/src/some-file.js")).into(),
Some("/some-project/src".into()),
)
},
&input,
&output_dev,
Default::default(),
);
test_fixture(
syntax(),
&|_tr| {
next_dynamic(
false,
false,
false,
false,
NextDynamicMode::Webpack,
FileName::Real(PathBuf::from("/some-project/src/some-file.js")).into(),
Some("/some-project/src".into()),
)
},
&input,
&output_prod,
Default::default(),
);
test_fixture(
syntax(),
&|_tr| {
next_dynamic(
false,
true,
false,
false,
NextDynamicMode::Webpack,
FileName::Real(PathBuf::from("/some-project/src/some-file.js")).into(),
Some("/some-project/src".into()),
)
},
&input,
&output_server,
Default::default(),
);
test_fixture(
syntax(),
&|_tr| {
next_dynamic(
true,
false,
false,
false,
NextDynamicMode::Turbopack {
dynamic_client_transition_name: atom!("next-client-dynamic"),
dynamic_transition_name: atom!("next-dynamic"),
},
FileName::Real(PathBuf::from("/some-project/src/some-file.js")).into(),
Some("/some-project/src".into()),
)
},
&input,
&output_turbo_dev,
Default::default(),
);
test_fixture(
syntax(),
&|_tr| {
next_dynamic(
false,
false,
false,
false,
NextDynamicMode::Turbopack {
dynamic_client_transition_name: atom!("next-client-dynamic"),
dynamic_transition_name: atom!("next-dynamic"),
},
FileName::Real(PathBuf::from("/some-project/src/some-file.js")).into(),
Some("/some-project/src".into()),
)
},
&input,
&output_turbo_prod,
Default::default(),
);
test_fixture(
syntax(),
&|_tr| {
next_dynamic(
false,
true,
false,
false,
NextDynamicMode::Turbopack {
dynamic_client_transition_name: atom!("next-client-dynamic"),
dynamic_transition_name: atom!("next-dynamic"),
},
FileName::Real(PathBuf::from("/some-project/src/some-file.js")).into(),
Some("/some-project/src".into()),
)
},
&input,
&output_turbo_server,
Default::default(),
);
}
#[fixture("tests/fixture/next-dynamic-app-dir/**/input.js")]
fn app_dir_next_dynamic_fixture(input: PathBuf) {
let output_dev = input.parent().unwrap().join("output-dev.js");
let output_prod = input.parent().unwrap().join("output-prod.js");
let output_server: PathBuf = input.parent().unwrap().join("output-server.js");
let output_server_client_layer = input
.parent()
.unwrap()
.join("output-server-client-layer.js");
let output_turbo_dev = input.parent().unwrap().join("output-turbo-dev.js");
let output_turbo_prod = input.parent().unwrap().join("output-turbo-prod.js");
let output_turbo_server: PathBuf = input.parent().unwrap().join("output-turbo-server.js");
let output_turbo_server_client_layer = input
.parent()
.unwrap()
.join("output-turbo-server-client-layer.js");
test_fixture(
syntax(),
&|_tr| {
next_dynamic(
true,
false,
true,
false,
NextDynamicMode::Webpack,
FileName::Real(PathBuf::from("/some-project/src/some-file.js")).into(),
Some("/some-project/src".into()),
)
},
&input,
&output_dev,
Default::default(),
);
test_fixture(
syntax(),
&|_tr| {
next_dynamic(
false,
false,
true,
false,
NextDynamicMode::Webpack,
FileName::Real(PathBuf::from("/some-project/src/some-file.js")).into(),
Some("/some-project/src".into()),
)
},
&input,
&output_prod,
Default::default(),
);
test_fixture(
syntax(),
&|_tr| {
next_dynamic(
false,
true,
true,
false,
NextDynamicMode::Webpack,
FileName::Real(PathBuf::from("/some-project/src/some-file.js")).into(),
Some("/some-project/src".into()),
)
},
&input,
&output_server,
Default::default(),
);
test_fixture(
syntax(),
&|_tr| {
next_dynamic(
false,
true,
false,
false,
NextDynamicMode::Webpack,
FileName::Real(PathBuf::from("/some-project/src/some-file.js")).into(),
Some("/some-project/src".into()),
)
},
&input,
&output_server_client_layer,
Default::default(),
);
test_fixture(
syntax(),
&|_tr| {
next_dynamic(
true,
false,
true,
false,
NextDynamicMode::Turbopack {
dynamic_client_transition_name: atom!("next-client-dynamic"),
dynamic_transition_name: atom!("next-dynamic"),
},
FileName::Real(PathBuf::from("/some-project/src/some-file.js")).into(),
Some("/some-project/src".into()),
)
},
&input,
&output_turbo_dev,
Default::default(),
);
test_fixture(
syntax(),
&|_tr| {
next_dynamic(
false,
false,
true,
false,
NextDynamicMode::Turbopack {
dynamic_client_transition_name: atom!("next-client-dynamic"),
dynamic_transition_name: atom!("next-dynamic"),
},
FileName::Real(PathBuf::from("/some-project/src/some-file.js")).into(),
Some("/some-project/src".into()),
)
},
&input,
&output_turbo_prod,
Default::default(),
);
test_fixture(
syntax(),
&|_tr| {
next_dynamic(
false,
true,
true,
false,
NextDynamicMode::Turbopack {
dynamic_client_transition_name: atom!("next-client-dynamic"),
dynamic_transition_name: atom!("next-dynamic"),
},
FileName::Real(PathBuf::from("/some-project/src/some-file.js")).into(),
Some("/some-project/src".into()),
)
},
&input,
&output_turbo_server,
Default::default(),
);
test_fixture(
syntax(),
&|_tr| {
next_dynamic(
false,
true,
false,
false,
NextDynamicMode::Turbopack {
dynamic_client_transition_name: atom!("next-client-dynamic"),
dynamic_transition_name: atom!("next-dynamic"),
},
FileName::Real(PathBuf::from("/some-project/src/some-file.js")).into(),
Some("/some-project/src".into()),
)
},
&input,
&output_turbo_server_client_layer,
Default::default(),
);
}
#[fixture("tests/fixture/ssg/**/input.js")]
fn next_ssg_fixture(input: PathBuf) {
let output = input.parent().unwrap().join("output.js");
test_fixture(
syntax(),
&|tr| {
let top_level_mark = Mark::fresh(Mark::root());
let unresolved_mark = Mark::fresh(Mark::root());
let jsx = jsx::<SingleThreadedComments>(
tr.cm.clone(),
None,
swc_core::ecma::transforms::react::Options {
next: false.into(),
runtime: None,
import_source: Some("".into()),
pragma: Some(BytesStr::from_str_slice("__jsx")),
pragma_frag: Some(BytesStr::from_str_slice("__jsxFrag")),
throw_if_namespace: false.into(),
development: false.into(),
refresh: Default::default(),
..Default::default()
},
top_level_mark,
unresolved_mark,
);
(
resolver(unresolved_mark, top_level_mark, true),
next_ssg(Default::default()),
jsx,
)
},
&input,
&output,
Default::default(),
);
}
#[fixture("tests/fixture/relay/**/input.ts*")]
fn relay_no_artifact_dir_fixture(input: PathBuf) {
let output = input.parent().unwrap().join("output.js");
test_fixture(
syntax(),
&|_tr| {
let config = swc_relay::Config {
language: RelayLanguageConfig::TypeScript,
artifact_directory: Some(PathBuf::from("__generated__")),
..Default::default()
};
relay(
config.into(),
FileName::Real(PathBuf::from("input.tsx")),
current_dir().unwrap(),
Some(PathBuf::from("src/pages")),
None,
)
},
&input,
&output,
Default::default(),
);
}
#[fixture("tests/fixture/shake-exports/most-usecases/input.js")]
fn shake_exports_fixture(input: PathBuf) {
let output = input.parent().unwrap().join("output.js");
test_fixture(
syntax(),
&|_tr| {
shake_exports(ShakeExportsConfig {
ignore: vec![
String::from("keep").into(),
String::from("keep1").into(),
String::from("keep2").into(),
String::from("keep3").into(),
String::from("keep4").into(),
String::from("keep5").into(),
],
})
},
&input,
&output,
Default::default(),
);
}
#[fixture("tests/fixture/shake-exports/keep-default/input.js")]
fn shake_exports_fixture_default(input: PathBuf) {
let output = input.parent().unwrap().join("output.js");
test_fixture(
syntax(),
&|_tr| {
shake_exports(ShakeExportsConfig {
ignore: vec![String::from("default").into()],
})
},
&input,
&output,
Default::default(),
);
}
#[fixture("tests/fixture/react-server-components/**/input.ts")]
fn react_server_components_typescript(input: PathBuf) {
use next_custom_transforms::transforms::react_server_components::{Config, Options};
let output = input.parent().unwrap().join("output.ts");
test_fixture(
Syntax::Typescript(Default::default()),
&|tr| {
server_components(
FileName::Real(PathBuf::from("/some-project/src/some-file.js")).into(),
Config::WithOptions(Options {
is_react_server_layer: true,
cache_components_enabled: false,
use_cache_enabled: false,
taint_enabled: true,
page_extensions: vec![],
}),
tr.comments.as_ref().clone(),
None,
)
},
&input,
&output,
FixtureTestConfig {
module: Some(true),
..Default::default()
},
);
}
#[fixture("tests/fixture/react-server-components/**/input.js")]
fn react_server_components_fixture(input: PathBuf) {
use next_custom_transforms::transforms::react_server_components::{Config, Options};
let is_react_server_layer = input.iter().any(|s| s.to_str() == Some("server-graph"));
let filename = FileName::Real(PathBuf::from("/some-project/src/some-file.js"));
let output = input.parent().unwrap().join("output.js");
test_fixture(
syntax(),
&|tr| {
let unresolved_mark = Mark::new();
(
// The transforms are intentionally declared in the same order as in
// crates/next-custom-transforms/src/chain_transforms.rs
server_components(
filename.clone().into(),
Config::WithOptions(Options {
is_react_server_layer,
cache_components_enabled: false,
use_cache_enabled: false,
taint_enabled: true,
page_extensions: vec![],
}),
tr.comments.as_ref().clone(),
None,
),
server_actions(
&filename,
None,
server_actions::Config {
is_react_server_layer,
is_development: true,
use_cache_enabled: true,
hash_salt: "".into(),
cache_kinds: FxHashSet::default(),
},
tr.comments.as_ref().clone(),
unresolved_mark,
tr.cm.clone(),
Default::default(),
ServerActionsMode::Webpack,
),
)
},
&input,
&output,
FixtureTestConfig {
module: Some(true),
..Default::default()
},
);
}
#[fixture("tests/fixture/next-font-loaders/**/input.js")]
fn next_font_loaders_fixture(input: PathBuf) {
let output = input.parent().unwrap().join("output.js");
test_fixture(
syntax(),
&|_tr| {
next_font_loaders(FontLoaderConfig {
relative_file_path_from_root: "pages/test.tsx".into(),
font_loaders: vec!["@next/font/google".into(), "cool-fonts".into()],
})
},
&input,
&output,
Default::default(),
);
}
#[fixture("tests/fixture/server-actions/**/input.*")]
fn server_actions_fixture(input: PathBuf) {
let (input_syntax, extension) = match input.extension().and_then(|e| e.to_str()) {
Some("ts") => (Syntax::Typescript(Default::default()), "ts"),
Some("tsx") => (
Syntax::Typescript(TsSyntax {
tsx: true,
..Default::default()
}),
"tsx",
),
_ => (syntax(), "js"),
};
let output = input.parent().unwrap().join(format!("output.{extension}"));
let is_react_server_layer = input.iter().any(|s| s.to_str() == Some("server-graph"));
let is_development = input.iter().any(|s| s.to_str() == Some("development"));
let mode = if input.iter().any(|s| s.to_str() == Some("turbopack")) {
ServerActionsMode::Turbopack
} else {
ServerActionsMode::Webpack
};
test_fixture(
input_syntax,
&|tr| {
let unresolved_mark = Mark::new();
(
resolver(unresolved_mark, Mark::new(), false),
server_actions(
&FileName::Real("/app/item.js".into()),
None,
server_actions::Config {
is_react_server_layer,
is_development,
use_cache_enabled: true,
hash_salt: "".into(),
cache_kinds: FxHashSet::from_iter(["x".into()]),
},
tr.comments.as_ref().clone(),
unresolved_mark,
tr.cm.clone(),
Default::default(),
mode,
),
)
},
&input,
&output,
FixtureTestConfig {
module: Some(true),
..Default::default()
},
);
}
#[fixture("tests/fixture/next-font-with-directive/**/input.js")]
fn next_font_with_directive_fixture(input: PathBuf) {
let output = input.parent().unwrap().join("output.js");
test_fixture(
syntax(),
&|tr| {
let unresolved_mark = Mark::new();
(
resolver(unresolved_mark, Mark::new(), false),
next_font_loaders(FontLoaderConfig {
relative_file_path_from_root: "app/test.tsx".into(),
font_loaders: vec!["@next/font/google".into()],
}),
server_actions(
&FileName::Real("/app/test.tsx".into()),
None,
server_actions::Config {
is_react_server_layer: true,
is_development: true,
use_cache_enabled: true,
hash_salt: "".into(),
cache_kinds: FxHashSet::default(),
},
tr.comments.as_ref().clone(),
unresolved_mark,
tr.cm.clone(),
Default::default(),
ServerActionsMode::Webpack,
),
)
},
&input,
&output,
Default::default(),
);
}
#[fixture("tests/fixture/cjs-optimize/**/input.js")]
fn cjs_optimize_fixture(input: PathBuf) {
let output = input.parent().unwrap().join("output.js");
test_fixture(
syntax(),
&|_tr| {
let unresolved_mark = Mark::new();
let top_level_mark = Mark::new();
let unresolved_ctxt = SyntaxContext::empty().apply_mark(unresolved_mark);
(
resolver(unresolved_mark, top_level_mark, false),
visit_mut_pass(cjs_optimizer(
json(
r#"
{
"packages": {
"next/server": {
"transforms": {
"Response": "next/server/response"
}
}
}
}
"#,
),
unresolved_ctxt,
)),
)
},
&input,
&output,
FixtureTestConfig {
module: Some(true),
..Default::default()
},
);
}
#[fixture("tests/fixture/named-import-transform/**/input.js")]
fn named_import_transform_fixture(input: PathBuf) {
let output = input.parent().unwrap().join("output.js");
test_fixture(
syntax(),
&|_tr| {
let unresolved_mark = Mark::new();
let top_level_mark = Mark::new();
(
resolver(unresolved_mark, top_level_mark, false),
named_import_transform(json(
r#"
{
"packages": ["foo", "bar"]
}
"#,
)),
)
},
&input,
&output,
Default::default(),
);
}
#[fixture("tests/fixture/optimize-barrel/normal/**/input.js")]
fn optimize_barrel_fixture(input: PathBuf) {
let output = input.parent().unwrap().join("output.js");
test_fixture(
syntax(),
&|_tr| {
let unresolved_mark = Mark::new();
let top_level_mark = Mark::new();
(
resolver(unresolved_mark, top_level_mark, false),
optimize_barrel(json(
r#"
{
"wildcard": false
}
"#,
)),
)
},
&input,
&output,
Default::default(),
);
}
#[fixture("tests/fixture/optimize-barrel/wildcard/**/input.js")]
fn optimize_barrel_wildcard_fixture(input: PathBuf) {
let output = input.parent().unwrap().join("output.js");
test_fixture(
syntax(),
&|_tr| {
let unresolved_mark = Mark::new();
let top_level_mark = Mark::new();
(
resolver(unresolved_mark, top_level_mark, false),
optimize_barrel(json(
r#"
{
"wildcard": true
}
"#,
)),
)
},
&input,
&output,
Default::default(),
);
}
#[fixture("tests/fixture/optimize_server_react/**/input.js")]
fn optimize_server_react_fixture(input: PathBuf) {
let output = input.parent().unwrap().join("output.js");
test_fixture(
syntax(),
&|_tr| {
let unresolved_mark = Mark::new();
let top_level_mark = Mark::new();
(
resolver(unresolved_mark, top_level_mark, false),
optimize_server_react(optimize_server_react::Config {
optimize_use_state: true,
}),
)
},
&input,
&output,
Default::default(),
);
}
fn json<T>(s: &str) -> T
where
T: DeserializeOwned,
{
serde_json::from_str(s).expect("failed to deserialize")
}
#[fixture("tests/fixture/pure/**/input.js")]
fn pure(input: PathBuf) {
let output = input.parent().unwrap().join("output.js");
test_fixture(
syntax(),
&|tr| {
let unresolved_mark = Mark::new();
let top_level_mark = Mark::new();
(
resolver(unresolved_mark, top_level_mark, false),
visit_mut_pass(pure_magic(tr.comments.clone())),
)
},
&input,
&output,
Default::default(),
);
}
fn run_strip_page_exports_test(input: &Path, output: &Path, mode: ExportFilter) {
test_fixture(
syntax(),
&|tr| {
let top_level_mark = Mark::fresh(Mark::root());
let unresolved_mark = Mark::fresh(Mark::root());
let jsx = jsx::<SingleThreadedComments>(
tr.cm.clone(),
None,
swc_core::ecma::transforms::react::Options {
next: false.into(),
runtime: None,
import_source: Some("".into()),
pragma: Some(BytesStr::from_str_slice("__jsx")),
pragma_frag: Some(BytesStr::from_str_slice("__jsxFrag")),
throw_if_namespace: false.into(),
development: false.into(),
..Default::default()
},
top_level_mark,
unresolved_mark,
);
(
swc_core::ecma::transforms::base::resolver(unresolved_mark, top_level_mark, true),
next_transform_strip_page_exports(mode, Default::default()),
jsx,
)
},
input,
output,
FixtureTestConfig {
module: Some(true),
..Default::default()
},
);
}
#[fixture("tests/fixture/strip-page-exports/**/output-data.js")]
fn next_transform_strip_page_exports_fixture_data(output: PathBuf) {
let input = output.parent().unwrap().join("input.js");
run_strip_page_exports_test(&input, &output, ExportFilter::StripDefaultExport);
}
#[fixture("tests/fixture/strip-page-exports/**/output-default.js")]
fn next_transform_strip_page_exports_fixture_default(output: PathBuf) {
let input = output.parent().unwrap().join("input.js");
run_strip_page_exports_test(&input, &output, ExportFilter::StripDataExports);
}
#[fixture("tests/fixture/debug-fn-name/**/input.js")]
fn test_debug_name(input: PathBuf) {
let output = input.parent().unwrap().join("output.js");
test_fixture(
syntax(),
&|_| {
let top_level_mark = Mark::fresh(Mark::root());
let unresolved_mark = Mark::fresh(Mark::root());
(
swc_core::ecma::transforms::base::resolver(unresolved_mark, top_level_mark, true),
debug_fn_name(),
)
},
&input,
&output,
Default::default(),
);
}
#[fixture("tests/fixture/debug-instant-stack/**/input.js")]
fn test_debug_instant_stack(input: PathBuf) {
let output = input.parent().unwrap().join("output.js");
test_fixture(
syntax(),
&|_| debug_instant_stack("app/page.js".to_string(), vec![]),
&input,
&output,
FixtureTestConfig {
sourcemap: true,
..Default::default()
},
);
}
#[fixture("tests/fixture/edge-assert/**/input.js")]
fn test_edge_assert(input: PathBuf) {
let output = input.parent().unwrap().join("output.js");
test_fixture(
syntax(),
&|t| {
let top_level_mark = Mark::fresh(Mark::root());
let unresolved_mark = Mark::fresh(Mark::root());
(
swc_core::ecma::transforms::base::resolver(unresolved_mark, top_level_mark, true),
lint_to_fold(warn_for_edge_runtime(
t.cm.clone(),
ExprCtx {
is_unresolved_ref_safe: false,
unresolved_ctxt: SyntaxContext::empty().apply_mark(unresolved_mark),
in_strict: false,
remaining_depth: 4,
},
true,
true,
)),
)
},
&input,
&output,
FixtureTestConfig {
allow_error: true,
module: Some(true),
..Default::default()
},
);
}
#[fixture("tests/fixture/source-maps/**/input.js")]
fn test_source_maps(input: PathBuf) {
let output: PathBuf = input.parent().unwrap().join("output.js");
let is_react_server_layer = input.iter().any(|s| s.to_str() == Some("server-graph"));
let is_development = input.iter().any(|s| s.to_str() == Some("development"));
let mode = if input.iter().any(|s| s.to_str() == Some("turbopack")) {
ServerActionsMode::Turbopack
} else {
ServerActionsMode::Webpack
};
test_fixture(
syntax(),
&|tr| {
let unresolved_mark = Mark::new();
(
resolver(unresolved_mark, Mark::new(), false),
server_actions(
&FileName::Real("/app/item.js".into()),
None,
server_actions::Config {
is_react_server_layer,
is_development,
use_cache_enabled: true,
hash_salt: "".into(),
cache_kinds: FxHashSet::from_iter([]),
},
tr.comments.as_ref().clone(),
unresolved_mark,
tr.cm.clone(),
Default::default(),
mode,
),
)
},
&input,
&output,
FixtureTestConfig {
module: Some(true),
sourcemap: true,
..Default::default()
},
);
}
#[fixture("tests/fixture/track-dynamic-imports/**/input.js")]
fn track_dynamic_imports_fixture(input: PathBuf) {
let output = input.parent().unwrap().join("output.js");
test_fixture(
syntax(),
&|tr| {
let unresolved_mark = Mark::new();
let top_level_mark = Mark::new();
(
resolver(unresolved_mark, top_level_mark, false),
track_dynamic_imports(unresolved_mark, tr.comments.as_ref().clone()),
)
},
&input,
&output,
FixtureTestConfig {
// auto detect script/module to test CJS handling
module: None,
..Default::default()
},
);
}
fn lint_to_fold<R>(r: R) -> impl Pass
where
R: Visit,
{
visit_pass(r)
}