diff --git a/docs/advanced-features/compiler.md b/docs/advanced-features/compiler.md index fb022c383f6c..3f2bb69033ef 100644 --- a/docs/advanced-features/compiler.md +++ b/docs/advanced-features/compiler.md @@ -358,7 +358,7 @@ This transform uses [handlebars](https://docs.rs/handlebars) to template the rep 1. `matches`: Has type `string[]`. All groups matched by the regular expression. `matches.[0]` is the full match. 2. `member`: Has type `string`. The name of the member import. -3. `lowerCase`, `upperCase`, `camelCase`: Helper functions to convert a string to lower, upper or camel cases. +3. `lowerCase`, `upperCase`, `camelCase`, `kebabCase`: Helper functions to convert a string to lower, upper, camel or kebab cases. ### SWC Trace profiling diff --git a/packages/next-swc/Cargo.lock b/packages/next-swc/Cargo.lock index 73033e3bdd84..18b43ccfe5c1 100644 --- a/packages/next-swc/Cargo.lock +++ b/packages/next-swc/Cargo.lock @@ -343,6 +343,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +[[package]] +name = "convert_case" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb4a24b1aaf0fd0ce8b45161144d6f42cd91677fd5940fd431183eb023b3a2b8" + [[package]] name = "core-foundation" version = "0.9.3" @@ -1477,6 +1483,7 @@ dependencies = [ name = "modularize_imports" version = "0.14.0" dependencies = [ + "convert_case", "handlebars", "once_cell", "regex", diff --git a/packages/next-swc/crates/modularize_imports/Cargo.toml b/packages/next-swc/crates/modularize_imports/Cargo.toml index 5a4617984f7b..209795773e17 100644 --- a/packages/next-swc/crates/modularize_imports/Cargo.toml +++ b/packages/next-swc/crates/modularize_imports/Cargo.toml @@ -10,6 +10,7 @@ version = "0.14.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +convert_case = "0.5.0" handlebars = "4.2.1" once_cell = "1.13.0" regex = "1.5" diff --git a/packages/next-swc/crates/modularize_imports/src/lib.rs b/packages/next-swc/crates/modularize_imports/src/lib.rs index 5322f9d872d2..f76a78e2df62 100644 --- a/packages/next-swc/crates/modularize_imports/src/lib.rs +++ b/packages/next-swc/crates/modularize_imports/src/lib.rs @@ -1,6 +1,6 @@ -use std::borrow::Cow; use std::collections::HashMap; +use convert_case::{Case, Casing}; use handlebars::{Context, Handlebars, Helper, HelperResult, Output, RenderContext}; use once_cell::sync::Lazy; use regex::{Captures, Regex}; @@ -175,6 +175,9 @@ pub fn modularize_imports(config: Config) -> impl Fold { folder .renderer .register_helper("camelCase", Box::new(helper_camel_case)); + folder + .renderer + .register_helper("kebabCase", Box::new(helper_kebab_case)); for (mut k, v) in config.packages { // XXX: Should we keep this hack? if !k.starts_with('^') && !k.ends_with('$') { @@ -223,13 +226,21 @@ fn helper_camel_case( ) -> HelperResult { // get parameter from helper or throw an error let param = h.param(0).and_then(|v| v.value().as_str()).unwrap_or(""); - let value = if param.is_empty() || param.chars().next().unwrap().is_lowercase() { - Cow::Borrowed(param) - } else { - let mut it = param.chars(); - let fst = it.next().unwrap(); - Cow::Owned(fst.to_lowercase().chain(it).collect::()) - }; - out.write(value.as_ref())?; + + out.write(param.to_case(Case::Camel).as_ref())?; + Ok(()) +} + +fn helper_kebab_case( + h: &Helper<'_, '_>, + _: &Handlebars<'_>, + _: &Context, + _: &mut RenderContext<'_, '_>, + out: &mut dyn Output, +) -> HelperResult { + // get parameter from helper or throw an error + let param = h.param(0).and_then(|v| v.value().as_str()).unwrap_or(""); + + out.write(param.to_case(Case::Kebab).as_ref())?; Ok(()) } diff --git a/packages/next-swc/crates/modularize_imports/tests/fixture.rs b/packages/next-swc/crates/modularize_imports/tests/fixture.rs index 4d1c06aa5161..7aeb9e20fef4 100644 --- a/packages/next-swc/crates/modularize_imports/tests/fixture.rs +++ b/packages/next-swc/crates/modularize_imports/tests/fixture.rs @@ -44,6 +44,14 @@ fn modularize_imports_fixture(input: PathBuf) { skip_default_conversion: true, }, ), + ( + "my-library-3".to_string(), + PackageConfig { + transform: "my-library-3/{{ kebabCase member }}".into(), + prevent_full_import: false, + skip_default_conversion: true, + }, + ), ] .into_iter() .collect(), diff --git a/packages/next-swc/crates/modularize_imports/tests/fixture/simple/input.js b/packages/next-swc/crates/modularize_imports/tests/fixture/simple/input.js index f152bdc8f19d..5b6c7a587c69 100644 --- a/packages/next-swc/crates/modularize_imports/tests/fixture/simple/input.js +++ b/packages/next-swc/crates/modularize_imports/tests/fixture/simple/input.js @@ -1,2 +1,3 @@ import { Grid, Row, Col as Col1 } from 'react-bootstrap'; import { MyModule, Widget } from 'my-library-2'; +import { MyModule } from 'my-library-3'; diff --git a/packages/next-swc/crates/modularize_imports/tests/fixture/simple/output.js b/packages/next-swc/crates/modularize_imports/tests/fixture/simple/output.js index 899d45bc9ec0..ba5cdf371405 100644 --- a/packages/next-swc/crates/modularize_imports/tests/fixture/simple/output.js +++ b/packages/next-swc/crates/modularize_imports/tests/fixture/simple/output.js @@ -3,3 +3,4 @@ import Row from "react-bootstrap/lib/Row"; import Col1 from "react-bootstrap/lib/Col"; import { MyModule } from "my-library-2/myModule"; import { Widget } from "my-library-2/widget"; +import { MyModule } from "my-library-3/my-module";