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/eager-singers-cover.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@devup-ui/wasm": patch
---

Feat auto insertion className, style props
115 changes: 96 additions & 19 deletions libs/extractor/src/prop_modify_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
use oxc_ast::ast::JSXAttributeItem::Attribute;
use oxc_ast::ast::JSXAttributeName::Identifier;
use oxc_ast::ast::{
Expression, JSXAttributeItem, JSXAttributeValue, JSXExpression, ObjectPropertyKind,
PropertyKey, PropertyKind, TemplateElementValue,
Expression, JSXAttributeItem, JSXAttributeValue, JSXExpression, LogicalOperator,
ObjectPropertyKind, PropertyKey, PropertyKind, TemplateElementValue,
};
use oxc_span::SPAN;

Expand All @@ -21,6 +21,7 @@
) {
let mut class_name_prop = None;
let mut style_prop = None;
let mut spread_props = vec![];
for idx in (0..props.len()).rev() {
let prop = props.remove(idx);
match prop {
Expand All @@ -40,14 +41,20 @@
}
props.insert(idx, ObjectPropertyKind::ObjectProperty(attr));
}
_ => {
props.insert(idx, prop);
ObjectPropertyKind::SpreadProperty(spread) => {
spread_props.push(spread.argument.clone_in(ast_builder.allocator));
props.insert(idx, ObjectPropertyKind::SpreadProperty(spread));
}
}
}

