Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/itchy-dolphins-talk.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@devup-ui/react": patch
---

Support optional args in css
5 changes: 5 additions & 0 deletions .changeset/soft-islands-compete.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@devup-ui/wasm": patch
---

Support destructing, Support to direct selection of object with theme, Support for template literal on as prop
174 changes: 173 additions & 1 deletion libs/extractor/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,92 @@ mod tests {
)
.unwrap());
}

#[test]
#[serial]
fn convert_tag() {
reset_class_map();
assert_debug_snapshot!(extract(
"test.tsx",
r#"import {Box} from '@devup-ui/core'
<Box as="secton" />
"#,
ExtractOption {
package: "@devup-ui/core".to_string(),
css_file: None
}
)
.unwrap());

reset_class_map();
assert_debug_snapshot!(extract(
"test.tsx",
r#"import {Box} from '@devup-ui/core'
<Box as={"secton"} />
"#,
ExtractOption {
package: "@devup-ui/core".to_string(),
css_file: None
}
)
.unwrap());
assert_debug_snapshot!(extract(
"test.tsx",
r#"import {Box} from '@devup-ui/core'
<Box as={`secton`} />
"#,
ExtractOption {
package: "@devup-ui/core".to_string(),
css_file: None
}
)
.unwrap());
// assert_debug_snapshot!(extract(
// "test.tsx",
// r#"import {Box} from '@devup-ui/core'
// <Box as={b ? "div":"secton"} />
// "#,
// ExtractOption {
// package: "@devup-ui/core".to_string(),
// css_file: None
// }
// )
// .unwrap());
// assert_debug_snapshot!(extract(
// "test.tsx",
// r#"import {Box} from '@devup-ui/core'
// <Box as={b ? undefined:"secton"} />
// "#,
// ExtractOption {
// package: "@devup-ui/core".to_string(),
// css_file: None
// }
// )
// .unwrap());
//
// assert_debug_snapshot!(extract(
// "test.tsx",
// r#"import {Box} from '@devup-ui/core'
// <Box as={b ? null:"secton"} />
// "#,
// ExtractOption {
// package: "@devup-ui/core".to_string(),
// css_file: None
// }
// )
// .unwrap());
// assert_debug_snapshot!(extract(
// "test.tsx",
// r#"import {Box} from '@devup-ui/core'
// <Box as={b ? null:undefined} />
// "#,
// ExtractOption {
// package: "@devup-ui/core".to_string(),
// css_file: None
// }
// )
// .unwrap());
}
#[test]
#[serial]
fn extract_style_props() {
Expand Down Expand Up @@ -837,6 +923,19 @@ mod tests {
}
)
.unwrap());

reset_class_map();
assert_debug_snapshot!(extract(
"test.tsx",
r#"import { css } from "@devup-ui/core";
<div className={css(a?{bg:"red"}:{bg:"blue"})}/>;
"#,
ExtractOption {
package: "@devup-ui/core".to_string(),
css_file: None
}
)
.unwrap());
}

#[test]
Expand All @@ -854,6 +953,32 @@ mod tests {
}
)
.unwrap());

reset_class_map();
assert_debug_snapshot!(extract(
"test.tsx",
r#"import {Box} from '@devup-ui/core'
<Box color={`$nice`} />
"#,
ExtractOption {
package: "@devup-ui/core".to_string(),
css_file: None
}
)
.unwrap());

reset_class_map();
assert_debug_snapshot!(extract(
"test.tsx",
r#"import {Box} from '@devup-ui/core'
<Box color={("$nice")} />
"#,
ExtractOption {
package: "@devup-ui/core".to_string(),
css_file: None
}
)
.unwrap());
}

#[test]
Expand Down Expand Up @@ -1260,6 +1385,33 @@ export {
}
)
.unwrap());

reset_class_map();
assert_debug_snapshot!(extract(
"test.js",
r#"import {Center} from '@devup-ui/core'
<Center bg={SOME_VAR[idx]}>
</Center>
"#,
ExtractOption {
package: "@devup-ui/core".to_string(),
css_file: None
}
)
.unwrap());

reset_class_map();
assert_debug_snapshot!(extract(
"test.js",
r#"import {Flex} from '@devup-ui/core'
<Flex bg={{a:"$red", b:"$blue"}[idx]} />
"#,
ExtractOption {
package: "@devup-ui/core".to_string(),
css_file: None
}
)
.unwrap());
}

#[test]
Expand Down Expand Up @@ -1347,7 +1499,7 @@ PROCESS_DATA.map(({ id, title, content }, idx) => (
)
.unwrap());
}

#[test]
#[serial]
fn avoid_same_name_component() {
Expand All @@ -1366,4 +1518,24 @@ import {Button} from '@devup/ui'
)
.unwrap());
}

