From d89bdf98dbddc4f27e188ddaebc24f7d6c485037 Mon Sep 17 00:00:00 2001 From: OJ Kwon <1210596+kwonoj@users.noreply.github.com.> Date: Wed, 10 Jan 2024 13:13:10 -0800 Subject: [PATCH] wip --- .../src/next_shared/transforms/mod.rs | 7 +++++ .../transforms/next_amp_attributes.rs | 22 +++++++++++++++ .../transforms/next_cjs_optimizer.rs | 28 +++++++++++++++++++ .../next_disallow_re_export_all_in_page.rs | 24 ++++++++++++++++ .../transforms/next_optimize_server_react.rs | 27 ++++++++++++++++++ .../transforms/next_page_config.rs | 26 +++++++++++++++++ .../src/next_shared/transforms/next_pure.rs | 18 ++++++++++++ .../transforms/next_shake_exports.rs | 27 ++++++++++++++++++ .../src/chain_transforms.rs | 5 ++-- .../src/transforms/cjs_optimizer.rs | 13 ++++----- .../src/transforms/mod.rs | 6 ++-- .../src/transforms/pure.rs | 10 +++---- 12 files changed, 196 insertions(+), 17 deletions(-) create mode 100644 packages/next-swc/crates/next-core/src/next_shared/transforms/next_amp_attributes.rs create mode 100644 packages/next-swc/crates/next-core/src/next_shared/transforms/next_cjs_optimizer.rs create mode 100644 packages/next-swc/crates/next-core/src/next_shared/transforms/next_disallow_re_export_all_in_page.rs create mode 100644 packages/next-swc/crates/next-core/src/next_shared/transforms/next_optimize_server_react.rs create mode 100644 packages/next-swc/crates/next-core/src/next_shared/transforms/next_page_config.rs create mode 100644 packages/next-swc/crates/next-core/src/next_shared/transforms/next_pure.rs create mode 100644 packages/next-swc/crates/next-core/src/next_shared/transforms/next_shake_exports.rs 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 5d791ef149b9a8..3667d98e76c225 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 00000000000000..ea17e4fc2e259d --- /dev/null +++ b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_amp_attributes.rs @@ -0,0 +1,22 @@ +use anyhow::Result; +use async_trait::async_trait; +use next_custom_transforms::transforms::amp_attributes::amp_attributes; +use turbopack_binding::{ + swc::core::{ + common::util::take::Take, + ecma::{ast::*, visit::FoldWith}, + }, + turbopack::ecmascript::{CustomTransformer, TransformContext}, +}; + +#[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 00000000000000..2df5f873c9254d --- /dev/null +++ b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_cjs_optimizer.rs @@ -0,0 +1,28 @@ +use anyhow::Result; +use async_trait::async_trait; +use next_custom_transforms::transforms::cjs_optimizer::{cjs_optimizer, Config}; +use turbopack_binding::{ + swc::core::{ + common::SyntaxContext, + ecma::{ast::*, visit::VisitMutWith}, + }, + turbopack::ecmascript::{CustomTransformer, EcmascriptInputTransform, TransformContext}, +}; + +#[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 00000000000000..18ef89b829b184 --- /dev/null +++ b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_disallow_re_export_all_in_page.rs @@ -0,0 +1,24 @@ +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 turbopack_binding::{ + swc::core::{ + common::util::take::Take, + ecma::{ast::*, visit::FoldWith}, + }, + turbopack::ecmascript::{CustomTransformer, EcmascriptInputTransform, TransformContext}, +}; + +#[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 00000000000000..70e367b8a763cb --- /dev/null +++ b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_optimize_server_react.rs @@ -0,0 +1,27 @@ +use anyhow::Result; +use async_trait::async_trait; +use next_custom_transforms::transforms::optimize_server_react::{optimize_server_react, Config}; +use turbopack_binding::{ + swc::core::{ + common::util::take::Take, + ecma::{ast::*, visit::FoldWith}, + }, + turbopack::ecmascript::{CustomTransformer, EcmascriptInputTransform, TransformContext}, +}; + +#[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 00000000000000..a9b2162c70900e --- /dev/null +++ b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_page_config.rs @@ -0,0 +1,26 @@ +use anyhow::Result; +use async_trait::async_trait; +use next_custom_transforms::transforms::page_config::page_config; +use turbopack_binding::{ + swc::core::{ + common::util::take::Take, + ecma::{ast::*, visit::FoldWith}, + }, + turbopack::ecmascript::{CustomTransformer, EcmascriptInputTransform, TransformContext}, +}; + +#[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 00000000000000..be316db88bef1f --- /dev/null +++ b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_pure.rs @@ -0,0 +1,18 @@ +use anyhow::Result; +use async_trait::async_trait; +use next_custom_transforms::transforms::pure::pure_magic; +use turbopack_binding::{ + swc::core::ecma::{ast::*, visit::VisitMutWith}, + turbopack::ecmascript::{CustomTransformer, EcmascriptInputTransform, TransformContext}, +}; + +#[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 00000000000000..15d8eac866737c --- /dev/null +++ b/packages/next-swc/crates/next-core/src/next_shared/transforms/next_shake_exports.rs @@ -0,0 +1,27 @@ +use anyhow::Result; +use async_trait::async_trait; +use next_custom_transforms::transforms::shake_exports::{shake_exports, Config}; +use turbopack_binding::{ + swc::core::{ + common::util::take::Take, + ecma::{ast::*, visit::FoldWith}, + }, + turbopack::ecmascript::{CustomTransformer, EcmascriptInputTransform, TransformContext}, +}; + +#[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 45e023becf0c88..d754226634606f 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 af22057ac66bf2..a94a1f3ed8edfa 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 ea9d33dccbecca..151c99685c3b70 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; \ No newline at end of file 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 61c22dadb3c7ac..bdd69b4a414090 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, {