Skip to content

Commit 52ccf02

Browse files
committed
Add testcase
1 parent 44194b8 commit 52ccf02

File tree

5 files changed

+41
-43
lines changed

5 files changed

+41
-43
lines changed

libs/extractor/src/css_utils.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,28 @@ use oxc_ast::ast::TemplateLiteral;
99

1010
use crate::extract_style::{
1111
extract_dynamic_style::ExtractDynamicStyle, extract_static_style::ExtractStaticStyle,
12+
extract_style_value::ExtractStyleValue,
1213
};
1314

15+
#[derive(Debug, PartialEq, Clone, Eq, Hash, Ord, PartialOrd)]
1416
pub enum CssToStyleResult {
1517
Static(ExtractStaticStyle),
1618
Dynamic(ExtractDynamicStyle),
1719
}
1820

19-
pub fn css_to_style_literal<'a>(css: &TemplateLiteral<'a>) -> Vec<CssToStyleResult> {
21+
impl From<CssToStyleResult> for ExtractStyleValue {
22+
fn from(value: CssToStyleResult) -> Self {
23+
match value {
24+
CssToStyleResult::Static(style) => ExtractStyleValue::Static(style),
25+
CssToStyleResult::Dynamic(style) => ExtractStyleValue::Dynamic(style),
26+
}
27+
}
28+
}
29+
pub fn css_to_style_literal<'a>(
30+
css: &TemplateLiteral<'a>,
31+
level: u8,
32+
selector: &Option<StyleSelector>,
33+
) -> Vec<CssToStyleResult> {
2034
use crate::utils::expression_to_code;
2135

2236
let mut styles = vec![];
@@ -25,7 +39,7 @@ pub fn css_to_style_literal<'a>(css: &TemplateLiteral<'a>) -> Vec<CssToStyleResu
2539
if css.expressions.is_empty() {
2640
for quasi in css.quasis.iter() {
2741
styles.extend(
28-
css_to_style(&quasi.value.raw, 0, &None)
42+
css_to_style(&quasi.value.raw, level, selector)
2943
.into_iter()
3044
.map(|ex| CssToStyleResult::Static(ex)),
3145
);
@@ -57,7 +71,7 @@ pub fn css_to_style_literal<'a>(css: &TemplateLiteral<'a>) -> Vec<CssToStyleResu
5771
let combined_css = css_parts.join("");
5872

5973
// Parse CSS to extract static styles
60-
let static_styles = css_to_style(&combined_css, 0, &None);
74+
let static_styles = css_to_style(&combined_css, level, selector);
6175

6276
// Process each static style and check if it contains expression placeholders
6377
for style in static_styles {
@@ -652,7 +666,7 @@ mod tests {
652666
if let Statement::ExpressionStatement(expr) = &css.program.body[0]
653667
&& let Expression::TemplateLiteral(tmp) = &expr.expression
654668
{
655-
let styles = css_to_style_literal(tmp);
669+
let styles = css_to_style_literal(tmp, 0, &None);
656670
let mut result: Vec<(&str, &str, Option<StyleSelector>)> = styles
657671
.iter()
658672
.map(|prop| match prop {

libs/extractor/src/extractor/extract_global_style_from_expression.rs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::collections::BTreeMap;
22

33
use crate::{
44
ExtractStyleProp,
5-
css_utils::css_to_style,
5+
css_utils::{CssToStyleResult, css_to_style_literal},
66
extract_style::{
77
extract_font_face::ExtractFontFace, extract_import::ExtractImport,
88
extract_style_value::ExtractStyleValue,
@@ -116,18 +116,16 @@ pub fn extract_global_style_from_expression<'a>(
116116
file: file.to_string(),
117117
})));
118118
} else if let ArrayExpressionElement::TemplateLiteral(t) = p {
119-
let css_styles = css_to_style(
120-
t.quasis
121-
.iter()
122-
.map(|q| q.value.raw.as_str())
123-
.collect::<String>()
124-
.trim(),
125-
0,
126-
&None,
127-
)
128-
.into_iter()
129-
.map(ExtractStyleValue::Static)
130-
.collect::<Vec<_>>();
119+
let css_styles = css_to_style_literal(&t, 0, &None)
120+
.into_iter()
121+
.filter_map(|ex| {
122+
if let CssToStyleResult::Static(st) = ex {
123+
Some(ExtractStyleValue::Static(st))
124+
} else {
125+
None
126+
}
127+
})
128+
.collect::<Vec<_>>();
131129
styles.push(ExtractStyleProp::Static(
132130
ExtractStyleValue::FontFace(ExtractFontFace {
133131
properties: BTreeMap::from_iter(

libs/extractor/src/extractor/extract_style_from_expression.rs

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::{
22
ExtractStyleProp,
3-
css_utils::css_to_style,
3+
css_utils::{css_to_style, css_to_style_literal},
44
extract_style::{
55
extract_dynamic_style::ExtractDynamicStyle, extract_static_style::ExtractStaticStyle,
66
extract_style_value::ExtractStyleValue,
@@ -145,17 +145,10 @@ pub fn extract_style_from_expression<'a>(
145145
&None,
146146
),
147147
Expression::TemplateLiteral(tmp) => ExtractResult {
148-
styles: css_to_style(
149-
&tmp.quasis
150-
.iter()
151-
.map(|q| q.value.raw.as_str())
152-
.collect::<String>(),
153-
level,
154-
selector,
155-
)
156-
.into_iter()
157-
.map(|ex| ExtractStyleProp::Static(ExtractStyleValue::Static(ex)))
158-
.collect(),
148+
styles: css_to_style_literal(&tmp, level, selector)
149+
.into_iter()
150+
.map(|ex| ExtractStyleProp::Static(ex.into()))
151+
.collect(),
159152
..ExtractResult::default()
160153
},
161154
_ => ExtractResult::default(),

libs/extractor/src/extractor/extract_style_from_styled.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::collections::HashMap;
33
use crate::{
44
ExtractStyleProp,
55
component::ExportVariableKind,
6-
css_utils::css_to_style,
6+
css_utils::css_to_style_literal,
77
extract_style::extract_style_value::ExtractStyleValue,
88
extractor::{ExtractResult, extract_style_from_expression::extract_style_from_expression},
99
gen_class_name::gen_class_names,
@@ -86,17 +86,11 @@ pub fn extract_style_from_styled<'a>(
8686

8787
if let Some(tag_name) = tag_name {
8888
// Extract CSS from template literal
89-
let css_str = tag
90-
.quasi
91-
.quasis
92-
.iter()
93-
.map(|quasi| quasi.value.raw.to_string())
94-
.collect::<String>();
9589

96-
let styles = css_to_style(&css_str, 0, &None);
90+
let styles = css_to_style_literal(&tag.quasi, 0, &None);
9791
let mut props_styles: Vec<ExtractStyleProp<'_>> = styles
9892
.iter()
99-
.map(|ex| ExtractStyleProp::Static(ExtractStyleValue::Static(ex.clone())))
93+
.map(|ex| ExtractStyleProp::Static(ex.clone().into()))
10094
.collect();
10195

10296
if let Some(default_class_name) = default_class_name {

libs/extractor/src/visit.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::as_visit::AsVisitor;
22
use crate::component::ExportVariableKind;
3-
use crate::css_utils::{css_to_style, keyframes_to_keyframes_style, optimize_css_block};
3+
use crate::css_utils::{css_to_style_literal, keyframes_to_keyframes_style, optimize_css_block};
44
use crate::extract_style::ExtractStyleProperty;
55
use crate::extract_style::extract_css::ExtractCss;
66
use crate::extract_style::extract_keyframes::ExtractKeyframes;
@@ -307,19 +307,18 @@ impl<'a> VisitMut<'a> for DevupVisitor<'a> {
307307
.collect::<String>();
308308
let r = css_type.as_ref();
309309
*it = if let UtilType::Css = r {
310-
let styles = css_to_style(&css_str, 0, &None);
310+
let styles = css_to_style_literal(&tag.quasi, 0, &None);
311311
let class_name = gen_class_names(
312312
&self.ast,
313313
&mut styles
314314
.iter()
315-
.map(|ex| ExtractStyleProp::Static(ExtractStyleValue::Static(ex.clone())))
315+
.map(|ex| ExtractStyleProp::Static(ex.clone().into()))
316316
.collect::<Vec<_>>(),
317317
None,
318318
self.split_filename.as_deref(),
319319
);
320320

321-
self.styles
322-
.extend(styles.into_iter().map(ExtractStyleValue::Static));
321+
self.styles.extend(styles.into_iter().map(|ex| ex.into()));
323322
if let Some(cls) = class_name {
324323
cls
325324
} else {

0 commit comments

Comments
 (0)