diff --git a/.changeset/tame-berries-jam.md b/.changeset/tame-berries-jam.md
new file mode 100644
index 00000000..8080213f
--- /dev/null
+++ b/.changeset/tame-berries-jam.md
@@ -0,0 +1,5 @@
+---
+"@devup-ui/wasm": patch
+---
+
+Fix classname order issue
diff --git a/libs/extractor/src/lib.rs b/libs/extractor/src/lib.rs
index 2a2eae77..74b53a4f 100644
--- a/libs/extractor/src/lib.rs
+++ b/libs/extractor/src/lib.rs
@@ -570,6 +570,40 @@ mod tests {
)
.unwrap()
));
+
+ reset_class_map();
+ assert_debug_snapshot!(ToBTreeSet::from(
+ extract(
+ "test.tsx",
+ r#"import {Box as C} from '@devup-ui/core'
+
+ "#,
+ ExtractOption {
+ package: "@devup-ui/core".to_string(),
+ css_file: None
+ }
+ )
+ .unwrap()
+ ));
+
+ reset_class_map();
+ assert_debug_snapshot!(ToBTreeSet::from(
+ extract(
+ "test.tsx",
+ r#"import {Box as C} from '@devup-ui/core'
+
+ "#,
+ ExtractOption {
+ package: "@devup-ui/core".to_string(),
+ css_file: None
+ }
+ )
+ .unwrap()
+ ));
}
#[test]
diff --git a/libs/extractor/src/prop_modify_utils.rs b/libs/extractor/src/prop_modify_utils.rs
index 94a060b7..a01866f7 100644
--- a/libs/extractor/src/prop_modify_utils.rs
+++ b/libs/extractor/src/prop_modify_utils.rs
@@ -205,40 +205,98 @@ fn merge_string_expressions<'a>(
return None;
}
if expressions.len() == 1 {
- return Some(expressions[0].clone_in(ast_builder.allocator));
+ return Some(expressions.first().unwrap().clone_in(ast_builder.allocator));
}
- let mut string_literals = vec![];
+ let mut string_literals: std::vec::Vec = vec![];
let mut other_expressions = vec![];
for ex in expressions {
+ string_literals.push("".to_string());
if let Expression::StringLiteral(literal) = ex {
- string_literals.push(literal.value.trim());
+ if !string_literals.is_empty() {
+ string_literals
+ .last_mut()
+ .unwrap()
+ .push_str(&format!(" {}", literal.value.trim()));
+ } else {
+ string_literals.push(literal.value.trim().to_string());
+ }
+ } else if let Expression::TemplateLiteral(template) = ex {
+ if !string_literals.is_empty() {
+ string_literals.last_mut().unwrap().push_str(&format!(
+ " {}",
+ template
+ .quasis
+ .iter()
+ .map(|q| q.value.raw.trim())
+ .filter(|q| !q.is_empty())
+ .collect::>()
+ .join(" ")
+ ));
+ } else {
+ string_literals.push(
+ template
+ .quasis
+ .iter()
+ .map(|q| q.value.raw.as_str())
+ .collect::>()
+ .join(" "),
+ );
+ }
+ other_expressions.extend(template.expressions.clone_in(ast_builder.allocator));
} else {
- other_expressions.push(ex);
+ other_expressions.push(ex.clone_in(ast_builder.allocator));
}
}
if other_expressions.is_empty() {
- return Some(Expression::StringLiteral(ast_builder.alloc_string_literal(
- SPAN,
- ast_builder.atom(&string_literals.join(" ")),
- None,
- )));
+ return Some(Expression::StringLiteral(
+ ast_builder.alloc_string_literal(
+ SPAN,
+ ast_builder.atom(
+ &string_literals
+ .iter()
+ .map(|s| s.trim())
+ .filter(|s| !s.is_empty())
+ .collect::>()
+ .join(" "),
+ ),
+ None,
+ ),
+ ));
}
+ let literals = oxc_allocator::Vec::from_iter_in(
+ string_literals.iter().enumerate().map(|(idx, s)| {
+ ast_builder.template_element(
+ SPAN,
+ TemplateElementValue {
+ raw: ast_builder.atom(&{
+ let trimmed = s.trim();
+ if trimmed.is_empty() {
+ "".to_string()
+ } else if idx > 0 && idx == string_literals.len() - 1 {
+ if string_literals.len() == other_expressions.len() {
+ format!(" {trimmed} ")
+ } else {
+ format!(" {trimmed}")
+ }
+ } else if idx == string_literals.len() - 1 {
+ trimmed.to_string()
+ } else {
+ format!("{trimmed} ")
+ }
+ }),
+ cooked: None,
+ },
+ false,
+ )
+ }),
+ ast_builder.allocator,
+ );
Some(Expression::TemplateLiteral(
ast_builder.alloc_template_literal(
SPAN,
- oxc_allocator::Vec::from_iter_in(
- [ast_builder.template_element(
- SPAN,
- TemplateElementValue {
- raw: ast_builder.atom(&format!("{} ", string_literals.join(" "))),
- cooked: None,
- },
- false,
- )],
- ast_builder.allocator,
- ),
+ literals,
oxc_allocator::Vec::from_iter_in(
other_expressions
.into_iter()
@@ -264,7 +322,7 @@ fn merge_object_expressions<'a>(
ast_builder.alloc_object_expression(
SPAN,
oxc_allocator::Vec::from_iter_in(
- expressions.into_iter().map(|ex| {
+ expressions.iter().map(|ex| {
ObjectPropertyKind::SpreadProperty(
ast_builder.alloc_spread_element(SPAN, ex.clone_in(ast_builder.allocator)),
)
diff --git a/libs/extractor/src/snapshots/extractor__tests__extract_class_name_from_component.snap b/libs/extractor/src/snapshots/extractor__tests__extract_class_name_from_component.snap
index ad580656..2f5a8a07 100644
--- a/libs/extractor/src/snapshots/extractor__tests__extract_class_name_from_component.snap
+++ b/libs/extractor/src/snapshots/extractor__tests__extract_class_name_from_component.snap
@@ -45,5 +45,5 @@ ToBTreeSet {
},
),
},
- code: "import \"@devup-ui/core/devup-ui.css\";\n;\n",
+ code: "import \"@devup-ui/core/devup-ui.css\";\n;\n",
}
diff --git a/libs/extractor/src/snapshots/extractor__tests__extract_style_props_with_class_name-5.snap b/libs/extractor/src/snapshots/extractor__tests__extract_style_props_with_class_name-5.snap
index 580a9aac..39471513 100644
--- a/libs/extractor/src/snapshots/extractor__tests__extract_style_props_with_class_name-5.snap
+++ b/libs/extractor/src/snapshots/extractor__tests__extract_style_props_with_class_name-5.snap
@@ -23,5 +23,5 @@ ToBTreeSet {
},
),
},
- code: "import \"@devup-ui/core/devup-ui.css\";\n;\n",
+ code: "import \"@devup-ui/core/devup-ui.css\";\n;\n",
}
diff --git a/libs/extractor/src/snapshots/extractor__tests__extract_style_props_with_class_name-6.snap b/libs/extractor/src/snapshots/extractor__tests__extract_style_props_with_class_name-6.snap
index fdbb4357..a946c166 100644
--- a/libs/extractor/src/snapshots/extractor__tests__extract_style_props_with_class_name-6.snap
+++ b/libs/extractor/src/snapshots/extractor__tests__extract_style_props_with_class_name-6.snap
@@ -23,5 +23,5 @@ ToBTreeSet {
},
),
},
- code: "import \"@devup-ui/core/devup-ui.css\";\n
;\n",
+ code: "import \"@devup-ui/core/devup-ui.css\";\n
;\n",
}
diff --git a/libs/extractor/src/snapshots/extractor__tests__extract_style_props_with_class_name-7.snap b/libs/extractor/src/snapshots/extractor__tests__extract_style_props_with_class_name-7.snap
new file mode 100644
index 00000000..39660de1
--- /dev/null
+++ b/libs/extractor/src/snapshots/extractor__tests__extract_style_props_with_class_name-7.snap
@@ -0,0 +1,27 @@
+---
+source: libs/extractor/src/lib.rs
+expression: "ToBTreeSet::from(extract(\"test.tsx\",\nr#\"import {Box as C} from '@devup-ui/core'\n \n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
+---
+ToBTreeSet {
+ styles: {
+ Static(
+ ExtractStaticStyle {
+ property: "margin",
+ value: "8px",
+ level: 0,
+ selector: None,
+ style_order: None,
+ },
+ ),
+ Static(
+ ExtractStaticStyle {
+ property: "padding",
+ value: "4px",
+ level: 0,
+ selector: None,
+ style_order: None,
+ },
+ ),
+ },
+ code: "import \"@devup-ui/core/devup-ui.css\";\n;\n",
+}
diff --git a/libs/extractor/src/snapshots/extractor__tests__extract_style_props_with_class_name-8.snap b/libs/extractor/src/snapshots/extractor__tests__extract_style_props_with_class_name-8.snap
new file mode 100644
index 00000000..6bbe6ff7
--- /dev/null
+++ b/libs/extractor/src/snapshots/extractor__tests__extract_style_props_with_class_name-8.snap
@@ -0,0 +1,44 @@
+---
+source: libs/extractor/src/lib.rs
+expression: "ToBTreeSet::from(extract(\"test.tsx\",\nr#\"import {Box as C} from '@devup-ui/core'\n \n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
+---
+ToBTreeSet {
+ styles: {
+ Static(
+ ExtractStaticStyle {
+ property: "borderColor",
+ value: "",
+ level: 0,
+ selector: Some(
+ Selector(
+ "&:hover",
+ ),
+ ),
+ style_order: None,
+ },
+ ),
+ Static(
+ ExtractStaticStyle {
+ property: "borderColor",
+ value: "blue",
+ level: 0,
+ selector: Some(
+ Selector(
+ "&:hover",
+ ),
+ ),
+ style_order: None,
+ },
+ ),
+ Static(
+ ExtractStaticStyle {
+ property: "padding",
+ value: "4px",
+ level: 0,
+ selector: None,
+ style_order: None,
+ },
+ ),
+ },
+ code: "import \"@devup-ui/core/devup-ui.css\";\n;\n",
+}
diff --git a/libs/extractor/src/snapshots/extractor__tests__extract_style_props_with_class_name1.snap b/libs/extractor/src/snapshots/extractor__tests__extract_style_props_with_class_name1.snap
deleted file mode 100644
index defb72b9..00000000
--- a/libs/extractor/src/snapshots/extractor__tests__extract_style_props_with_class_name1.snap
+++ /dev/null
@@ -1,29 +0,0 @@
----
-source: libs/extractor/src/lib.rs
-expression: "ToBTreeSet::from(extract(\"test.tsx\",\nr\"import * as B from '@devup-ui/core'\n \n \",\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
----
-ToBTreeSet {
- styles: {
- Static(
- ExtractStaticStyle {
- property: "display",
- value: "flex",
- level: 0,
- selector: None,
- style_order: Some(
- 0,
- ),
- },
- ),
- Static(
- ExtractStaticStyle {
- property: "padding",
- value: "-4px",
- level: 0,
- selector: None,
- style_order: None,
- },
- ),
- },
- code: "import \"@devup-ui/core/devup-ui.css\";\nimport * as B from \"@devup-ui/core\";\n;\n",
-}