if let Some(ex) = get_class_name_expression(ast_builder, &class_name_prop, styles, style_order)
{
if let Some(ex) = get_class_name_expression(
ast_builder,
&class_name_prop,
styles,
style_order,

Check warning on line 55 in libs/extractor/src/prop_modify_utils.rs

View check run for this annotation

Codecov / codecov/patch

libs/extractor/src/prop_modify_utils.rs#L52-L55

Added lines #L52 - L55 were not covered by tests
&spread_props,
) {
props.push(ObjectPropertyKind::ObjectProperty(
ast_builder.alloc_object_property(
SPAN,
Expand All @@ -60,7 +67,9 @@
),
));
}
if let Some(ex) = get_style_expression(ast_builder, &style_prop, styles, &style_vars) {
if let Some(ex) =
get_style_expression(ast_builder, &style_prop, styles, &style_vars, &spread_props)

Check warning on line 71 in libs/extractor/src/prop_modify_utils.rs

View check run for this annotation

Codecov / codecov/patch

libs/extractor/src/prop_modify_utils.rs#L71

Added line #L71 was not covered by tests
{
props.push(ObjectPropertyKind::ObjectProperty(
ast_builder.alloc_object_property(
SPAN,
Expand All @@ -84,6 +93,7 @@
) {
let mut class_name_prop = None;
let mut style_prop = None;
let mut spread_props = vec![];
for idx in (0..props.len()).rev() {
let prop = props.remove(idx);
match prop {
Expand Down Expand Up @@ -125,13 +135,19 @@
}
props.insert(idx, Attribute(attr));
}
_ => {
props.insert(idx, prop);
JSXAttributeItem::SpreadAttribute(spread) => {
spread_props.push(spread.argument.clone_in(ast_builder.allocator));
props.insert(idx, JSXAttributeItem::SpreadAttribute(spread));
}
}
}
if let Some(ex) = get_class_name_expression(ast_builder, &class_name_prop, styles, style_order)
{
if let Some(ex) = get_class_name_expression(
ast_builder,
&class_name_prop,
styles,
style_order,

Check warning on line 148 in libs/extractor/src/prop_modify_utils.rs

View check run for this annotation

Codecov / codecov/patch

libs/extractor/src/prop_modify_utils.rs#L145-L148

Added lines #L145 - L148 were not covered by tests
&spread_props,
) {
props.push(Attribute(ast_builder.alloc_jsx_attribute(
SPAN,
Identifier(ast_builder.alloc_jsx_identifier(SPAN, "className")),
Expand All @@ -144,7 +160,9 @@
}),
)));
}
if let Some(ex) = get_style_expression(ast_builder, &style_prop, styles, &style_vars) {
if let Some(ex) =
get_style_expression(ast_builder, &style_prop, styles, &style_vars, &spread_props)

Check warning on line 164 in libs/extractor/src/prop_modify_utils.rs

View check run for this annotation

Codecov / codecov/patch

libs/extractor/src/prop_modify_utils.rs#L164

Added line #L164 was not covered by tests
{
props.push(Attribute(ast_builder.alloc_jsx_attribute(
SPAN,
Identifier(ast_builder.alloc_jsx_identifier(SPAN, "style")),
Expand All @@ -160,16 +178,30 @@
class_name_prop: &Option<Expression<'a>>,
styles: &mut [ExtractStyleProp<'a>],
style_order: Option<u8>,
spread_props: &[Expression<'a>],
) -> Option<Expression<'a>> {
// should modify class name prop
merge_string_expressions(
ast_builder,
[
class_name_prop.clone_in(ast_builder.allocator),
class_name_prop
.as_ref()

Check warning on line 188 in libs/extractor/src/prop_modify_utils.rs

View check run for this annotation

Codecov / codecov/patch

libs/extractor/src/prop_modify_utils.rs#L188

Added line #L188 was not covered by tests
.map(|class_name| convert_class_name(ast_builder, class_name)),
gen_class_names(ast_builder, styles, style_order),
]
.into_iter()
.flatten()
.chain(spread_props.iter().map(|ex| {
convert_class_name(
ast_builder,
&Expression::StaticMemberExpression(ast_builder.alloc_static_member_expression(
SPAN,

Check warning on line 198 in libs/extractor/src/prop_modify_utils.rs

View check run for this annotation

Codecov / codecov/patch

libs/extractor/src/prop_modify_utils.rs#L198

Added line #L198 was not covered by tests
ex.clone_in(ast_builder.allocator),
ast_builder.identifier_name(SPAN, ast_builder.atom("className")),
true,

Check warning on line 201 in libs/extractor/src/prop_modify_utils.rs

View check run for this annotation

Codecov / codecov/patch

libs/extractor/src/prop_modify_utils.rs#L201

Added line #L201 was not covered by tests
)),
)
}))
.collect::<Vec<_>>()
.as_slice(),
)
Expand All @@ -180,6 +212,7 @@
style_prop: &Option<Expression<'a>>,
styles: &[ExtractStyleProp<'a>],
style_vars: &Option<Expression<'a>>,
spread_props: &[Expression<'a>],
) -> Option<Expression<'a>> {
merge_object_expressions(
ast_builder,
Expand All @@ -192,6 +225,14 @@
]
.into_iter()
.flatten()
.chain(spread_props.iter().map(|ex| {
Expression::StaticMemberExpression(ast_builder.alloc_static_member_expression(
SPAN,

Check warning on line 230 in libs/extractor/src/prop_modify_utils.rs

View check run for this annotation

Codecov / codecov/patch

libs/extractor/src/prop_modify_utils.rs#L230

Added line #L230 was not covered by tests
ex.clone_in(ast_builder.allocator),
ast_builder.identifier_name(SPAN, ast_builder.atom("style")),
true,

Check warning on line 233 in libs/extractor/src/prop_modify_utils.rs

View check run for this annotation

Codecov / codecov/patch

libs/extractor/src/prop_modify_utils.rs#L233

Added line #L233 was not covered by tests
))
}))
.collect::<Vec<_>>()
.as_slice(),
)
Expand All @@ -210,9 +251,14 @@

let mut string_literals: std::vec::Vec<String> = vec![];
let mut other_expressions = vec![];
let mut prev_str = false;
for ex in expressions {
string_literals.push("".to_string());
if !prev_str {
string_literals.push("".to_string());
prev_str = false;
}
if let Expression::StringLiteral(literal) = ex {
prev_str = true;
if !string_literals.is_empty() {
string_literals
.last_mut()
Expand Down Expand Up @@ -273,12 +319,14 @@
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 if idx == string_literals.len() - 1 {
let prefix = if idx == 0 { "" } else { " " };
let suffix = if string_literals.len() == other_expressions.len() {
" "
} else {
format!(" {trimmed}")
}
""
};
format!("{prefix}{trimmed}{suffix}")
} else if idx == string_literals.len() - 1 {
trimmed.to_string()
} else {
Expand Down Expand Up @@ -333,6 +381,35 @@
))
}

pub fn convert_class_name<'a>(
ast_builder: &AstBuilder<'a>,
class_name: &Expression<'a>,
) -> Expression<'a> {
if matches!(
class_name,
Expression::StringLiteral(_)
| Expression::TemplateLiteral(_)
| Expression::NumericLiteral(_)

Check warning on line 392 in libs/extractor/src/prop_modify_utils.rs

View check run for this annotation

Codecov / codecov/patch

libs/extractor/src/prop_modify_utils.rs#L390-L392

Added lines #L390 - L392 were not covered by tests
) {
return class_name.clone_in(ast_builder.allocator);
}

// wrap ( and ?? ''
Expression::LogicalExpression(
ast_builder.alloc_logical_expression(
SPAN,

Check warning on line 400 in libs/extractor/src/prop_modify_utils.rs

View check run for this annotation

Codecov / codecov/patch

libs/extractor/src/prop_modify_utils.rs#L400

Added line #L400 was not covered by tests
Expression::ParenthesizedExpression(
ast_builder.alloc_parenthesized_expression(
SPAN,

Check warning on line 403 in libs/extractor/src/prop_modify_utils.rs

View check run for this annotation

Codecov / codecov/patch

libs/extractor/src/prop_modify_utils.rs#L403

Added line #L403 was not covered by tests
class_name.clone_in(ast_builder.allocator),
),
),
LogicalOperator::Coalesce,
Expression::StringLiteral(ast_builder.alloc_string_literal(SPAN, "", None)),
),
)
}

pub fn convert_style_vars<'a>(
ast_builder: &AstBuilder<'a>,
style_vars: &Expression<'a>,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
source: libs/extractor/src/lib.rs
expression: "ToBTreeSet::from(extract(\"test.js\",\nr#\"import {Box} from '@devup-ui/core'\nimport {Button} from '@devup/ui'\n ;<Box bg=\"red\" background=\"red\" />\n ;<Button bg=\"red\" background=\"red\" />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
expression: "ToBTreeSet::from(extract(\"test.jsx\",\nr#\"import {Box} from '@devup-ui/core'\nimport {Button} from '@devup/ui'\n ;<Box bg=\"red\" background=\"red\" />\n ;<Button bg=\"red\" background=\"red\" />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
---
ToBTreeSet {
styles: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
source: libs/extractor/src/lib.rs
expression: "ToBTreeSet::from(extract(\"test.js\",\nr#\"import {Box} from '@devup-ui/core'\n <Box bg={`${variable}`} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
expression: "ToBTreeSet::from(extract(\"test.jsx\",\nr#\"import {Box} from '@devup-ui/core'\n <Box bg={`${variable}`} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
---
ToBTreeSet {
styles: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
source: libs/extractor/src/lib.rs
expression: "ToBTreeSet::from(extract(\"test.js\",\nr#\"import {Box} from '@devup-ui/core'\n <Box bg={`black`} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
expression: "ToBTreeSet::from(extract(\"test.jsx\",\nr#\"import {Box} from '@devup-ui/core'\n <Box bg={`black`} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
---
ToBTreeSet {
styles: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
source: libs/extractor/src/lib.rs
expression: "ToBTreeSet::from(extract(\"test.js\",\nr#\"import {Flex} from '@devup-ui/core'\nPROCESS_DATA.map(({ id, title, content }, idx) => (\n <MotionDiv key={idx}>\n <Flex alignItems=\"center\" gap={[3, null, 5, null, 10]}>\n </Flex>\n </MotionDiv>\n ))\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
expression: "ToBTreeSet::from(extract(\"test.jsx\",\nr#\"import {Flex} from '@devup-ui/core'\nPROCESS_DATA.map(({ id, title, content }, idx) => (\n <MotionDiv key={idx}>\n <Flex alignItems=\"center\" gap={[3, null, 5, null, 10]}>\n </Flex>\n </MotionDiv>\n ))\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
---
ToBTreeSet {
styles: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
source: libs/extractor/src/lib.rs
expression: "ToBTreeSet::from(extract(\"test.js\",\nr#\"import {css} from '@devup-ui/core'\n <div className={css({\n ...(a ? { bg: 'red', border: \"solid 1px red\" } : { bg: 'blue' }),\n ...({ p: 1,m: 1 }),\n })} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
expression: "ToBTreeSet::from(extract(\"test.jsx\",\nr#\"import {css} from '@devup-ui/core'\n <div className={css({\n ...(a ? { bg: 'red', border: \"solid 1px red\" } : { bg: 'blue' }),\n ...({ p: 1,m: 1 }),\n })} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
---
ToBTreeSet {
styles: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
source: libs/extractor/src/lib.rs
expression: "ToBTreeSet::from(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())"
expression: "ToBTreeSet::from(extract(\"test.jsx\",\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())"
---
ToBTreeSet {
styles: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
source: libs/extractor/src/lib.rs
expression: "ToBTreeSet::from(extract(\"test.js\",\nr#\"import {Box} from '@devup-ui/core'\n <Box selectors={{\n \"*[aria-diabled='true'] &:hover\": {\n opacity: 0.5\n }\n }} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
expression: "ToBTreeSet::from(extract(\"test.jsx\",\nr#\"import {Box} from '@devup-ui/core'\n <Box selectors={{\n \"*[aria-diabled='true'] &:hover\": {\n opacity: 0.5\n }\n }} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
---
ToBTreeSet {
styles: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
source: libs/extractor/src/lib.rs
expression: "ToBTreeSet::from(extract(\"test.js\",\nr#\"import {Box} from '@devup-ui/core'\n <Box selectors={{\n \"*[aria-diabled='true'] &\": {\n opacity: 0.5\n }\n }} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
expression: "ToBTreeSet::from(extract(\"test.jsx\",\nr#\"import {Box} from '@devup-ui/core'\n <Box selectors={{\n \"*[aria-diabled='true'] &\": {\n opacity: 0.5\n }\n }} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
---
ToBTreeSet {
styles: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
source: libs/extractor/src/lib.rs
expression: "ToBTreeSet::from(extract(\"test.js\",\nr#\"import {Box} from '@devup-ui/core'\n <Box selectors={{\n \"&[aria-diabled='true']\": {\n opacity: 0.5\n }\n }} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
expression: "ToBTreeSet::from(extract(\"test.jsx\",\nr#\"import {Box} from '@devup-ui/core'\n <Box selectors={{\n \"&[aria-diabled='true']\": {\n opacity: 0.5\n }\n }} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
---
ToBTreeSet {
styles: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
source: libs/extractor/src/lib.rs
expression: "ToBTreeSet::from(extract(\"test.js\",\nr#\"import {Box} from '@devup-ui/core'\n <Box bg=\"red\" background=\"red\" />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
expression: "ToBTreeSet::from(extract(\"test.jsx\",\nr#\"import {Box} from '@devup-ui/core'\n <Box bg=\"red\" background=\"red\" />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
---
ToBTreeSet {
styles: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,5 +45,5 @@ ToBTreeSet {
},
),
},
code: "import \"@devup-ui/core/devup-ui.css\";\n<div className={`${\"a\" + \"b\"} d0 d1 d2 d3`} />;\n",
code: "import \"@devup-ui/core/devup-ui.css\";\n<div className={`${\"a\" + \"b\" ?? \"\"} d0 d1 d2 d3`} />;\n",
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,5 @@ ToBTreeSet {
},
),
},
code: "import \"@devup-ui/core/devup-ui.css\";\n<div className={`${\"a\" + \"b\"} d0 d1`} />;\n",
code: "import \"@devup-ui/core/devup-ui.css\";\n<div className={`${\"a\" + \"b\" ?? \"\"} d0 d1`} />;\n",
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,5 @@ ToBTreeSet {
},
),
},
code: "import \"@devup-ui/core/devup-ui.css\";\n<img src=\"/next.svg\" alt=\"Next.js logo\" className={`${styles.logo} d0 d1`} />;\n",
code: "import \"@devup-ui/core/devup-ui.css\";\n<img src=\"/next.svg\" alt=\"Next.js logo\" className={`${styles.logo ?? \"\"} d0 d1`} />;\n",
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,5 @@ ToBTreeSet {
},
),
},
code: "import \"@devup-ui/core/devup-ui.css\";\n<div className={`${variable} d0 d1`} />;\n",
code: "import \"@devup-ui/core/devup-ui.css\";\n<div className={`${variable ?? \"\"} d0 d1`} />;\n",
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,5 +40,5 @@ ToBTreeSet {
},
),
},
code: "import \"@devup-ui/core/devup-ui.css\";\n<div className={`${variable} d0 ${true ? \"d1\" : \"d2\"}`} />;\n",
code: "import \"@devup-ui/core/devup-ui.css\";\n<div className={`${variable ?? \"\"} d0 ${true ? \"d1\" : \"d2\"}`} />;\n",
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
source: libs/extractor/src/lib.rs
expression: "ToBTreeSet::from(extract(\"test.js\",\nr#\"import {Box} from '@devup-ui/core'\n <Box _groupHover={{ bg: \"red\" }} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
expression: "ToBTreeSet::from(extract(\"test.jsx\",\nr#\"import {Box} from '@devup-ui/core'\n <Box _groupHover={{ bg: \"red\" }} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
---
ToBTreeSet {
styles: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
source: libs/extractor/src/lib.rs
expression: "ToBTreeSet::from(extract(\"test.js\",\nr#\"import {Box} from '@devup-ui/core'\n <Box zIndex={-a} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
expression: "ToBTreeSet::from(extract(\"test.jsx\",\nr#\"import {Box} from '@devup-ui/core'\n <Box zIndex={-a} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
---
ToBTreeSet {
styles: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
source: libs/extractor/src/lib.rs
expression: "ToBTreeSet::from(extract(\"test.js\",\nr#\"import {Box} from '@devup-ui/core'\n <Box zIndex={-(1+a)} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
expression: "ToBTreeSet::from(extract(\"test.jsx\",\nr#\"import {Box} from '@devup-ui/core'\n <Box zIndex={-(1+a)} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
---
ToBTreeSet {
styles: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
source: libs/extractor/src/lib.rs
expression: "ToBTreeSet::from(extract(\"test.js\",\nr#\"import {Box} from '@devup-ui/core'\n <Box zIndex={-1*a} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
expression: "ToBTreeSet::from(extract(\"test.jsx\",\nr#\"import {Box} from '@devup-ui/core'\n <Box zIndex={-1*a} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
---
ToBTreeSet {
styles: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
source: libs/extractor/src/lib.rs
expression: "ToBTreeSet::from(extract(\"test.js\",\nr#\"import {Box} from '@devup-ui/core'\n <Box zIndex={-(1)} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
expression: "ToBTreeSet::from(extract(\"test.jsx\",\nr#\"import {Box} from '@devup-ui/core'\n <Box zIndex={-(1)} />\n \"#,\nExtractOption\n{ package: \"@devup-ui/core\".to_string(), css_file: None }).unwrap())"
---
ToBTreeSet {
styles: {
Expand Down
Loading