From f1994dcbd5fc438c4b43d67b89a7b8c45b6db8be Mon Sep 17 00:00:00 2001 From: Will Binns-Smith Date: Wed, 15 Mar 2023 14:32:36 -0700 Subject: [PATCH 1/4] Align on next-transform-font Fixes NEXT-827 This aligns use of the next/font transform across the workspace under a single crate, now called `next-transform-font`. --- packages/next-swc/Cargo.lock | 23 ++++++++++--------- packages/next-swc/Cargo.toml | 4 ++-- packages/next-swc/crates/core/Cargo.toml | 1 + packages/next-swc/crates/core/src/lib.rs | 6 ++--- packages/next-swc/crates/next-core/Cargo.toml | 2 +- .../next-core/src/next_shared/transforms.rs | 2 +- .../crates/next-transform-font/Cargo.toml | 15 ++++++++++++ .../find_functions_outside_module_scope.rs | 12 ++++++---- .../src}/font_functions_collector.rs | 13 +++++++---- .../src}/font_imports_generator.rs | 13 +++++++---- .../mod.rs => next-transform-font/src/lib.rs} | 10 ++++---- 11 files changed, 63 insertions(+), 38 deletions(-) create mode 100644 packages/next-swc/crates/next-transform-font/Cargo.toml rename packages/next-swc/crates/{core/src/next_font_loaders => next-transform-font/src}/find_functions_outside_module_scope.rs (78%) rename packages/next-swc/crates/{core/src/next_font_loaders => next-transform-font/src}/font_functions_collector.rs (90%) rename packages/next-swc/crates/{core/src/next_font_loaders => next-transform-font/src}/font_imports_generator.rs (97%) rename packages/next-swc/crates/{core/src/next_font_loaders/mod.rs => next-transform-font/src/lib.rs} (95%) diff --git a/packages/next-swc/Cargo.lock b/packages/next-swc/Cargo.lock index 45052e274e03..40191119b09d 100644 --- a/packages/next-swc/Cargo.lock +++ b/packages/next-swc/Cargo.lock @@ -3130,8 +3130,8 @@ dependencies = [ "indexmap", "indoc", "mime", - "next-font", "next-transform-dynamic", + "next-transform-font", "next-transform-strip-page-exports", "once_cell", "qstring", @@ -3232,16 +3232,6 @@ dependencies = [ "webbrowser", ] -[[package]] -name = "next-font" -version = "0.1.0" -dependencies = [ - "rustc-hash", - "serde", - "serde_json", - "swc_core", -] - [[package]] name = "next-swc" version = "0.0.0" @@ -3252,6 +3242,7 @@ dependencies = [ "fxhash", "hex", "next-binding", + "next-transform-font", "once_cell", "pathdiff", "regex", @@ -3297,6 +3288,16 @@ dependencies = [ "testing", ] +[[package]] +name = "next-transform-font" +version = "0.1.0" +dependencies = [ + "rustc-hash", + "serde", + "serde_json", + "swc_core", +] + [[package]] name = "next-transform-strip-page-exports" version = "0.1.0" diff --git a/packages/next-swc/Cargo.toml b/packages/next-swc/Cargo.toml index d77df6823513..8e8e1b182ae9 100644 --- a/packages/next-swc/Cargo.toml +++ b/packages/next-swc/Cargo.toml @@ -8,7 +8,7 @@ members = [ "crates/next-core", "crates/next-dev", "crates/next-dev-tests", - "crates/next-font", + "crates/next-transform-font", "crates/next-transform-dynamic", "crates/next-transform-strip-page-exports", ] @@ -29,7 +29,7 @@ next-binding = { path = "crates/next-binding" } next-core = { path = "crates/next-core", default-features = false } next-dev = { path = "crates/next-dev" } next-dev-tests = { path = "crates/next-dev-tests" } -next-font = { path = "crates/next-font" } +next-transform-font = { path = "crates/next-transform-font" } next-transform-dynamic = { path = "crates/next-transform-dynamic" } next-transform-strip-page-exports = { path = "crates/next-transform-strip-page-exports" } diff --git a/packages/next-swc/crates/core/Cargo.toml b/packages/next-swc/crates/core/Cargo.toml index 357a2f82d64c..0dbf26ef648d 100644 --- a/packages/next-swc/crates/core/Cargo.toml +++ b/packages/next-swc/crates/core/Cargo.toml @@ -14,6 +14,7 @@ either = "1" fxhash = "0.2.1" hex = "0.4.3" once_cell = "1.13.0" +next-transform-font = {"workspace" = true} pathdiff = "0.2.0" regex = "1.5" serde = "1" diff --git a/packages/next-swc/crates/core/src/lib.rs b/packages/next-swc/crates/core/src/lib.rs index b5f8090b3b6d..f33bfbfb0b01 100644 --- a/packages/next-swc/crates/core/src/lib.rs +++ b/packages/next-swc/crates/core/src/lib.rs @@ -34,6 +34,7 @@ use auto_cjs::contains_cjs; use either::Either; use fxhash::FxHashSet; +use next_transform_font::next_font_loaders; use serde::Deserialize; use std::cell::RefCell; use std::rc::Rc; @@ -51,7 +52,6 @@ pub mod amp_attributes; mod auto_cjs; pub mod disallow_re_export_all_in_page; pub mod next_dynamic; -pub mod next_font_loaders; pub mod next_ssg; pub mod page_config; pub mod react_remove_properties; @@ -125,7 +125,7 @@ pub struct TransformOptions { pub modularize_imports: Option, #[serde(default)] - pub font_loaders: Option, + pub font_loaders: Option, #[serde(default)] pub server_actions: Option, @@ -257,7 +257,7 @@ where None => Either::Right(noop()), }, match &opts.font_loaders { - Some(config) => Either::Left(next_font_loaders::next_font_loaders(config.clone())), + Some(config) => Either::Left(next_font_loaders(config.clone())), None => Either::Right(noop()), }, match &opts.server_actions { diff --git a/packages/next-swc/crates/next-core/Cargo.toml b/packages/next-swc/crates/next-core/Cargo.toml index 4c361d6fdc98..2292683878c7 100644 --- a/packages/next-swc/crates/next-core/Cargo.toml +++ b/packages/next-swc/crates/next-core/Cargo.toml @@ -31,7 +31,7 @@ turbopack-ecmascript = { workspace = true } turbopack-env = { workspace = true } turbopack-node = { workspace = true } next-transform-strip-page-exports = { workspace = true } -next-font = { workspace = true } +next-transform-font = { workspace = true } next-transform-dynamic = { workspace = true } swc_core = { workspace = true, features = ["ecma_ast", "common"] } diff --git a/packages/next-swc/crates/next-core/src/next_shared/transforms.rs b/packages/next-swc/crates/next-core/src/next_shared/transforms.rs index d21000a60778..a0e266f4fc78 100644 --- a/packages/next-swc/crates/next-core/src/next_shared/transforms.rs +++ b/packages/next-swc/crates/next-core/src/next_shared/transforms.rs @@ -147,7 +147,7 @@ struct NextJsFont { impl CustomTransformer for NextJsFont { fn transform(&self, program: &mut Program, ctx: &TransformContext<'_>) -> Option { - let mut next_font = next_font::next_font_loaders(next_font::Config { + let mut next_font = next_transform_font::next_font_loaders(next_transform_font::Config { font_loaders: self.font_loaders.clone(), relative_file_path_from_root: ctx.file_name_str.into(), }); diff --git a/packages/next-swc/crates/next-transform-font/Cargo.toml b/packages/next-swc/crates/next-transform-font/Cargo.toml new file mode 100644 index 000000000000..a91c28309427 --- /dev/null +++ b/packages/next-swc/crates/next-transform-font/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "next-transform-font" +version = "0.1.0" +description = "TBD" +license = "MPL-2.0" +edition = "2021" + +[lib] +bench = false + +[dependencies] +rustc-hash = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +swc_core = { workspace = true } diff --git a/packages/next-swc/crates/core/src/next_font_loaders/find_functions_outside_module_scope.rs b/packages/next-swc/crates/next-transform-font/src/find_functions_outside_module_scope.rs similarity index 78% rename from packages/next-swc/crates/core/src/next_font_loaders/find_functions_outside_module_scope.rs rename to packages/next-swc/crates/next-transform-font/src/find_functions_outside_module_scope.rs index 3ccf5af4d1a6..902fedd7326f 100644 --- a/packages/next-swc/crates/core/src/next_font_loaders/find_functions_outside_module_scope.rs +++ b/packages/next-swc/crates/next-transform-font/src/find_functions_outside_module_scope.rs @@ -1,8 +1,10 @@ -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; - +use swc_core::{ + common::errors::HANDLER, + ecma::{ + ast::*, + visit::{noop_visit_type, 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/next-transform-font/src/font_functions_collector.rs similarity index 90% rename from packages/next-swc/crates/core/src/next_font_loaders/font_functions_collector.rs rename to packages/next-swc/crates/next-transform-font/src/font_functions_collector.rs index 2465e885ace6..1cd2e2c7f62b 100644 --- a/packages/next-swc/crates/core/src/next_font_loaders/font_functions_collector.rs +++ b/packages/next-swc/crates/next-transform-font/src/font_functions_collector.rs @@ -1,8 +1,11 @@ -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; +use swc_core::{ + common::errors::HANDLER, + ecma::{ + ast::*, + atoms::JsWord, + visit::{noop_visit_type, 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/next-transform-font/src/font_imports_generator.rs similarity index 97% rename from packages/next-swc/crates/core/src/next_font_loaders/font_imports_generator.rs rename to packages/next-swc/crates/next-transform-font/src/font_imports_generator.rs index c80e24f85c80..cc7bfeb6c324 100644 --- a/packages/next-swc/crates/core/src/next_font_loaders/font_imports_generator.rs +++ b/packages/next-swc/crates/next-transform-font/src/font_imports_generator.rs @@ -1,9 +1,12 @@ -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, Spanned, DUMMY_SP}, + ecma::{ + ast::*, + atoms::JsWord, + 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/next-transform-font/src/lib.rs similarity index 95% rename from packages/next-swc/crates/core/src/next_font_loaders/mod.rs rename to packages/next-swc/crates/next-transform-font/src/lib.rs index 28f4cac2b83c..aa29d03a1d15 100644 --- a/packages/next-swc/crates/core/src/next_font_loaders/mod.rs +++ b/packages/next-swc/crates/next-transform-font/src/lib.rs @@ -1,13 +1,13 @@ -use fxhash::FxHashSet; -use next_binding::swc::core::{ +use rustc_hash::FxHashSet; +use serde::Deserialize; +use swc_core::{ common::{collections::AHashMap, BytePos, Spanned}, ecma::{ - ast::Id, + ast::{Id, ModuleItem}, + atoms::JsWord, visit::{as_folder, noop_visit_mut_type, Fold, VisitMut, VisitWith}, }, - ecma::{ast::ModuleItem, atoms::JsWord}, }; -use serde::Deserialize; mod find_functions_outside_module_scope; mod font_functions_collector; From 356ba20504f7e7237e404ed5ae204af007bde0dc Mon Sep 17 00:00:00 2001 From: Will Binns-Smith Date: Wed, 15 Mar 2023 15:03:30 -0700 Subject: [PATCH 2/4] fixup! Align on next-transform-font --- packages/next-swc/crates/core/tests/errors.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next-swc/crates/core/tests/errors.rs b/packages/next-swc/crates/core/tests/errors.rs index 603b77d79826..19aa76cb71b9 100644 --- a/packages/next-swc/crates/core/tests/errors.rs +++ b/packages/next-swc/crates/core/tests/errors.rs @@ -14,11 +14,11 @@ use next_binding::swc::{ use next_swc::{ disallow_re_export_all_in_page::disallow_re_export_all_in_page, next_dynamic::next_dynamic, - next_font_loaders::{next_font_loaders, Config as FontLoaderConfig}, next_ssg::next_ssg, react_server_components::server_components, server_actions::{self, server_actions}, }; +use next_transform_font::{next_font_loaders, Config as FontLoaderConfig}; use std::path::PathBuf; fn syntax() -> Syntax { From 9231dc30838a0b5a23ba2156fc11839226ccc300 Mon Sep 17 00:00:00 2001 From: Will Binns-Smith Date: Wed, 15 Mar 2023 15:19:57 -0700 Subject: [PATCH 3/4] fixup! fixup! Align on next-transform-font --- .../src/google/validate-google-font-function-call.ts | 2 +- .../src/local/get-fallback-metrics-from-font-file.ts | 11 +++++++++++ .../src/local/validate-local-font-function-call.ts | 2 +- packages/next-swc/crates/core/tests/fixture.rs | 2 +- .../build/webpack/loaders/next-font-loader/index.ts | 2 +- .../wellknown-errors-plugin/parseNextFontError.ts | 2 +- .../wellknown-errors-plugin/parseNotFoundError.ts | 2 +- 7 files changed, 17 insertions(+), 6 deletions(-) diff --git a/packages/font/src/google/validate-google-font-function-call.ts b/packages/font/src/google/validate-google-font-function-call.ts index 218e026cfcff..3e4daf9e305a 100644 --- a/packages/font/src/google/validate-google-font-function-call.ts +++ b/packages/font/src/google/validate-google-font-function-call.ts @@ -16,7 +16,7 @@ type FontOptions = { subsets: string[] } /** - * Validate the data recieved from next-swc next_font_loaders on next/font/google calls + * Validate the data recieved from next-swc next-transform-font on next/font/google calls */ export function validateGoogleFontFunctionCall( functionName: string, diff --git a/packages/font/src/local/get-fallback-metrics-from-font-file.ts b/packages/font/src/local/get-fallback-metrics-from-font-file.ts index eb4891f8c4bf..57a7dd7c7b90 100644 --- a/packages/font/src/local/get-fallback-metrics-from-font-file.ts +++ b/packages/font/src/local/get-fallback-metrics-from-font-file.ts @@ -80,6 +80,17 @@ export function getFallbackMetricsFromFontFile( const azAvgWidth = calcAverageWidth(font) const { ascent, descent, lineGap, unitsPerEm } = font + console.log( + 'ascent', + ascent, + 'descent', + descent, + 'lineGap', + lineGap, + 'unitsPerEm', + unitsPerEm + ) + const fallbackFontAvgWidth = fallbackFont.azAvgWidth / fallbackFont.unitsPerEm let sizeAdjust = azAvgWidth ? azAvgWidth / unitsPerEm / fallbackFontAvgWidth diff --git a/packages/font/src/local/validate-local-font-function-call.ts b/packages/font/src/local/validate-local-font-function-call.ts index 8256cd2dd68f..9424e36a78df 100644 --- a/packages/font/src/local/validate-local-font-function-call.ts +++ b/packages/font/src/local/validate-local-font-function-call.ts @@ -29,7 +29,7 @@ type FontOptions = { } /** - * Validate the data recieved from next-swc next_font_loaders on next/font/local calls + * Validate the data recieved from next-swc next-transform-font on next/font/local calls */ export function validateLocalFontFunctionCall( functionName: string, diff --git a/packages/next-swc/crates/core/tests/fixture.rs b/packages/next-swc/crates/core/tests/fixture.rs index 0c85c1aaac73..58446d94c980 100644 --- a/packages/next-swc/crates/core/tests/fixture.rs +++ b/packages/next-swc/crates/core/tests/fixture.rs @@ -11,7 +11,6 @@ use next_binding::swc::{ use next_swc::{ amp_attributes::amp_attributes, next_dynamic::next_dynamic, - next_font_loaders::{next_font_loaders, Config as FontLoaderConfig}, next_ssg::next_ssg, page_config::page_config_test, react_remove_properties::remove_properties, @@ -21,6 +20,7 @@ use next_swc::{ server_actions::{self, server_actions}, shake_exports::{shake_exports, Config as ShakeExportsConfig}, }; +use next_transform_font::{next_font_loaders, Config as FontLoaderConfig}; use std::path::PathBuf; fn syntax() -> Syntax { diff --git a/packages/next/src/build/webpack/loaders/next-font-loader/index.ts b/packages/next/src/build/webpack/loaders/next-font-loader/index.ts index 3d2ac2d611fd..0deb4694268d 100644 --- a/packages/next/src/build/webpack/loaders/next-font-loader/index.ts +++ b/packages/next/src/build/webpack/loaders/next-font-loader/index.ts @@ -13,7 +13,7 @@ export default async function nextFontLoader(this: any) { const callback = this.async() /** - * The next-swc plugin next_font_loaders turns font function calls into CSS imports. + * The next-swc plugin next-transform-font turns font function calls into CSS imports. * At the end of the import, it adds the call arguments and some additional data as a resourceQuery. * e.g: * const inter = Inter({ subset: ['latin'] }) diff --git a/packages/next/src/build/webpack/plugins/wellknown-errors-plugin/parseNextFontError.ts b/packages/next/src/build/webpack/plugins/wellknown-errors-plugin/parseNextFontError.ts index 217cbe9c0faa..7132c71e8cd7 100644 --- a/packages/next/src/build/webpack/plugins/wellknown-errors-plugin/parseNextFontError.ts +++ b/packages/next/src/build/webpack/plugins/wellknown-errors-plugin/parseNextFontError.ts @@ -15,7 +15,7 @@ export function getNextFontError( } // Parse the query and get the path of the file where the font function was called. - // provided by next-swc next_font_loaders + // provided by next-swc next-transform-font const file = JSON.parse(resourceResolveData.query.slice(1)).path if (err.name === 'NextFontError') { diff --git a/packages/next/src/build/webpack/plugins/wellknown-errors-plugin/parseNotFoundError.ts b/packages/next/src/build/webpack/plugins/wellknown-errors-plugin/parseNotFoundError.ts index 111ad984b690..99ee9ce189fe 100644 --- a/packages/next/src/build/webpack/plugins/wellknown-errors-plugin/parseNotFoundError.ts +++ b/packages/next/src/build/webpack/plugins/wellknown-errors-plugin/parseNotFoundError.ts @@ -87,7 +87,7 @@ function getFormattedFileName( ) ) { // Parse the query and get the path of the file where the font function was called. - // provided by next-swc next_font_loaders + // provided by next-swc next-transform-font return JSON.parse(module.resourceResolveData.query.slice(1)).path } else { let formattedFileName: string = chalk.cyan(fileName) From b183d6cae69e463dc539f98cb7815d91340fc485 Mon Sep 17 00:00:00 2001 From: Will Binns-Smith Date: Wed, 15 Mar 2023 16:17:50 -0700 Subject: [PATCH 4/4] fixup! fixup! fixup! Align on next-transform-font --- .../src/local/get-fallback-metrics-from-font-file.ts | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/packages/font/src/local/get-fallback-metrics-from-font-file.ts b/packages/font/src/local/get-fallback-metrics-from-font-file.ts index 57a7dd7c7b90..eb4891f8c4bf 100644 --- a/packages/font/src/local/get-fallback-metrics-from-font-file.ts +++ b/packages/font/src/local/get-fallback-metrics-from-font-file.ts @@ -80,17 +80,6 @@ export function getFallbackMetricsFromFontFile( const azAvgWidth = calcAverageWidth(font) const { ascent, descent, lineGap, unitsPerEm } = font - console.log( - 'ascent', - ascent, - 'descent', - descent, - 'lineGap', - lineGap, - 'unitsPerEm', - unitsPerEm - ) - const fallbackFontAvgWidth = fallbackFont.azAvgWidth / fallbackFont.unitsPerEm let sizeAdjust = azAvgWidth ? azAvgWidth / unitsPerEm / fallbackFontAvgWidth