#[test]
#[serial]
fn css_props_destructuring_assignment() {
reset_class_map();
assert_debug_snapshot!(extract(
"test.js",
r#"import {css} from '@devup-ui/core'
<div className={css({
...(a ? { bg: 'red' } : { bg: 'blue' }),
...({ p: 1 }),
})} />
"#,
ExtractOption {
package: "@devup-ui/core".to_string(),
css_file: None
}
)
.unwrap());
}
}
12 changes: 6 additions & 6 deletions libs/extractor/src/prop_modify_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ use oxc_span::SPAN;
pub fn modify_prop_object<'a>(
ast_builder: &AstBuilder<'a>,
props: &mut oxc_allocator::Vec<ObjectPropertyKind<'a>>,
styles: Vec<ExtractStyleProp<'a>>,
styles: &[ExtractStyleProp<'a>],
) {
let mut class_name_prop = None;
let mut style_prop = None;
Expand All @@ -38,7 +38,7 @@ pub fn modify_prop_object<'a>(
}

// should modify class name prop
if let Some(ex) = gen_class_names(ast_builder, &styles) {
if let Some(ex) = gen_class_names(ast_builder, styles) {
if let Some(pr) = if let Some(class_name_prop) = class_name_prop {
merge_expression_for_class_name(
ast_builder,
Expand Down Expand Up @@ -76,7 +76,7 @@ pub fn modify_prop_object<'a>(
}

// should modify style prop
if let Some(mut ex) = gen_styles(ast_builder, &styles) {
if let Some(mut ex) = gen_styles(ast_builder, styles) {
props.push(if let Some(style_prop) = style_prop {
ObjectPropertyKind::ObjectProperty(ast_builder.alloc_object_property(
SPAN,
Expand Down Expand Up @@ -117,7 +117,7 @@ pub fn modify_prop_object<'a>(
pub fn modify_props<'a>(
ast_builder: &AstBuilder<'a>,
props: &mut oxc_allocator::Vec<JSXAttributeItem<'a>>,
styles: Vec<ExtractStyleProp<'a>>,
styles: &[ExtractStyleProp<'a>],
) {
let mut class_name_prop = None;
let mut style_prop = None;
Expand All @@ -141,7 +141,7 @@ pub fn modify_props<'a>(
}

// should modify class name prop
if let Some(ex) = gen_class_names(ast_builder, &styles) {
if let Some(ex) = gen_class_names(ast_builder, styles) {
let mut attr = if let Some(class_name_prop) = class_name_prop {
class_name_prop
} else {
Expand All @@ -160,7 +160,7 @@ pub fn modify_props<'a>(
}

// should modify style prop
if let Some(ex) = gen_styles(ast_builder, &styles) {
if let Some(ex) = gen_styles(ast_builder, styles) {
let mut attr = if let Some(style_prop) = style_prop {
style_prop
} else {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
source: libs/extractor/src/lib.rs
expression: "extract(\"test.tsx\",\nr#\"import {Box} from '@devup-ui/core'\n <Box as={\"secton\"} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap()"
---
ExtractOutput {
styles: [],
code: "<secton />;\n",
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
source: libs/extractor/src/lib.rs
expression: "extract(\"test.tsx\",\nr#\"import {Box} from '@devup-ui/core'\n <Box as={`secton`} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap()"
---
ExtractOutput {
styles: [],
code: "<secton />;\n",
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
source: libs/extractor/src/lib.rs
expression: "extract(\"test.tsx\",\nr#\"import {Box} from '@devup-ui/core'\n <Box as=\"secton\" />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap()"
---
ExtractOutput {
styles: [],
code: "<secton />;\n",
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
---
source: libs/extractor/src/lib.rs
expression: "extract(\"test.js\",\nr#\"import {css} from '@devup-ui/core'\n <div className={css({\n ...(a ? { bg: 'red' } : { bg: 'blue' }),\n ...({ p: 1 }),\n })} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap()"
---
ExtractOutput {
styles: [
Static(
ExtractStaticStyle {
property: "padding",
value: "4px",
level: 0,
selector: None,
basic: false,
},
),
Static(
ExtractStaticStyle {
property: "background",
value: "red",
level: 0,
selector: None,
basic: false,
},
),
Static(
ExtractStaticStyle {
property: "background",
value: "blue",
level: 0,
selector: None,
basic: false,
},
),
],
code: "import \"@devup-ui/core/devup-ui.css\";\nimport { css } from \"@devup-ui/core\";\n<div className={css(`d2 ${a ? \"d0\" : \"d1\"}`)} />;\n",
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ ExtractOutput {
styles: [
Static(
ExtractStaticStyle {
property: "color",
value: "blue",
property: "background",
value: "red",
level: 0,
selector: Some(
Postfix(
Expand All @@ -19,8 +19,8 @@ ExtractOutput {
),
Static(
ExtractStaticStyle {
property: "background",
value: "red",
property: "color",
value: "blue",
level: 0,
selector: Some(
Postfix(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
---
source: libs/extractor/src/lib.rs
expression: "extract(\"test.tsx\",\nr#\"import { css } from \"@devup-ui/core\";\n <div className={css(a?{bg:\"red\"}:{bg:\"blue\"})}/>;\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap()"
---
ExtractOutput {
styles: [
Static(
ExtractStaticStyle {
property: "background",
value: "red",
level: 0,
selector: None,
basic: false,
},
),
Static(
ExtractStaticStyle {
property: "background",
value: "blue",
level: 0,
selector: None,
basic: false,
},
),
],
code: "import \"@devup-ui/core/devup-ui.css\";\nimport { css } from \"@devup-ui/core\";\n<div className={css(a ? \"d0\" : \"d1\")} />;\n",
}
Loading
Loading