diff --git a/Cargo.lock b/Cargo.lock index c4949656df..dd88840134 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3428,6 +3428,7 @@ dependencies = [ "once_cell", "qstring", "regex", + "rustc-hash", "serde", "serde_json", "swc_core", diff --git a/packages/next-swc/crates/next-core/Cargo.toml b/packages/next-swc/crates/next-core/Cargo.toml index 4ce40a2e90..95c22f0fb2 100644 --- a/packages/next-swc/crates/next-core/Cargo.toml +++ b/packages/next-swc/crates/next-core/Cargo.toml @@ -33,6 +33,7 @@ futures = { workspace = true } lazy_static = { workspace = true } thiserror = { workspace = true } tracing = { workspace = true } +rustc-hash = { workspace = true } turbopack-binding = { workspace = true, features = [ "__swc_transform_modularize_imports", "__swc_transform_relay", diff --git a/packages/next-swc/crates/next-core/src/next_client/transforms.rs b/packages/next-swc/crates/next-core/src/next_client/transforms.rs index 4c6abe6bb2..a36e8e67d1 100644 --- a/packages/next-swc/crates/next-core/src/next_client/transforms.rs +++ b/packages/next-swc/crates/next-core/src/next_client/transforms.rs @@ -10,7 +10,11 @@ use crate::{ next_shared::transforms::{ get_next_dynamic_transform_rule, get_next_font_transform_rule, get_next_image_rule, get_next_modularize_imports_rule, get_next_pages_transforms_rule, - get_server_actions_transform_rule, server_actions::ActionsTransform, + get_server_actions_transform_rule, next_amp_attributes::get_next_amp_attr_rule, + next_cjs_optimizer::get_next_cjs_optimizer_rule, + next_disallow_re_export_all_in_page::get_next_disallow_export_all_in_page_rule, + next_page_config::get_next_page_config_rule, next_pure::get_next_pure_rule, + server_actions::ActionsTransform, }, }; @@ -52,6 +56,15 @@ pub async fn get_next_client_transforms_rules( ClientContextType::Fallback | ClientContextType::Other => None, }; + rules.push(get_next_amp_attr_rule(mdx_rs)); + rules.push(get_next_cjs_optimizer_rule(mdx_rs)); + rules.push(get_next_disallow_export_all_in_page_rule( + mdx_rs, + pages_dir.is_some(), + )); + rules.push(get_next_page_config_rule(mdx_rs, pages_dir.is_some())); + rules.push(get_next_pure_rule(mdx_rs)); + rules.push(get_next_dynamic_transform_rule(false, false, pages_dir, mode, mdx_rs).await?); rules.push(get_next_image_rule()); diff --git a/packages/next-swc/crates/next-core/src/next_server/transforms.rs b/packages/next-swc/crates/next-core/src/next_server/transforms.rs index 6feb88b7dd..ffa57b2c9c 100644 --- a/packages/next-swc/crates/next-core/src/next_server/transforms.rs +++ b/packages/next-swc/crates/next-core/src/next_server/transforms.rs @@ -11,7 +11,10 @@ use crate::{ next_shared::transforms::{ get_next_dynamic_transform_rule, get_next_font_transform_rule, get_next_image_rule, get_next_modularize_imports_rule, get_next_pages_transforms_rule, - get_server_actions_transform_rule, + get_server_actions_transform_rule, next_amp_attributes::get_next_amp_attr_rule, + next_cjs_optimizer::get_next_cjs_optimizer_rule, + next_disallow_re_export_all_in_page::get_next_disallow_export_all_in_page_rule, + next_pure::get_next_pure_rule, next_react_server_components::get_next_react_server_components_transform_rule, server_actions::ActionsTransform, }, @@ -85,6 +88,19 @@ pub async fn get_next_server_transforms_rules( .await?, ); + rules.push(get_next_amp_attr_rule(mdx_rs)); + rules.push(get_next_cjs_optimizer_rule(mdx_rs)); + rules.push(get_next_disallow_export_all_in_page_rule( + mdx_rs, + pages_dir.is_some(), + )); + rules.push(get_next_pure_rule(mdx_rs)); + + // [NOTE]: this rule only works in prod config + // https://github.com/vercel/next.js/blob/a1d0259ea06592c5ca6df882e9b1d0d0121c5083/packages/next/src/build/swc/options.ts#L409 + // rules.push(get_next_optimize_server_react_rule(enable_mdx_rs, + // optimize_use_state)) + rules.push(get_next_image_rule()); Ok(rules) diff --git a/packages/next-swc/crates/next-core/src/next_shared/transforms/mod.rs b/packages/next-swc/crates/next-core/src/next_shared/transforms/mod.rs index 5d791ef149..3667d98e76 100644 --- a/packages/next-swc/crates/next-core/src/next_shared/transforms/mod.rs +++ b/packages/next-swc/crates/next-core/src/next_shared/transforms/mod.rs @@ -1,8 +1,15 @@ pub(crate) mod emotion; pub(crate) mod modularize_imports; +pub(crate) mod next_amp_attributes; +pub(crate) mod next_cjs_optimizer; +pub(crate) mod next_disallow_re_export_all_in_page; pub(crate) mod next_dynamic; pub(crate) mod next_font; +pub(crate) mod next_optimize_server_react; +pub(crate) mod next_page_config; +pub(crate) mod next_pure; pub(crate) mod next_react_server_components; +pub(crate) mod next_shake_exports; pub(crate) mod next_strip_page_exports; pub(crate) mod relay; pub(crate) mod server_actions; diff --git a/packages/next-swc/crates/next-core/src/next_shared/transforms/next_amp_attributes.rs b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_amp_attributes.rs new file mode 100644 index 0000000000..8b04ddbeae --- /dev/null +++ b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_amp_attributes.rs @@ -0,0 +1,39 @@ +use anyhow::Result; +use async_trait::async_trait; +use next_custom_transforms::transforms::amp_attributes::amp_attributes; +use turbo_tasks::Vc; +use turbopack_binding::{ + swc::core::{ + common::util::take::Take, + ecma::{ast::*, visit::FoldWith}, + }, + turbopack::{ + ecmascript::{CustomTransformer, EcmascriptInputTransform, TransformContext}, + turbopack::module_options::{ModuleRule, ModuleRuleEffect}, + }, +}; + +use super::module_rule_match_js_no_url; + +pub fn get_next_amp_attr_rule(enable_mdx_rs: bool) -> ModuleRule { + let transformer = + EcmascriptInputTransform::Plugin(Vc::cell(Box::new(NextAmpAttributes {}) as _)); + ModuleRule::new( + module_rule_match_js_no_url(enable_mdx_rs), + vec![ModuleRuleEffect::AddEcmascriptTransforms(Vc::cell(vec![ + transformer, + ]))], + ) +} + +#[derive(Debug)] +struct NextAmpAttributes {} + +#[async_trait] +impl CustomTransformer for NextAmpAttributes { + async fn transform(&self, program: &mut Program, _ctx: &TransformContext<'_>) -> Result<()> { + let p = std::mem::replace(program, Program::Module(Module::dummy())); + *program = p.fold_with(&mut amp_attributes()); + Ok(()) + } +} diff --git a/packages/next-swc/crates/next-core/src/next_shared/transforms/next_cjs_optimizer.rs b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_cjs_optimizer.rs new file mode 100644 index 0000000000..3c737a5f9d --- /dev/null +++ b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_cjs_optimizer.rs @@ -0,0 +1,79 @@ +use anyhow::Result; +use async_trait::async_trait; +use next_custom_transforms::transforms::cjs_optimizer::{cjs_optimizer, Config, PackageConfig}; +use rustc_hash::FxHashMap; +use turbo_tasks::Vc; +use turbopack_binding::{ + swc::core::{ + common::SyntaxContext, + ecma::{ast::*, visit::VisitMutWith}, + }, + turbopack::{ + ecmascript::{CustomTransformer, EcmascriptInputTransform, TransformContext}, + turbopack::module_options::{ModuleRule, ModuleRuleEffect}, + }, +}; + +use super::module_rule_match_js_no_url; + +pub fn get_next_cjs_optimizer_rule(enable_mdx_rs: bool) -> ModuleRule { + // [NOTE]: This isn't user configurable config + // (https://github.com/vercel/next.js/blob/a1d0259ea06592c5ca6df882e9b1d0d0121c5083/packages/next/src/build/swc/options.ts#L395) + // build it internally without accepting customization. + let config = Config { + packages: FxHashMap::from_iter([( + "next/server".to_string(), + PackageConfig { + transforms: FxHashMap::from_iter([ + ( + "NextRequest".into(), + "next/dist/server/web/spec-extension/request".into(), + ), + ( + "NextResponse".into(), + "next/dist/server/web/spec-extension/response".into(), + ), + ( + "ImageResponse".into(), + "next/dist/server/web/spec-extension/image-response".into(), + ), + ( + "userAgentFromString".into(), + "next/dist/server/web/spec-extension/user-agent".into(), + ), + ( + "userAgent".into(), + "next/dist/server/web/spec-extension/user-agent".into(), + ), + ]), + }, + )]), + }; + + let transformer = + EcmascriptInputTransform::Plugin(Vc::cell(Box::new(NextCjsOptimizer { config }) as _)); + ModuleRule::new( + module_rule_match_js_no_url(enable_mdx_rs), + vec![ModuleRuleEffect::AddEcmascriptTransforms(Vc::cell(vec![ + transformer, + ]))], + ) +} + +#[derive(Debug)] +struct NextCjsOptimizer { + config: Config, +} + +#[async_trait] +impl CustomTransformer for NextCjsOptimizer { + async fn transform(&self, program: &mut Program, ctx: &TransformContext<'_>) -> Result<()> { + let mut visitor = cjs_optimizer( + self.config.clone(), + SyntaxContext::empty().apply_mark(ctx.unresolved_mark), + ); + + program.visit_mut_with(&mut visitor); + Ok(()) + } +} diff --git a/packages/next-swc/crates/next-core/src/next_shared/transforms/next_disallow_re_export_all_in_page.rs b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_disallow_re_export_all_in_page.rs new file mode 100644 index 0000000000..6b22a29676 --- /dev/null +++ b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_disallow_re_export_all_in_page.rs @@ -0,0 +1,46 @@ +use anyhow::Result; +use async_trait::async_trait; +use next_custom_transforms::transforms::disallow_re_export_all_in_page::disallow_re_export_all_in_page; +use turbo_tasks::Vc; +use turbopack_binding::{ + swc::core::{ + common::util::take::Take, + ecma::{ast::*, visit::FoldWith}, + }, + turbopack::{ + ecmascript::{CustomTransformer, EcmascriptInputTransform, TransformContext}, + turbopack::module_options::{ModuleRule, ModuleRuleEffect}, + }, +}; + +use super::module_rule_match_js_no_url; + +pub fn get_next_disallow_export_all_in_page_rule( + enable_mdx_rs: bool, + is_page_file: bool, +) -> ModuleRule { + let transformer = + EcmascriptInputTransform::Plugin(Vc::cell(Box::new(NextDisallowReExportAllInPage { + is_page_file, + }) as _)); + ModuleRule::new( + module_rule_match_js_no_url(enable_mdx_rs), + vec![ModuleRuleEffect::AddEcmascriptTransforms(Vc::cell(vec![ + transformer, + ]))], + ) +} + +#[derive(Debug)] +struct NextDisallowReExportAllInPage { + is_page_file: bool, +} + +#[async_trait] +impl CustomTransformer for NextDisallowReExportAllInPage { + async fn transform(&self, program: &mut Program, _ctx: &TransformContext<'_>) -> Result<()> { + let p = std::mem::replace(program, Program::Module(Module::dummy())); + *program = p.fold_with(&mut disallow_re_export_all_in_page(self.is_page_file)); + Ok(()) + } +} diff --git a/packages/next-swc/crates/next-core/src/next_shared/transforms/next_optimize_server_react.rs b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_optimize_server_react.rs new file mode 100644 index 0000000000..cf2278ccd3 --- /dev/null +++ b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_optimize_server_react.rs @@ -0,0 +1,50 @@ +use anyhow::Result; +use async_trait::async_trait; +use next_custom_transforms::transforms::optimize_server_react::{optimize_server_react, Config}; +use turbo_tasks::Vc; +use turbopack_binding::{ + swc::core::{ + common::util::take::Take, + ecma::{ast::*, visit::FoldWith}, + }, + turbopack::{ + ecmascript::{CustomTransformer, EcmascriptInputTransform, TransformContext}, + turbopack::module_options::{ModuleRule, ModuleRuleEffect}, + }, +}; + +use super::module_rule_match_js_no_url; + +#[allow(dead_code)] +pub fn get_next_optimize_server_react_rule( + enable_mdx_rs: bool, + optimize_use_state: bool, +) -> ModuleRule { + let transformer = + EcmascriptInputTransform::Plugin(Vc::cell(Box::new(NextOptimizeServerReact { + optimize_use_state, + }) as _)); + ModuleRule::new( + module_rule_match_js_no_url(enable_mdx_rs), + vec![ModuleRuleEffect::AddEcmascriptTransforms(Vc::cell(vec![ + transformer, + ]))], + ) +} + +#[derive(Debug)] +struct NextOptimizeServerReact { + optimize_use_state: bool, +} + +#[async_trait] +impl CustomTransformer for NextOptimizeServerReact { + async fn transform(&self, program: &mut Program, _ctx: &TransformContext<'_>) -> Result<()> { + let p = std::mem::replace(program, Program::Module(Module::dummy())); + + *program = p.fold_with(&mut optimize_server_react(Config { + optimize_use_state: self.optimize_use_state, + })); + Ok(()) + } +} diff --git a/packages/next-swc/crates/next-core/src/next_shared/transforms/next_page_config.rs b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_page_config.rs new file mode 100644 index 0000000000..cc1c78f0d1 --- /dev/null +++ b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_page_config.rs @@ -0,0 +1,46 @@ +use anyhow::Result; +use async_trait::async_trait; +use next_custom_transforms::transforms::page_config::page_config; +use turbo_tasks::Vc; +use turbopack_binding::{ + swc::core::{ + common::util::take::Take, + ecma::{ast::*, visit::FoldWith}, + }, + turbopack::{ + ecmascript::{CustomTransformer, EcmascriptInputTransform, TransformContext}, + turbopack::module_options::{ModuleRule, ModuleRuleEffect}, + }, +}; + +use super::module_rule_match_js_no_url; + +pub fn get_next_page_config_rule(enable_mdx_rs: bool, is_page_file: bool) -> ModuleRule { + let transformer = EcmascriptInputTransform::Plugin(Vc::cell(Box::new(NextPageConfig { + // [TODO]: update once turbopack build works + is_development: true, + is_page_file, + }) as _)); + ModuleRule::new( + module_rule_match_js_no_url(enable_mdx_rs), + vec![ModuleRuleEffect::AddEcmascriptTransforms(Vc::cell(vec![ + transformer, + ]))], + ) +} + +#[derive(Debug)] +struct NextPageConfig { + is_development: bool, + is_page_file: bool, +} + +#[async_trait] +impl CustomTransformer for NextPageConfig { + async fn transform(&self, program: &mut Program, _ctx: &TransformContext<'_>) -> Result<()> { + let p = std::mem::replace(program, Program::Module(Module::dummy())); + + *program = p.fold_with(&mut page_config(self.is_development, self.is_page_file)); + Ok(()) + } +} diff --git a/packages/next-swc/crates/next-core/src/next_shared/transforms/next_pure.rs b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_pure.rs new file mode 100644 index 0000000000..fa34724c34 --- /dev/null +++ b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_pure.rs @@ -0,0 +1,34 @@ +use anyhow::Result; +use async_trait::async_trait; +use next_custom_transforms::transforms::pure::pure_magic; +use turbo_tasks::Vc; +use turbopack_binding::{ + swc::core::ecma::{ast::*, visit::VisitMutWith}, + turbopack::{ + ecmascript::{CustomTransformer, EcmascriptInputTransform, TransformContext}, + turbopack::module_options::{ModuleRule, ModuleRuleEffect}, + }, +}; + +use super::module_rule_match_js_no_url; + +pub fn get_next_pure_rule(enable_mdx_rs: bool) -> ModuleRule { + let transformer = EcmascriptInputTransform::Plugin(Vc::cell(Box::new(NextPure {}) as _)); + ModuleRule::new( + module_rule_match_js_no_url(enable_mdx_rs), + vec![ModuleRuleEffect::AddEcmascriptTransforms(Vc::cell(vec![ + transformer, + ]))], + ) +} + +#[derive(Debug)] +struct NextPure {} + +#[async_trait] +impl CustomTransformer for NextPure { + async fn transform(&self, program: &mut Program, ctx: &TransformContext<'_>) -> Result<()> { + program.visit_mut_with(&mut pure_magic(ctx.comments.clone())); + Ok(()) + } +} diff --git a/packages/next-swc/crates/next-core/src/next_shared/transforms/next_shake_exports.rs b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_shake_exports.rs new file mode 100644 index 0000000000..b05835fcb7 --- /dev/null +++ b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_shake_exports.rs @@ -0,0 +1,45 @@ +use anyhow::Result; +use async_trait::async_trait; +use next_custom_transforms::transforms::shake_exports::{shake_exports, Config}; +use turbo_tasks::Vc; +use turbopack_binding::{ + swc::core::{ + common::util::take::Take, + ecma::{ast::*, visit::FoldWith}, + }, + turbopack::{ + ecmascript::{CustomTransformer, EcmascriptInputTransform, TransformContext}, + turbopack::module_options::{ModuleRule, ModuleRuleEffect}, + }, +}; + +use super::module_rule_match_js_no_url; + +#[allow(dead_code)] +pub fn get_next_shake_exports_rule(enable_mdx_rs: bool, ignore: Vec) -> ModuleRule { + let transformer = + EcmascriptInputTransform::Plugin(Vc::cell(Box::new(NextShakeExports { ignore }) as _)); + ModuleRule::new( + module_rule_match_js_no_url(enable_mdx_rs), + vec![ModuleRuleEffect::AddEcmascriptTransforms(Vc::cell(vec![ + transformer, + ]))], + ) +} + +#[derive(Debug)] +struct NextShakeExports { + ignore: Vec, +} + +#[async_trait] +impl CustomTransformer for NextShakeExports { + async fn transform(&self, program: &mut Program, _ctx: &TransformContext<'_>) -> Result<()> { + let p = std::mem::replace(program, Program::Module(Module::dummy())); + + *program = p.fold_with(&mut shake_exports(Config { + ignore: self.ignore.iter().map(|s| s.clone().into()).collect(), + })); + Ok(()) + } +} diff --git a/packages/next-swc/crates/next-custom-transforms/src/chain_transforms.rs b/packages/next-swc/crates/next-custom-transforms/src/chain_transforms.rs index 45e023becf..d754226634 100644 --- a/packages/next-swc/crates/next-custom-transforms/src/chain_transforms.rs +++ b/packages/next-swc/crates/next-custom-transforms/src/chain_transforms.rs @@ -3,6 +3,7 @@ use std::{cell::RefCell, path::PathBuf, rc::Rc, sync::Arc}; use either::Either; use fxhash::FxHashSet; use serde::Deserialize; +use swc_core::ecma::visit::as_folder; use turbopack_binding::swc::{ core::{ common::{ @@ -275,11 +276,11 @@ where }, match &opts.cjs_require_optimizer { Some(config) => { - Either::Left(crate::transforms::cjs_optimizer::cjs_optimizer(config.clone(), SyntaxContext::empty().apply_mark(unresolved_mark))) + Either::Left(as_folder(crate::transforms::cjs_optimizer::cjs_optimizer(config.clone(), SyntaxContext::empty().apply_mark(unresolved_mark)))) }, None => Either::Right(noop()), }, - crate::transforms::pure::pure_magic(comments), + as_folder(crate::transforms::pure::pure_magic(comments)), ) } diff --git a/packages/next-swc/crates/next-custom-transforms/src/transforms/cjs_optimizer.rs b/packages/next-swc/crates/next-custom-transforms/src/transforms/cjs_optimizer.rs index af22057ac6..a94a1f3ed8 100644 --- a/packages/next-swc/crates/next-custom-transforms/src/transforms/cjs_optimizer.rs +++ b/packages/next-swc/crates/next-custom-transforms/src/transforms/cjs_optimizer.rs @@ -9,19 +9,16 @@ use turbopack_binding::swc::core::{ }, atoms::{Atom, JsWord}, utils::{prepend_stmts, private_ident, ExprFactory, IdentRenamer}, - visit::{ - as_folder, noop_visit_mut_type, noop_visit_type, Fold, Visit, VisitMut, VisitMutWith, - VisitWith, - }, + visit::{noop_visit_mut_type, noop_visit_type, Visit, VisitMut, VisitMutWith, VisitWith}, }, }; -pub fn cjs_optimizer(config: Config, unresolved_ctxt: SyntaxContext) -> impl Fold + VisitMut { - as_folder(CjsOptimizer { +pub fn cjs_optimizer(config: Config, unresolved_ctxt: SyntaxContext) -> CjsOptimizer { + CjsOptimizer { data: State::default(), packages: config.packages, unresolved_ctxt, - }) + } } #[derive(Clone, Debug, Deserialize)] @@ -35,7 +32,7 @@ pub struct PackageConfig { pub transforms: FxHashMap, } -struct CjsOptimizer { +pub struct CjsOptimizer { data: State, packages: FxHashMap, unresolved_ctxt: SyntaxContext, diff --git a/packages/next-swc/crates/next-custom-transforms/src/transforms/mod.rs b/packages/next-swc/crates/next-custom-transforms/src/transforms/mod.rs index ea9d33dccb..b35d569825 100644 --- a/packages/next-swc/crates/next-custom-transforms/src/transforms/mod.rs +++ b/packages/next-swc/crates/next-custom-transforms/src/transforms/mod.rs @@ -5,9 +5,7 @@ pub mod disallow_re_export_all_in_page; pub mod dynamic; pub mod fonts; pub mod import_analyzer; -pub mod named_import_transform; pub mod next_ssg; -pub mod optimize_barrel; pub mod optimize_server_react; pub mod page_config; pub mod pure; @@ -15,3 +13,7 @@ pub mod react_server_components; pub mod server_actions; pub mod shake_exports; pub mod strip_page_exports; + +//[TODO] PACK-1564: need to decide reuse vs. turbopack specific +pub mod named_import_transform; +pub mod optimize_barrel; diff --git a/packages/next-swc/crates/next-custom-transforms/src/transforms/pure.rs b/packages/next-swc/crates/next-custom-transforms/src/transforms/pure.rs index 61c22dadb3..bdd69b4a41 100644 --- a/packages/next-swc/crates/next-custom-transforms/src/transforms/pure.rs +++ b/packages/next-swc/crates/next-custom-transforms/src/transforms/pure.rs @@ -2,23 +2,23 @@ use turbopack_binding::swc::core::{ common::{comments::Comments, errors::HANDLER, util::take::Take, Span, Spanned, DUMMY_SP}, ecma::{ ast::{CallExpr, Callee, EmptyStmt, Expr, Module, ModuleDecl, ModuleItem, Stmt}, - visit::{as_folder, noop_visit_mut_type, Fold, VisitMut, VisitMutWith}, + visit::{noop_visit_mut_type, VisitMut, VisitMutWith}, }, }; use crate::transforms::import_analyzer::ImportMap; -pub fn pure_magic(comments: C) -> impl Fold +pub fn pure_magic(comments: C) -> PureTransform where C: Comments, { - as_folder(PureTransform { + PureTransform { imports: Default::default(), comments, - }) + } } -struct PureTransform +pub struct PureTransform where C: Comments, { diff --git a/packages/next-swc/crates/next-custom-transforms/tests/fixture.rs b/packages/next-swc/crates/next-custom-transforms/tests/fixture.rs index 2842fcf757..e14ed2fba9 100644 --- a/packages/next-swc/crates/next-custom-transforms/tests/fixture.rs +++ b/packages/next-swc/crates/next-custom-transforms/tests/fixture.rs @@ -22,6 +22,7 @@ use next_custom_transforms::transforms::{ strip_page_exports::{next_transform_strip_page_exports, ExportFilter}, }; use serde::de::DeserializeOwned; +use swc_core::ecma::visit::as_folder; use turbopack_binding::swc::{ core::{ common::{chain, comments::SingleThreadedComments, FileName, Mark, SyntaxContext}, @@ -429,7 +430,7 @@ fn cjs_optimize_fixture(input: PathBuf) { chain!( resolver(unresolved_mark, top_level_mark, false), - cjs_optimizer( + as_folder(cjs_optimizer( json( r#" { @@ -444,7 +445,7 @@ fn cjs_optimize_fixture(input: PathBuf) { "# ), unresolved_ctxt - ) + )) ) }, &input, @@ -571,7 +572,7 @@ fn pure(input: PathBuf) { chain!( resolver(unresolved_mark, top_level_mark, false), - pure_magic(tr.comments.clone()) + as_folder(pure_magic(tr.comments.clone())) ) }, &input,