From 00c39d0f1de9ff4c84833c8031ae4b305d60824b Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Tue, 22 Jul 2025 21:08:55 +0900 Subject: [PATCH 1/5] Split property --- .changeset/brown-gifts-scream.md | 5 ++ libs/css/src/lib.rs | 8 +-- libs/css/src/optimize_value.rs | 2 +- .../extract_style/extract_dynamic_style.rs | 6 +- .../src/extract_style/extract_static_style.rs | 4 +- .../extract_style_from_expression.rs | 67 +++++++++--------- ...tests__extract_conditional_selector-2.snap | 17 ++++- ...tests__extract_conditional_selector-4.snap | 32 ++++++++- ...__tests__extract_conditional_selector.snap | 17 ++++- .../extractor__tests__extract_selector.snap | 17 ++++- ...s__extract_selector_with_responsive-2.snap | 32 ++++++++- ...sts__extract_selector_with_responsive.snap | 32 ++++++++- ...ractor__tests__props_multi_expression.snap | 68 +++++++++++++++++-- .../extractor__tests__theme_selector-3.snap | 21 ++++-- libs/extractor/src/visit.rs | 56 ++++++++------- libs/sheet/src/theme.rs | 21 +++--- 16 files changed, 300 insertions(+), 105 deletions(-) create mode 100644 .changeset/brown-gifts-scream.md diff --git a/.changeset/brown-gifts-scream.md b/.changeset/brown-gifts-scream.md new file mode 100644 index 00000000..091dc7e2 --- /dev/null +++ b/.changeset/brown-gifts-scream.md @@ -0,0 +1,5 @@ +--- +"@devup-ui/wasm": patch +--- + +Split property diff --git a/libs/css/src/lib.rs b/libs/css/src/lib.rs index 15fb9710..ee99ba0a 100644 --- a/libs/css/src/lib.rs +++ b/libs/css/src/lib.rs @@ -34,14 +34,14 @@ pub fn merge_selector(class_name: &str, selector: Option<&StyleSelector>) -> Str } } -pub fn short_to_long(property: &str) -> String { +pub fn disassemble_property(property: &str) -> Vec { GLOBAL_STYLE_PROPERTY .get(property) .map(|v| match v.len() { - 1 => to_camel_case(v[0]), - _ => property.to_string(), + 1 => vec![to_camel_case(v[0])], + _ => v.iter().map(|v| to_camel_case(v)).collect(), }) - .unwrap_or_else(|| property.to_string()) + .unwrap_or_else(|| vec![property.to_string()]) } pub fn keyframes_to_keyframes_name(keyframes: &str) -> String { diff --git a/libs/css/src/optimize_value.rs b/libs/css/src/optimize_value.rs index 36370ba2..d4b2ef55 100644 --- a/libs/css/src/optimize_value.rs +++ b/libs/css/src/optimize_value.rs @@ -35,7 +35,7 @@ pub fn optimize_value(value: &str) -> String { let r = c[1].parse::().unwrap(); let g = c[2].parse::().unwrap(); let b = c[3].parse::().unwrap(); - format!("#{:02X}{:02X}{:02X}", r, g, b) + format!("#{r:02X}{g:02X}{b:02X}") }) .to_string(); if ret.contains("#") { diff --git a/libs/extractor/src/extract_style/extract_dynamic_style.rs b/libs/extractor/src/extract_style/extract_dynamic_style.rs index 588469b2..d49f37f0 100644 --- a/libs/extractor/src/extract_style/extract_dynamic_style.rs +++ b/libs/extractor/src/extract_style/extract_dynamic_style.rs @@ -1,6 +1,6 @@ use css::{ - optimize_value::optimize_value, sheet_to_classname, sheet_to_variable_name, short_to_long, - style_selector::StyleSelector, + optimize_value::optimize_value, sheet_to_classname, + sheet_to_variable_name, style_selector::StyleSelector, }; use crate::extract_style::{ExtractStyleProperty, style_property::StyleProperty}; @@ -28,7 +28,7 @@ impl ExtractDynamicStyle { selector: Option, ) -> Self { Self { - property: short_to_long(property), + property: property.to_string(), level, identifier: optimize_value(identifier), selector, diff --git a/libs/extractor/src/extract_style/extract_static_style.rs b/libs/extractor/src/extract_style/extract_static_style.rs index 99b46cb3..ed6b964f 100644 --- a/libs/extractor/src/extract_style/extract_static_style.rs +++ b/libs/extractor/src/extract_style/extract_static_style.rs @@ -1,5 +1,5 @@ use css::{ - optimize_value::optimize_value, sheet_to_classname, short_to_long, + optimize_value::optimize_value, sheet_to_classname, style_selector::StyleSelector, }; @@ -33,7 +33,7 @@ impl ExtractStaticStyle { } else { convert_value(value) }), - property: short_to_long(property), + property: property.to_string(), level, selector, style_order: None, diff --git a/libs/extractor/src/extractor/extract_style_from_expression.rs b/libs/extractor/src/extractor/extract_style_from_expression.rs index 95ecf5e4..72902ffe 100644 --- a/libs/extractor/src/extractor/extract_style_from_expression.rs +++ b/libs/extractor/src/extractor/extract_style_from_expression.rs @@ -13,7 +13,7 @@ use crate::{ is_same_expression, is_special_property, }, }; -use css::style_selector::StyleSelector; +use css::{disassemble_property, style_selector::StyleSelector}; use oxc_allocator::CloneIn; use oxc_ast::{ AstBuilder, @@ -50,27 +50,30 @@ pub fn extract_style_from_expression<'a>( && let name = ident.name.as_str() && !is_special_property(name) { - if name == "styleOrder" { - style_order = get_number_by_literal_expression(&prop.value) - .map(|v| v as u8); - continue; - } - if name == "styleVars" { - style_vars = Some(prop.value.clone_in(ast_builder.allocator)); - continue; - } + for name in disassemble_property(name) { + if name == "styleOrder" { + style_order = get_number_by_literal_expression(&prop.value) + .map(|v| v as u8); + continue; + } + if name == "styleVars" { + style_vars = + Some(prop.value.clone_in(ast_builder.allocator)); + continue; + } - let ExtractResult { - styles, tag: _tag, .. - } = extract_style_from_expression( - ast_builder, - Some(name), - &mut prop.value, - 0, - &None, - ); - props_styles.extend(styles); - tag = _tag.or(tag); + let ExtractResult { + styles, tag: _tag, .. + } = extract_style_from_expression( + ast_builder, + Some(&name), + &mut prop.value, + 0, + &None, + ); + props_styles.extend(styles); + tag = _tag.or(tag); + } true } else { false @@ -513,16 +516,18 @@ pub fn extract_style_from_expression<'a>( let mut props = vec![]; for p in obj.properties.iter_mut() { if let ObjectPropertyKind::ObjectProperty(o) = p { - props.extend( - extract_style_from_expression( - ast_builder, - Some(&o.key.name().unwrap()), - &mut o.value, - level, - selector, - ) - .styles, - ); + for name in disassemble_property(&o.key.name().unwrap()) { + props.extend( + extract_style_from_expression( + ast_builder, + Some(&name), + &mut o.value, + level, + selector, + ) + .styles, + ); + } } } ExtractResult { diff --git a/libs/extractor/src/snapshots/extractor__tests__extract_conditional_selector-2.snap b/libs/extractor/src/snapshots/extractor__tests__extract_conditional_selector-2.snap index d9ec8b61..0a712f3e 100644 --- a/libs/extractor/src/snapshots/extractor__tests__extract_conditional_selector-2.snap +++ b/libs/extractor/src/snapshots/extractor__tests__extract_conditional_selector-2.snap @@ -6,7 +6,20 @@ ToBTreeSet { styles: { Static( ExtractStaticStyle { - property: "mx", + property: "marginLeft", + value: "4px", + level: 0, + selector: Some( + Selector( + "&:hover", + ), + ), + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "marginRight", value: "4px", level: 0, selector: Some( @@ -18,5 +31,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_conditional_selector-4.snap b/libs/extractor/src/snapshots/extractor__tests__extract_conditional_selector-4.snap index 5eadf590..49391155 100644 --- a/libs/extractor/src/snapshots/extractor__tests__extract_conditional_selector-4.snap +++ b/libs/extractor/src/snapshots/extractor__tests__extract_conditional_selector-4.snap @@ -6,7 +6,7 @@ ToBTreeSet { styles: { Static( ExtractStaticStyle { - property: "mx", + property: "marginBottom", value: "4px", level: 0, selector: Some( @@ -19,7 +19,33 @@ ToBTreeSet { ), Static( ExtractStaticStyle { - property: "my", + property: "marginLeft", + value: "4px", + level: 0, + selector: Some( + Selector( + "&:hover", + ), + ), + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "marginRight", + value: "4px", + level: 0, + selector: Some( + Selector( + "&:hover", + ), + ), + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "marginTop", value: "4px", level: 0, selector: Some( @@ -31,5 +57,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_conditional_selector.snap b/libs/extractor/src/snapshots/extractor__tests__extract_conditional_selector.snap index 1b0bc7f8..ca565c30 100644 --- a/libs/extractor/src/snapshots/extractor__tests__extract_conditional_selector.snap +++ b/libs/extractor/src/snapshots/extractor__tests__extract_conditional_selector.snap @@ -6,7 +6,20 @@ ToBTreeSet { styles: { Static( ExtractStaticStyle { - property: "mx", + property: "marginLeft", + value: "4px", + level: 0, + selector: Some( + Selector( + "&:hover", + ), + ), + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "marginRight", value: "4px", level: 0, selector: Some( @@ -18,5 +31,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_selector.snap b/libs/extractor/src/snapshots/extractor__tests__extract_selector.snap index 3dfaf0ff..79e692fd 100644 --- a/libs/extractor/src/snapshots/extractor__tests__extract_selector.snap +++ b/libs/extractor/src/snapshots/extractor__tests__extract_selector.snap @@ -6,7 +6,20 @@ ToBTreeSet { styles: { Static( ExtractStaticStyle { - property: "mx", + property: "marginLeft", + value: "4px", + level: 0, + selector: Some( + Selector( + "&:hover", + ), + ), + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "marginRight", value: "4px", level: 0, selector: Some( @@ -18,5 +31,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_selector_with_responsive-2.snap b/libs/extractor/src/snapshots/extractor__tests__extract_selector_with_responsive-2.snap index 87bc286a..4d1e1feb 100644 --- a/libs/extractor/src/snapshots/extractor__tests__extract_selector_with_responsive-2.snap +++ b/libs/extractor/src/snapshots/extractor__tests__extract_selector_with_responsive-2.snap @@ -6,7 +6,7 @@ ToBTreeSet { styles: { Static( ExtractStaticStyle { - property: "mx", + property: "marginLeft", value: "40px", level: 0, selector: Some( @@ -19,7 +19,33 @@ ToBTreeSet { ), Static( ExtractStaticStyle { - property: "mx", + property: "marginLeft", + value: "80px", + level: 1, + selector: Some( + Selector( + "&:hover", + ), + ), + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "marginRight", + value: "40px", + level: 0, + selector: Some( + Selector( + "&:hover", + ), + ), + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "marginRight", value: "80px", level: 1, selector: Some( @@ -31,5 +57,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_selector_with_responsive.snap b/libs/extractor/src/snapshots/extractor__tests__extract_selector_with_responsive.snap index e6c107d7..33c8114f 100644 --- a/libs/extractor/src/snapshots/extractor__tests__extract_selector_with_responsive.snap +++ b/libs/extractor/src/snapshots/extractor__tests__extract_selector_with_responsive.snap @@ -6,7 +6,7 @@ ToBTreeSet { styles: { Static( ExtractStaticStyle { - property: "mx", + property: "marginLeft", value: "4px", level: 0, selector: Some( @@ -19,7 +19,33 @@ ToBTreeSet { ), Static( ExtractStaticStyle { - property: "mx", + property: "marginLeft", + value: "8px", + level: 1, + selector: Some( + Selector( + "&:hover", + ), + ), + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "marginRight", + value: "4px", + level: 0, + selector: Some( + Selector( + "&:hover", + ), + ), + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "marginRight", value: "8px", level: 1, selector: Some( @@ -31,5 +57,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__props_multi_expression.snap b/libs/extractor/src/snapshots/extractor__tests__props_multi_expression.snap index 0fbb58e2..05c35b96 100644 --- a/libs/extractor/src/snapshots/extractor__tests__props_multi_expression.snap +++ b/libs/extractor/src/snapshots/extractor__tests__props_multi_expression.snap @@ -24,7 +24,7 @@ ToBTreeSet { ), Static( ExtractStaticStyle { - property: "px", + property: "paddingLeft", value: "12px", level: 0, selector: None, @@ -33,7 +33,7 @@ ToBTreeSet { ), Static( ExtractStaticStyle { - property: "px", + property: "paddingLeft", value: "16px", level: 0, selector: None, @@ -42,7 +42,7 @@ ToBTreeSet { ), Static( ExtractStaticStyle { - property: "px", + property: "paddingLeft", value: "20px", level: 0, selector: None, @@ -51,7 +51,7 @@ ToBTreeSet { ), Static( ExtractStaticStyle { - property: "px", + property: "paddingLeft", value: "24px", level: 0, selector: None, @@ -60,7 +60,7 @@ ToBTreeSet { ), Static( ExtractStaticStyle { - property: "px", + property: "paddingLeft", value: "28px", level: 0, selector: None, @@ -69,7 +69,61 @@ ToBTreeSet { ), Static( ExtractStaticStyle { - property: "px", + property: "paddingLeft", + value: "32px", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "paddingRight", + value: "12px", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "paddingRight", + value: "16px", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "paddingRight", + value: "20px", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "paddingRight", + value: "24px", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "paddingRight", + value: "28px", + level: 0, + selector: None, + style_order: None, + }, + ), + Static( + ExtractStaticStyle { + property: "paddingRight", value: "32px", level: 0, selector: None, @@ -77,5 +131,5 @@ ToBTreeSet { }, ), }, - code: "import \"@devup-ui/core/devup-ui.css\";\n