From 3178e9df6908b186220e9cc403d2f6e557cd2094 Mon Sep 17 00:00:00 2001 From: OJ Kwon <1210596+kwonoj@users.noreply.github.com> Date: Fri, 16 Dec 2022 11:47:56 -0800 Subject: [PATCH] refactor(next-swc): introduce next-binding to consolidate dependencies. (#43473) Partial solutions for WEB-225. One of the issue we want to improve is version bump process across multiple dependencies sharing same transitive dependencies. There were known cases of last-minute build failures of next-swc due to this. The biggest thing is we have lot of dependenceis rely on swc_core, and consolidating it altogether is tricky. PR introduces `next-binding`, which reexports all the related dependencies that next-swc and turbopack commonly uses. Unfortunately, this is not a complete solution, but at least it'll make `upfront` cost to turbopack when it try to update swc_core and others, so by the time upgrading it in next-swc we expect minimal friction. Note not 0 friction: due to how cargo behaves for the merging all of the features, there's still chances to have some build failures but meaningfully less I believe. I think the easiest way to describe before / after is having some diagrams. This is rather simplified to illustrate problems easily, i.e when it comes to actual build if there are same version of deps cargo will dedupe, so below illustaration only would occur for non-compatible version cases, etcs. **Before** ```mermaid graph TD A[next-swc] --> B(next-dev) A --> C(swc_core) A --> D(swc_emotion) D --> E(swc_core) A --> F(styled_jsx) F --> E A --> G(mdxrs) G --> H(swc_core) B --> I(swc_core) B --> J(swc_emotion) J --> K(swc_core) ``` **After** ```mermaid graph TD A[next-swc] --> B(next-binding) B --> C[swc_core] B --> D[swc_emotion] D --> I[swc_core] B --> H[styled_jsx] B --> F[next-dev] B --> J[node-file-trace] F --> C H --> I B --> E(mdxrs) E --> G(swc_core) ``` You can see repeated dependencies (`swc_core`, `swc_emotion`) occurs lot more in next-swc in `before`, including next-swc top level direct import itself. In result, update process have to align between next-swc, turbopack, swc-plugins and others. With newly proposed changes, `next-swc` no longer directly owns deps reduces those repetaed deps. At the moment of version bump, only `next-binding` need to be updated. This brings small caveat however : next-swc does not directly update `swc_core`, but have to bump turbopack and its transitive dependencies. Given our bump process usually requires to bump up turbopack anyway, I wouldn't consider this as hard blocking though. --- packages/next-swc/Cargo.lock | 33 ++++++++---- packages/next-swc/crates/core/Cargo.toml | 37 +++++-------- .../crates/core/src/amp_attributes.rs | 2 +- .../next-swc/crates/core/src/auto_cjs/mod.rs | 2 +- .../src/disallow_re_export_all_in_page.rs | 2 +- packages/next-swc/crates/core/src/lib.rs | 52 +++++++++++-------- .../next-swc/crates/core/src/next_dynamic.rs | 2 +- .../find_functions_outside_module_scope.rs | 8 +-- .../font_functions_collector.rs | 10 ++-- .../font_imports_generator.rs | 10 ++-- .../crates/core/src/next_font_loaders/mod.rs | 4 +- packages/next-swc/crates/core/src/next_ssg.rs | 2 +- .../next-swc/crates/core/src/page_config.rs | 2 +- .../core/src/react_remove_properties.rs | 2 +- .../core/src/react_server_components.rs | 2 +- packages/next-swc/crates/core/src/relay.rs | 2 +- .../crates/core/src/remove_console.rs | 2 +- .../next-swc/crates/core/src/shake_exports.rs | 2 +- .../core/src/top_level_binding_collector.rs | 2 +- packages/next-swc/crates/core/tests/errors.rs | 18 ++++--- .../next-swc/crates/core/tests/fixture.rs | 18 ++++--- packages/next-swc/crates/core/tests/full.rs | 28 +++++----- .../next-swc/crates/core/tests/telemetry.rs | 2 +- packages/next-swc/crates/napi/Cargo.toml | 47 ++++++----------- packages/next-swc/crates/napi/src/lib.rs | 4 +- packages/next-swc/crates/napi/src/mdx.rs | 2 +- packages/next-swc/crates/napi/src/minify.rs | 12 ++--- packages/next-swc/crates/napi/src/parse.rs | 9 ++-- .../next-swc/crates/napi/src/transform.rs | 9 ++-- .../next-swc/crates/napi/src/turbopack.rs | 2 +- .../next-swc/crates/napi/src/turbotrace.rs | 2 +- packages/next-swc/crates/wasm/Cargo.toml | 22 ++------ packages/next-swc/crates/wasm/src/lib.rs | 12 +++-- packages/next-swc/crates/wasm/src/mdx.rs | 2 +- 34 files changed, 181 insertions(+), 186 deletions(-) diff --git a/packages/next-swc/Cargo.lock b/packages/next-swc/Cargo.lock index eda9c06fb578f6e..0e6116daa45af7d 100644 --- a/packages/next-swc/Cargo.lock +++ b/packages/next-swc/Cargo.lock @@ -2209,6 +2209,22 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +[[package]] +name = "next-binding" +version = "0.1.0" +source = "git+https://github.com/vercel/turbo.git?rev=cc024fa59f1c3ad253e74eefe86e0386455455d1#cc024fa59f1c3ad253e74eefe86e0386455455d1" +dependencies = [ + "mdxjs", + "modularize_imports", + "next-dev", + "node-file-trace", + "styled_components", + "styled_jsx", + "swc_core 0.45.4", + "swc_emotion", + "testing", +] + [[package]] name = "next-core" version = "0.1.0" @@ -2276,6 +2292,7 @@ dependencies = [ "either", "fxhash", "modularize_imports", + "next-binding", "once_cell", "pathdiff", "regex", @@ -2283,9 +2300,7 @@ dependencies = [ "serde_json", "styled_components", "styled_jsx", - "swc_core 0.45.4", "swc_emotion", - "testing", "tracing", "walkdir", ] @@ -2297,18 +2312,15 @@ dependencies = [ "anyhow", "backtrace", "fxhash", - "mdxjs", "napi", "napi-build", "napi-derive", - "next-dev", + "next-binding", "next-swc", - "node-file-trace", "once_cell", "sentry", "serde", "serde_json", - "swc_core 0.45.4", "tracing", "tracing-chrome", "tracing-futures", @@ -2321,9 +2333,11 @@ version = "0.1.0" source = "git+https://github.com/vercel/turbo.git?rev=cc024fa59f1c3ad253e74eefe86e0386455455d1#cc024fa59f1c3ad253e74eefe86e0386455455d1" dependencies = [ "anyhow", + "clap", "serde", "serde_json", "tokio", + "turbo-malloc", "turbo-tasks", "turbo-tasks-build", "turbo-tasks-fs", @@ -3039,9 +3053,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.12" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "431949c384f4e2ae07605ccaa56d1d9d2ecdb5cadd4f9577ccfab29f2e5149fc" +checksum = "68cc60575865c7831548863cc02356512e3f1dc2f3f82cb837d7fc4cc8f3c97c" dependencies = [ "base64", "bytes", @@ -5890,7 +5904,7 @@ dependencies = [ "console_error_panic_hook", "getrandom", "js-sys", - "mdxjs", + "next-binding", "next-swc", "once_cell", "parking_lot_core 0.8.0", @@ -5898,7 +5912,6 @@ dependencies = [ "serde", "serde-wasm-bindgen", "serde_json", - "swc_core 0.45.4", "tracing", "wasm-bindgen", "wasm-bindgen-futures", diff --git a/packages/next-swc/crates/core/Cargo.toml b/packages/next-swc/crates/core/Cargo.toml index 69ae74471decc84..7b9d28176fc5e2c 100644 --- a/packages/next-swc/crates/core/Cargo.toml +++ b/packages/next-swc/crates/core/Cargo.toml @@ -5,9 +5,7 @@ version = "0.0.0" publish = false [features] -plugin = [ - "swc_core/plugin_transform_host_native" -] +plugin = ["next-binding/__swc_core_binding_napi_plugin"] [dependencies] chrono = "0.4" @@ -25,26 +23,19 @@ styled_jsx = "0.29.8" modularize_imports = "0.25.8" tracing = { version = "0.1.37", features = ["release_max_level_info"] } -swc_core = { features = [ - "common_concurrent", - "ecma_ast", - "ecma_visit", - "ecma_loader_node", - "ecma_loader_lru", - "ecma_utils", - "ecma_minifier", - "ecma_transforms", - "__ecma_transforms", - "ecma_transforms_react", - "ecma_transforms_typescript", - "ecma_transforms_optimization", - "ecma_parser", - "ecma_parser_typescript", - "cached", - "base" -], version = "0.45.4" } +next-binding = { git = "https://github.com/vercel/turbo.git", rev = "cc024fa59f1c3ad253e74eefe86e0386455455d1", features = [ + "__swc_core", + "__swc_core_next_core", + "__swc_transform_styled_jsx", + "__swc_transform_emotion", + "__swc_transform_styled_components", + "__swc_transform_modularize_imports", +] } [dev-dependencies] -swc_core = { features = ["testing_transform"], version = "0.45.4" } -testing = "0.31.14" +next-binding = { git = "https://github.com/vercel/turbo.git", rev = "cc024fa59f1c3ad253e74eefe86e0386455455d1", features = [ + "__swc_core_testing_transform", + "__swc_testing", +] } + walkdir = "2.3.2" diff --git a/packages/next-swc/crates/core/src/amp_attributes.rs b/packages/next-swc/crates/core/src/amp_attributes.rs index 386980d5e465398..7d0f82317f896d5 100644 --- a/packages/next-swc/crates/core/src/amp_attributes.rs +++ b/packages/next-swc/crates/core/src/amp_attributes.rs @@ -1,4 +1,4 @@ -use swc_core::{ +use next_binding::swc::core::{ ecma::ast::{Ident, JSXAttr, JSXAttrName, JSXAttrOrSpread, JSXElementName, JSXOpeningElement}, ecma::atoms::JsWord, ecma::visit::Fold, diff --git a/packages/next-swc/crates/core/src/auto_cjs/mod.rs b/packages/next-swc/crates/core/src/auto_cjs/mod.rs index 0859f9ebe11e0fc..239a82a2b8df60b 100644 --- a/packages/next-swc/crates/core/src/auto_cjs/mod.rs +++ b/packages/next-swc/crates/core/src/auto_cjs/mod.rs @@ -1,4 +1,4 @@ -use swc_core::{ +use next_binding::swc::core::{ ecma::ast::*, ecma::visit::{Visit, VisitWith}, }; diff --git a/packages/next-swc/crates/core/src/disallow_re_export_all_in_page.rs b/packages/next-swc/crates/core/src/disallow_re_export_all_in_page.rs index 3636c4774fcf3a4..50f588ed3341c13 100644 --- a/packages/next-swc/crates/core/src/disallow_re_export_all_in_page.rs +++ b/packages/next-swc/crates/core/src/disallow_re_export_all_in_page.rs @@ -1,4 +1,4 @@ -use swc_core::{ +use next_binding::swc::core::{ common::errors::HANDLER, ecma::ast::ExportAll, ecma::transforms::base::pass::Optional, diff --git a/packages/next-swc/crates/core/src/lib.rs b/packages/next-swc/crates/core/src/lib.rs index 32c6c02218955a2..8229d41cf9e89e9 100644 --- a/packages/next-swc/crates/core/src/lib.rs +++ b/packages/next-swc/crates/core/src/lib.rs @@ -38,7 +38,7 @@ use std::cell::RefCell; use std::rc::Rc; use std::{path::PathBuf, sync::Arc}; -use swc_core::{ +use next_binding::swc::core::{ base::config::ModuleConfig, common::{chain, comments::Comments, pass::Optional, FileName, SourceFile, SourceMap}, ecma::ast::EsVersion, @@ -66,7 +66,7 @@ mod top_level_binding_collector; #[serde(rename_all = "camelCase")] pub struct TransformOptions { #[serde(flatten)] - pub swc: swc_core::base::config::Options, + pub swc: next_binding::swc::core::base::config::Options, #[serde(default)] pub disable_next_ssg: bool, @@ -93,7 +93,7 @@ pub struct TransformOptions { pub styled_jsx: bool, #[serde(default)] - pub styled_components: Option, + pub styled_components: Option, #[serde(default)] pub remove_console: Option, @@ -115,10 +115,10 @@ pub struct TransformOptions { pub shake_exports: Option, #[serde(default)] - pub emotion: Option, + pub emotion: Option, #[serde(default)] - pub modularize_imports: Option, + pub modularize_imports: Option, #[serde(default)] pub font_loaders: Option, @@ -162,19 +162,23 @@ where _ => Either::Right(noop()), }, if opts.styled_jsx { - Either::Left(styled_jsx::visitor::styled_jsx( - cm.clone(), - file.name.clone(), - )) + Either::Left( + next_binding::swc::custom_transform::styled_jsx::visitor::styled_jsx( + cm.clone(), + file.name.clone(), + ), + ) } else { Either::Right(noop()) }, match &opts.styled_components { - Some(config) => Either::Left(styled_components::styled_components( - file.name.clone(), - file.src_hash, - config.clone(), - )), + Some(config) => Either::Left( + next_binding::swc::custom_transform::styled_components::styled_components( + file.name.clone(), + file.src_hash, + config.clone(), + ) + ), None => Either::Right(noop()), }, Optional::new( @@ -216,12 +220,14 @@ where } if let FileName::Real(path) = &file.name { path.to_str().map(|_| { - Either::Left(swc_emotion::EmotionTransformer::new( - config.clone(), - path, - cm, - comments, - )) + Either::Left( + next_binding::swc::custom_transform::emotion::EmotionTransformer::new( + config.clone(), + path, + cm, + comments, + ), + ) }) } else { None @@ -229,7 +235,11 @@ where }) .unwrap_or_else(|| Either::Right(noop())), match &opts.modularize_imports { - Some(config) => Either::Left(modularize_imports::modularize_imports(config.clone())), + Some(config) => Either::Left( + next_binding::swc::custom_transform::modularize_imports::modularize_imports( + config.clone() + ) + ), None => Either::Right(noop()), }, match &opts.font_loaders { diff --git a/packages/next-swc/crates/core/src/next_dynamic.rs b/packages/next-swc/crates/core/src/next_dynamic.rs index 422e2515a9da159..78444171bf2e790 100644 --- a/packages/next-swc/crates/core/src/next_dynamic.rs +++ b/packages/next-swc/crates/core/src/next_dynamic.rs @@ -2,7 +2,7 @@ use std::path::{Path, PathBuf}; use pathdiff::diff_paths; -use swc_core::{ +use next_binding::swc::core::{ common::{errors::HANDLER, FileName, DUMMY_SP}, ecma::ast::{ ArrayLit, ArrowExpr, BinExpr, BinaryOp, BlockStmtOrExpr, Bool, CallExpr, Callee, Expr, diff --git a/packages/next-swc/crates/core/src/next_font_loaders/find_functions_outside_module_scope.rs b/packages/next-swc/crates/core/src/next_font_loaders/find_functions_outside_module_scope.rs index f83742d20543635..3ccf5af4d1a617a 100644 --- a/packages/next-swc/crates/core/src/next_font_loaders/find_functions_outside_module_scope.rs +++ b/packages/next-swc/crates/core/src/next_font_loaders/find_functions_outside_module_scope.rs @@ -1,7 +1,7 @@ -use swc_core::common::errors::HANDLER; -use swc_core::ecma::ast::*; -use swc_core::ecma::visit::noop_visit_type; -use swc_core::ecma::visit::Visit; +use next_binding::swc::core::common::errors::HANDLER; +use next_binding::swc::core::ecma::ast::*; +use next_binding::swc::core::ecma::visit::noop_visit_type; +use next_binding::swc::core::ecma::visit::Visit; pub struct FindFunctionsOutsideModuleScope<'a> { pub state: &'a super::State, diff --git a/packages/next-swc/crates/core/src/next_font_loaders/font_functions_collector.rs b/packages/next-swc/crates/core/src/next_font_loaders/font_functions_collector.rs index e8fdfce66f0e65c..2465e885ace6ba6 100644 --- a/packages/next-swc/crates/core/src/next_font_loaders/font_functions_collector.rs +++ b/packages/next-swc/crates/core/src/next_font_loaders/font_functions_collector.rs @@ -1,8 +1,8 @@ -use swc_core::common::errors::HANDLER; -use swc_core::ecma::ast::*; -use swc_core::ecma::atoms::JsWord; -use swc_core::ecma::visit::noop_visit_type; -use swc_core::ecma::visit::Visit; +use next_binding::swc::core::common::errors::HANDLER; +use next_binding::swc::core::ecma::ast::*; +use next_binding::swc::core::ecma::atoms::JsWord; +use next_binding::swc::core::ecma::visit::noop_visit_type; +use next_binding::swc::core::ecma::visit::Visit; pub struct FontFunctionsCollector<'a> { pub font_loaders: &'a [JsWord], diff --git a/packages/next-swc/crates/core/src/next_font_loaders/font_imports_generator.rs b/packages/next-swc/crates/core/src/next_font_loaders/font_imports_generator.rs index d6a92447b833d54..c80e24f85c800bf 100644 --- a/packages/next-swc/crates/core/src/next_font_loaders/font_imports_generator.rs +++ b/packages/next-swc/crates/core/src/next_font_loaders/font_imports_generator.rs @@ -1,9 +1,9 @@ +use next_binding::swc::core::common::errors::HANDLER; +use next_binding::swc::core::common::{Spanned, DUMMY_SP}; +use next_binding::swc::core::ecma::ast::*; +use next_binding::swc::core::ecma::atoms::JsWord; +use next_binding::swc::core::ecma::visit::{noop_visit_type, Visit}; use serde_json::Value; -use swc_core::common::errors::HANDLER; -use swc_core::common::{Spanned, DUMMY_SP}; -use swc_core::ecma::ast::*; -use swc_core::ecma::atoms::JsWord; -use swc_core::ecma::visit::{noop_visit_type, Visit}; pub struct FontImportsGenerator<'a> { pub state: &'a mut super::State, diff --git a/packages/next-swc/crates/core/src/next_font_loaders/mod.rs b/packages/next-swc/crates/core/src/next_font_loaders/mod.rs index e39e83c69d58ab0..28f4cac2b83c312 100644 --- a/packages/next-swc/crates/core/src/next_font_loaders/mod.rs +++ b/packages/next-swc/crates/core/src/next_font_loaders/mod.rs @@ -1,6 +1,5 @@ use fxhash::FxHashSet; -use serde::Deserialize; -use swc_core::{ +use next_binding::swc::core::{ common::{collections::AHashMap, BytePos, Spanned}, ecma::{ ast::Id, @@ -8,6 +7,7 @@ use swc_core::{ }, ecma::{ast::ModuleItem, atoms::JsWord}, }; +use serde::Deserialize; mod find_functions_outside_module_scope; mod font_functions_collector; diff --git a/packages/next-swc/crates/core/src/next_ssg.rs b/packages/next-swc/crates/core/src/next_ssg.rs index e1344cb97d79a32..e1fdb0842ba4c02 100644 --- a/packages/next-swc/crates/core/src/next_ssg.rs +++ b/packages/next-swc/crates/core/src/next_ssg.rs @@ -4,7 +4,7 @@ use std::cell::RefCell; use std::mem::take; use std::rc::Rc; -use swc_core::{ +use next_binding::swc::core::{ common::{ errors::HANDLER, pass::{Repeat, Repeated}, diff --git a/packages/next-swc/crates/core/src/page_config.rs b/packages/next-swc/crates/core/src/page_config.rs index f37beeb04909e4f..c800f315a43fc4f 100644 --- a/packages/next-swc/crates/core/src/page_config.rs +++ b/packages/next-swc/crates/core/src/page_config.rs @@ -1,6 +1,6 @@ use chrono::Utc; -use swc_core::{ +use next_binding::swc::core::{ common::{errors::HANDLER, Span, DUMMY_SP}, ecma::ast::*, ecma::visit::{Fold, FoldWith}, diff --git a/packages/next-swc/crates/core/src/react_remove_properties.rs b/packages/next-swc/crates/core/src/react_remove_properties.rs index 5e4b03a6b754f67..900078a9bfc0828 100644 --- a/packages/next-swc/crates/core/src/react_remove_properties.rs +++ b/packages/next-swc/crates/core/src/react_remove_properties.rs @@ -1,7 +1,7 @@ use regex::Regex; use serde::Deserialize; -use swc_core::{ +use next_binding::swc::core::{ ecma::ast::*, ecma::visit::{noop_fold_type, Fold, FoldWith}, }; diff --git a/packages/next-swc/crates/core/src/react_server_components.rs b/packages/next-swc/crates/core/src/react_server_components.rs index 81ad12f596df8a6..ee670930165fa10 100644 --- a/packages/next-swc/crates/core/src/react_server_components.rs +++ b/packages/next-swc/crates/core/src/react_server_components.rs @@ -1,7 +1,7 @@ use regex::Regex; use serde::Deserialize; -use swc_core::{ +use next_binding::swc::core::{ common::{ comments::{Comment, CommentKind, Comments}, errors::HANDLER, diff --git a/packages/next-swc/crates/core/src/relay.rs b/packages/next-swc/crates/core/src/relay.rs index aced684c13ea4e2..803e2a9530efbcb 100644 --- a/packages/next-swc/crates/core/src/relay.rs +++ b/packages/next-swc/crates/core/src/relay.rs @@ -3,7 +3,7 @@ use regex::Regex; use serde::Deserialize; use std::path::{Path, PathBuf}; -use swc_core::{ +use next_binding::swc::core::{ common::{errors::HANDLER, FileName}, ecma::ast::*, ecma::atoms::JsWord, diff --git a/packages/next-swc/crates/core/src/remove_console.rs b/packages/next-swc/crates/core/src/remove_console.rs index 035b7dba776cedb..1b8e80e2a0fde5b 100644 --- a/packages/next-swc/crates/core/src/remove_console.rs +++ b/packages/next-swc/crates/core/src/remove_console.rs @@ -1,6 +1,6 @@ use serde::Deserialize; -use swc_core::{ +use next_binding::swc::core::{ common::{collections::AHashSet, DUMMY_SP}, ecma::ast::*, ecma::atoms::JsWord, diff --git a/packages/next-swc/crates/core/src/shake_exports.rs b/packages/next-swc/crates/core/src/shake_exports.rs index c08a19ea28ef9d2..49fa2d1b3610a3e 100644 --- a/packages/next-swc/crates/core/src/shake_exports.rs +++ b/packages/next-swc/crates/core/src/shake_exports.rs @@ -1,6 +1,6 @@ use serde::Deserialize; -use swc_core::{ +use next_binding::swc::core::{ common::Mark, ecma::ast::*, ecma::atoms::{js_word, JsWord}, diff --git a/packages/next-swc/crates/core/src/top_level_binding_collector.rs b/packages/next-swc/crates/core/src/top_level_binding_collector.rs index 1eef9229528d1fd..62d0b18f74f9a4c 100644 --- a/packages/next-swc/crates/core/src/top_level_binding_collector.rs +++ b/packages/next-swc/crates/core/src/top_level_binding_collector.rs @@ -1,6 +1,6 @@ use std::hash::Hash; -use swc_core::{ +use next_binding::swc::core::{ common::{collections::AHashSet, SyntaxContext}, ecma::ast::{ ClassDecl, FnDecl, Ident, ImportDefaultSpecifier, ImportNamedSpecifier, diff --git a/packages/next-swc/crates/core/tests/errors.rs b/packages/next-swc/crates/core/tests/errors.rs index 6d627c12e665e3f..2d55603c9c37542 100644 --- a/packages/next-swc/crates/core/tests/errors.rs +++ b/packages/next-swc/crates/core/tests/errors.rs @@ -1,3 +1,13 @@ +use next_binding::swc::{ + core::{ + common::FileName, + ecma::{ + parser::{EsConfig, Syntax}, + transforms::testing::{test_fixture, FixtureTestConfig}, + }, + }, + testing::fixture, +}; use next_swc::{ disallow_re_export_all_in_page::disallow_re_export_all_in_page, next_dynamic::next_dynamic, @@ -6,14 +16,6 @@ use next_swc::{ react_server_components::server_components, }; use std::path::PathBuf; -use swc_core::{ - common::FileName, - ecma::{ - parser::{EsConfig, Syntax}, - transforms::testing::{test_fixture, FixtureTestConfig}, - }, -}; -use testing::fixture; fn syntax() -> Syntax { Syntax::Es(EsConfig { diff --git a/packages/next-swc/crates/core/tests/fixture.rs b/packages/next-swc/crates/core/tests/fixture.rs index 478f667c1ccd066..b362230d95b7f78 100644 --- a/packages/next-swc/crates/core/tests/fixture.rs +++ b/packages/next-swc/crates/core/tests/fixture.rs @@ -1,3 +1,12 @@ +use next_binding::swc::{ + core::{ + common::{chain, comments::SingleThreadedComments, FileName, Mark}, + ecma::parser::{EsConfig, Syntax}, + ecma::transforms::react::jsx, + ecma::transforms::testing::{test, test_fixture}, + }, + testing::fixture, +}; use next_swc::{ amp_attributes::amp_attributes, next_dynamic::next_dynamic, @@ -11,13 +20,6 @@ use next_swc::{ shake_exports::{shake_exports, Config as ShakeExportsConfig}, }; use std::path::PathBuf; -use swc_core::{ - common::{chain, comments::SingleThreadedComments, FileName, Mark}, - ecma::parser::{EsConfig, Syntax}, - ecma::transforms::react::jsx, - ecma::transforms::testing::{test, test_fixture}, -}; -use testing::fixture; fn syntax() -> Syntax { Syntax::Es(EsConfig { @@ -100,7 +102,7 @@ fn next_ssg_fixture(input: PathBuf) { let jsx = jsx::( tr.cm.clone(), None, - swc_core::ecma::transforms::react::Options { + next_binding::swc::core::ecma::transforms::react::Options { next: false.into(), runtime: None, import_source: Some("".into()), diff --git a/packages/next-swc/crates/core/tests/full.rs b/packages/next-swc/crates/core/tests/full.rs index 02e87ff6781cf11..d45ffe9cc4e78a9 100644 --- a/packages/next-swc/crates/core/tests/full.rs +++ b/packages/next-swc/crates/core/tests/full.rs @@ -1,20 +1,22 @@ +use next_binding::swc::{ + core::{ + base::Compiler, + common::comments::SingleThreadedComments, + ecma::parser::{Syntax, TsConfig}, + ecma::transforms::base::pass::noop, + }, + testing::{NormalizedOutput, Tester}, +}; use next_swc::{custom_before_pass, TransformOptions}; use serde::de::DeserializeOwned; use std::path::{Path, PathBuf}; -use swc_core::{ - base::Compiler, - common::comments::SingleThreadedComments, - ecma::parser::{Syntax, TsConfig}, - ecma::transforms::base::pass::noop, -}; -use testing::{NormalizedOutput, Tester}; -#[testing::fixture("tests/full/**/input.js")] +#[next_binding::swc::testing::fixture("tests/full/**/input.js")] fn full(input: PathBuf) { test(&input, true); } -#[testing::fixture("tests/loader/**/input.js")] +#[next_binding::swc::testing::fixture("tests/loader/**/input.js")] fn loader(input: PathBuf) { test(&input, false); } @@ -29,14 +31,14 @@ fn test(input: &Path, minify: bool) { let fm = cm.load_file(input).expect("failed to load file"); let options = TransformOptions { - swc: swc_core::base::config::Options { + swc: next_binding::swc::core::base::config::Options { swcrc: true, output_path: Some(output.clone()), - config: swc_core::base::config::Config { - is_module: swc_core::base::config::IsModule::Bool(true), + config: next_binding::swc::core::base::config::Config { + is_module: next_binding::swc::core::base::config::IsModule::Bool(true), - jsc: swc_core::base::config::JscConfig { + jsc: next_binding::swc::core::base::config::JscConfig { minify: if minify { Some(assert_json("{ \"compress\": true, \"mangle\": true }")) } else { diff --git a/packages/next-swc/crates/core/tests/telemetry.rs b/packages/next-swc/crates/core/tests/telemetry.rs index c0f99b160d21949..cbf2199a031851b 100644 --- a/packages/next-swc/crates/core/tests/telemetry.rs +++ b/packages/next-swc/crates/core/tests/telemetry.rs @@ -6,7 +6,7 @@ use fxhash::FxHashSet; use next_swc::next_ssg::next_ssg; use once_cell::sync::Lazy; -use swc_core::{ +use next_binding::swc::core::{ base::{try_with_handler, Compiler}, common::{comments::SingleThreadedComments, FileName, FilePathMapping, SourceMap, GLOBALS}, ecma::transforms::base::pass::noop, diff --git a/packages/next-swc/crates/napi/Cargo.toml b/packages/next-swc/crates/napi/Cargo.toml index 479fc76001449e8..51bd83b6055ba88 100644 --- a/packages/next-swc/crates/napi/Cargo.toml +++ b/packages/next-swc/crates/napi/Cargo.toml @@ -13,10 +13,7 @@ default = [] # when build (i.e napi --build --features plugin), same for the wasm as well. # this is due to some of transitive dependencies have features cannot be enabled at the same time # (i.e wasmer/default vs wasmer/js-default) while cargo merges all the features at once. -plugin = [ - "swc_core/plugin_transform_host_native", - "next-swc/plugin" -] +plugin = ["next-binding/__swc_core_binding_napi_plugin", "next-swc/plugin"] sentry_native_tls = ["_sentry_native_tls"] sentry_rustls = ["_sentry_rustls"] @@ -24,40 +21,28 @@ sentry_rustls = ["_sentry_rustls"] anyhow = "1.0.66" backtrace = "0.3" fxhash = "0.2.1" -napi = { version = "2", default-features = false, features = ["napi3", "serde-json", "tokio_rt", "error_anyhow"] } +napi = { version = "2", default-features = false, features = [ + "napi3", + "serde-json", + "tokio_rt", + "error_anyhow", +] } napi-derive = "2" -next-swc = {version = "0.0.0", path = "../core"} +next-swc = { version = "0.0.0", path = "../core" } once_cell = "1.13.0" serde = "1" serde_json = "1" -swc_core = { features = [ - "allocator_node", - "base_concurrent", # concurrent? - "base_node", - "common_concurrent", - "ecma_ast", - "ecma_loader_node", - "ecma_loader_lru", - "bundler", - "bundler_concurrent", - "ecma_codegen", - "ecma_minifier", - "ecma_parser", - "ecma_parser_typescript", - "ecma_transforms", - "ecma_transforms_optimization", - "ecma_transforms_react", - "ecma_transforms_typescript", - "ecma_utils", - "ecma_visit", -], version = "0.45.4" } tracing = { version = "0.1.37", features = ["release_max_level_info"] } tracing-futures = "0.2.5" tracing-subscriber = "0.3.9" tracing-chrome = "0.5.0" -next-dev = { git = "https://github.com/vercel/turbo.git", rev = "cc024fa59f1c3ad253e74eefe86e0386455455d1", features = ["serializable"] } -node-file-trace = { git = "https://github.com/vercel/turbo.git", rev = "cc024fa59f1c3ad253e74eefe86e0386455455d1", default-features = false, features = ["node-api"] } -mdxjs = { version = "0.1.3", features = ["serializable"] } +next-binding = { git = "https://github.com/vercel/turbo.git", rev = "cc024fa59f1c3ad253e74eefe86e0386455455d1", features = [ + "__swc_core_binding_napi", + "__turbo_next_dev_server", + "__turbo_node_file_trace", + "__feature_mdx_rs", +] } + # There are few build targets we can't use native-tls which default features rely on, # allow to specify alternative (rustls) instead via features. # Note to opt in rustls default-features should be disabled @@ -68,7 +53,7 @@ _sentry_rustls = { package = "sentry", version = "0.27.0", default-features = fa "contexts", "panic", "rustls", - "reqwest" + "reqwest", ], optional = true } [build-dependencies] diff --git a/packages/next-swc/crates/napi/src/lib.rs b/packages/next-swc/crates/napi/src/lib.rs index acdfd2d187a06d0..2ef6b0548b57cd6 100644 --- a/packages/next-swc/crates/napi/src/lib.rs +++ b/packages/next-swc/crates/napi/src/lib.rs @@ -32,14 +32,14 @@ DEALINGS IN THE SOFTWARE. #[macro_use] extern crate napi_derive; /// Explicit extern crate to use allocator. -extern crate swc_core; +extern crate next_binding; use std::{env, panic::set_hook, sync::Arc}; use backtrace::Backtrace; use fxhash::FxHashSet; use napi::bindgen_prelude::*; -use swc_core::{ +use next_binding::swc::core::{ base::{Compiler, TransformOutput}, common::{sync::Lazy, FilePathMapping, SourceMap}, }; diff --git a/packages/next-swc/crates/napi/src/mdx.rs b/packages/next-swc/crates/napi/src/mdx.rs index f0bea1073ecc5c1..999fd7f37d17ebf 100644 --- a/packages/next-swc/crates/napi/src/mdx.rs +++ b/packages/next-swc/crates/napi/src/mdx.rs @@ -1,5 +1,5 @@ -use mdxjs::{compile, Options}; use napi::bindgen_prelude::*; +use next_binding::features::mdxjs::{compile, Options}; pub struct MdxCompileTask { pub input: String, diff --git a/packages/next-swc/crates/napi/src/minify.rs b/packages/next-swc/crates/napi/src/minify.rs index 7845566291291e2..fb9ac27c451dd20 100644 --- a/packages/next-swc/crates/napi/src/minify.rs +++ b/packages/next-swc/crates/napi/src/minify.rs @@ -29,18 +29,18 @@ use std::sync::Arc; use fxhash::FxHashMap; use napi::bindgen_prelude::*; -use serde::Deserialize; -use swc_core::{ +use next_binding::swc::core::{ base::{try_with_handler, TransformOutput}, common::{errors::ColorConfig, sync::Lrc, FileName, SourceFile, SourceMap, GLOBALS}, }; +use serde::Deserialize; use crate::{get_compiler, util::MapErr}; pub struct MinifyTask { - c: Arc, + c: Arc, code: MinifyTarget, - opts: swc_core::base::config::JsMinifyOptions, + opts: next_binding::swc::core::base::config::JsMinifyOptions, } #[derive(Deserialize)] @@ -80,7 +80,7 @@ impl Task for MinifyTask { fn compute(&mut self) -> napi::Result { try_with_handler( self.c.cm.clone(), - swc_core::base::HandlerOpts { + next_binding::swc::core::base::HandlerOpts { color: ColorConfig::Never, skip_filename: true, }, @@ -127,7 +127,7 @@ pub fn minify_sync(input: Buffer, opts: Buffer) -> napi::Result try_with_handler( c.cm.clone(), - swc_core::base::HandlerOpts { + next_binding::swc::core::base::HandlerOpts { color: ColorConfig::Never, skip_filename: true, }, diff --git a/packages/next-swc/crates/napi/src/parse.rs b/packages/next-swc/crates/napi/src/parse.rs index 540ed746a9f897c..bdd49b830775221 100644 --- a/packages/next-swc/crates/napi/src/parse.rs +++ b/packages/next-swc/crates/napi/src/parse.rs @@ -2,7 +2,7 @@ use std::sync::Arc; use anyhow::Context as _; use napi::bindgen_prelude::*; -use swc_core::{ +use next_binding::swc::core::{ base::{config::ParseOptions, try_with_handler}, common::{ comments::Comments, errors::ColorConfig, FileName, FilePathMapping, SourceMap, GLOBALS, @@ -24,8 +24,9 @@ impl Task for ParseTask { fn compute(&mut self) -> napi::Result { GLOBALS.set(&Default::default(), || { - let c = - swc_core::base::Compiler::new(Arc::new(SourceMap::new(FilePathMapping::empty()))); + let c = next_binding::swc::core::base::Compiler::new(Arc::new(SourceMap::new( + FilePathMapping::empty(), + ))); let options: ParseOptions = serde_json::from_slice(self.options.as_ref())?; let comments = c.comments().clone(); @@ -38,7 +39,7 @@ impl Task for ParseTask { c.cm.new_source_file(self.filename.clone(), self.src.clone()); let program = try_with_handler( c.cm.clone(), - swc_core::base::HandlerOpts { + next_binding::swc::core::base::HandlerOpts { color: ColorConfig::Never, skip_filename: false, }, diff --git a/packages/next-swc/crates/napi/src/transform.rs b/packages/next-swc/crates/napi/src/transform.rs index f1104fb5f20e0da..1d2b40d37d3bd13 100644 --- a/packages/next-swc/crates/napi/src/transform.rs +++ b/packages/next-swc/crates/napi/src/transform.rs @@ -37,13 +37,12 @@ use std::{ use anyhow::{anyhow, bail, Context as _}; use fxhash::FxHashSet; use napi::bindgen_prelude::*; -use next_swc::{custom_before_pass, TransformOptions}; -use swc_core::common::comments::SingleThreadedComments; -use swc_core::{ +use next_binding::swc::core::{ base::{try_with_handler, Compiler, TransformOutput}, - common::{errors::ColorConfig, FileName, GLOBALS}, + common::{comments::SingleThreadedComments, errors::ColorConfig, FileName, GLOBALS}, ecma::transforms::base::pass::noop, }; +use next_swc::{custom_before_pass, TransformOptions}; use crate::{complete_output, get_compiler, util::MapErr}; @@ -72,7 +71,7 @@ impl Task for TransformTask { let res = catch_unwind(AssertUnwindSafe(|| { try_with_handler( self.c.cm.clone(), - swc_core::base::HandlerOpts { + next_binding::swc::core::base::HandlerOpts { color: ColorConfig::Never, skip_filename: true, }, diff --git a/packages/next-swc/crates/napi/src/turbopack.rs b/packages/next-swc/crates/napi/src/turbopack.rs index a51bb50b9b5cb5d..61ea6f3689147a7 100644 --- a/packages/next-swc/crates/napi/src/turbopack.rs +++ b/packages/next-swc/crates/napi/src/turbopack.rs @@ -1,6 +1,6 @@ use crate::util::MapErr; use napi::bindgen_prelude::*; -use next_dev::{devserver_options::DevServerOptions, start_server}; +use next_binding::turbo::next_dev::{devserver_options::DevServerOptions, start_server}; #[napi] pub async fn start_turbo_dev(options: Buffer) -> napi::Result<()> { diff --git a/packages/next-swc/crates/napi/src/turbotrace.rs b/packages/next-swc/crates/napi/src/turbotrace.rs index 05b046ab5f7fb2f..b1006276917a838 100644 --- a/packages/next-swc/crates/napi/src/turbotrace.rs +++ b/packages/next-swc/crates/napi/src/turbotrace.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use napi::bindgen_prelude::*; -use node_file_trace::{start, Args}; +use next_binding::turbo::node_file_trace::{start, Args}; #[napi] pub async fn run_turbo_tracing(options: Buffer) -> napi::Result> { diff --git a/packages/next-swc/crates/wasm/Cargo.toml b/packages/next-swc/crates/wasm/Cargo.toml index 968c9f8fe2e93d1..894b9860ddabac4 100644 --- a/packages/next-swc/crates/wasm/Cargo.toml +++ b/packages/next-swc/crates/wasm/Cargo.toml @@ -13,7 +13,7 @@ swc_v1 = [] plugin = [ "getrandom/js", - "swc_core/plugin_transform_host_js" + "next-binding/__swc_core_binding_wasm_plugin" ] [dependencies] @@ -31,22 +31,10 @@ wasm-bindgen-futures = "0.4.8" getrandom = { version = "0.2.5", optional = true, default-features = false } js-sys = "0.3.59" serde-wasm-bindgen = "0.4.3" -mdxjs = { version = "0.1.3", features = ["serializable"] } - -swc_core = { features = [ - "common_concurrent", - "binding_macro_wasm", - "ecma_codegen", - "ecma_minifier", - "ecma_transforms", - "ecma_transforms_typescript", - "ecma_transforms_optimization", - "ecma_transforms_react", - "ecma_parser", - "ecma_parser_typescript", - "ecma_utils", - "ecma_visit" -], version = "0.45.4" } +next-binding = { git = "https://github.com/vercel/turbo.git", rev = "cc024fa59f1c3ad253e74eefe86e0386455455d1", features = [ + "__swc_core_binding_wasm", + "__feature_mdx_rs", +] } # Workaround a bug diff --git a/packages/next-swc/crates/wasm/src/lib.rs b/packages/next-swc/crates/wasm/src/lib.rs index 1b16b6a79bd1f82..5ebef8613c2b970 100644 --- a/packages/next-swc/crates/wasm/src/lib.rs +++ b/packages/next-swc/crates/wasm/src/lib.rs @@ -5,7 +5,7 @@ use std::sync::Arc; use wasm_bindgen::{prelude::*, JsCast}; use wasm_bindgen_futures::future_to_promise; -use swc_core::{ +use next_binding::swc::core::{ base::{config::JsMinifyOptions, config::ParseOptions, try_with_handler, Compiler}, common::{ comments::{Comments, SingleThreadedComments}, @@ -31,7 +31,7 @@ pub fn minify_sync(s: JsString, opts: JsValue) -> Result { let value = try_with_handler( c.cm.clone(), - swc_core::base::HandlerOpts { + next_binding::swc::core::base::HandlerOpts { color: ColorConfig::Never, skip_filename: false, }, @@ -68,7 +68,7 @@ pub fn transform_sync(s: JsValue, opts: JsValue) -> Result { let s = s.dyn_into::(); let out = try_with_handler( c.cm.clone(), - swc_core::base::HandlerOpts { + next_binding::swc::core::base::HandlerOpts { color: ColorConfig::Never, skip_filename: false, }, @@ -133,12 +133,14 @@ pub fn transform(s: JsValue, opts: JsValue) -> js_sys::Promise { pub fn parse_sync(s: JsString, opts: JsValue) -> Result { console_error_panic_hook::set_once(); - let c = swc_core::base::Compiler::new(Arc::new(SourceMap::new(FilePathMapping::empty()))); + let c = next_binding::swc::core::base::Compiler::new(Arc::new(SourceMap::new( + FilePathMapping::empty(), + ))); let opts: ParseOptions = serde_wasm_bindgen::from_value(opts)?; try_with_handler( c.cm.clone(), - swc_core::base::HandlerOpts { + next_binding::swc::core::base::HandlerOpts { ..Default::default() }, |handler| { diff --git a/packages/next-swc/crates/wasm/src/mdx.rs b/packages/next-swc/crates/wasm/src/mdx.rs index 0186a9d7a1fe9c8..616d72417e064e1 100644 --- a/packages/next-swc/crates/wasm/src/mdx.rs +++ b/packages/next-swc/crates/wasm/src/mdx.rs @@ -1,5 +1,5 @@ use js_sys::JsString; -use mdxjs::{compile, Options}; +use next_binding::features::mdxjs::{compile, Options}; use wasm_bindgen::prelude::*; use wasm_bindgen_futures::future_to_promise;