Skip to content

Commit 8ae52ea

Browse files
committed
Impl conditional as
1 parent efa075c commit 8ae52ea

26 files changed

+831
-57
lines changed

.changeset/grumpy-sloths-move.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@devup-ui/wasm": patch
3+
---
4+
5+
Impl Conditional as

libs/extractor/src/as_visit.rs

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
use crate::component::ExportVariableKind;
2+
use crate::css_utils::{css_to_style, keyframes_to_keyframes_style, optimize_css_block};
3+
use crate::extract_style::ExtractStyleProperty;
4+
use crate::extract_style::extract_css::ExtractCss;
5+
use crate::extract_style::extract_keyframes::ExtractKeyframes;
6+
use crate::extractor::KeyframesExtractResult;
7+
use crate::extractor::extract_keyframes_from_expression::extract_keyframes_from_expression;
8+
use crate::extractor::{
9+
ExtractResult, GlobalExtractResult,
10+
extract_global_style_from_expression::extract_global_style_from_expression,
11+
extract_style_from_expression::extract_style_from_expression,
12+
extract_style_from_jsx::extract_style_from_jsx,
13+
};
14+
use crate::gen_class_name::gen_class_names;
15+
use crate::prop_modify_utils::{modify_prop_object, modify_props};
16+
use crate::util_type::UtilType;
17+
use crate::utils::get_string_by_literal_expression;
18+
use crate::{ExtractStyleProp, ExtractStyleValue};
19+
use css::disassemble_property;
20+
use css::is_special_property::is_special_property;
21+
use oxc_allocator::{Allocator, CloneIn};
22+
use oxc_ast::ast::ImportDeclarationSpecifier::{self, ImportSpecifier};
23+
use oxc_ast::ast::JSXAttributeItem::Attribute;
24+
use oxc_ast::ast::JSXAttributeName::Identifier;
25+
use oxc_ast::ast::{
26+
Argument, BindingPatternKind, CallExpression, Expression, ImportDeclaration,
27+
ImportOrExportKind, JSXAttributeValue, JSXElement, Program, PropertyKey, Statement,
28+
VariableDeclarator, WithClause,
29+
};
30+
use oxc_ast_visit::VisitMut;
31+
use oxc_ast_visit::walk_mut::{
32+
walk_call_expression, walk_expression, walk_expression_statement, walk_import_declaration,
33+
walk_jsx_element, walk_object_property, walk_program, walk_string_literal,
34+
walk_variable_declarator, walk_variable_declarators,
35+
};
36+
use strum::IntoEnumIterator;
37+
38+
use oxc_ast::AstBuilder;
39+
use oxc_span::SPAN;
40+
use std::collections::{HashMap, HashSet};
41+
42+
pub struct AsVisitor<'a> {
43+
ast: AstBuilder<'a>,
44+
element: JSXElement<'a>,
45+
}
46+
47+
impl<'a> AsVisitor<'a> {
48+
pub fn new(allocator: &'a Allocator, element: JSXElement<'a>) -> Self {
49+
Self {
50+
ast: AstBuilder::new(allocator),
51+
element,
52+
}
53+
}
54+
}
55+
56+
fn change_element_name<'a>(ast: &AstBuilder<'a>, element: &mut JSXElement<'a>, element_name: &str) {
57+
let element_name = ast.jsx_element_name_identifier(SPAN, ast.atom(element_name));
58+
element.opening_element.name = element_name.clone_in(ast.allocator);
59+
if let Some(el) = &mut element.closing_element {
60+
el.name = element_name;
61+
}
62+
}
63+
64+
impl<'a> VisitMut<'a> for AsVisitor<'a> {
65+
fn visit_expression(&mut self, it: &mut oxc_ast::ast::Expression<'a>) {
66+
if let Some(element_name) = get_string_by_literal_expression(it) {
67+
let mut element = self.element.clone_in(self.ast.allocator);
68+
change_element_name(&self.ast, &mut element, &element_name);
69+
*it = Expression::JSXElement(self.ast.alloc(element));
70+
return;
71+
} else if let Expression::Identifier(ident) = it {
72+
let element_name = ident.name.to_string();
73+
if element_name == "undefined" {
74+
return;
75+
}
76+
let mut element = self.element.clone_in(self.ast.allocator);
77+
change_element_name(&self.ast, &mut element, &element_name);
78+
*it = Expression::JSXElement(self.ast.alloc(element));
79+
return;
80+
} else if let Expression::ConditionalExpression(conditional) = it {
81+
self.visit_expression(&mut conditional.consequent);
82+
self.visit_expression(&mut conditional.alternate);
83+
return;
84+
} else if let Expression::ComputedMemberExpression(member) = it {
85+
self.visit_expression(&mut member.object);
86+
return;
87+
}
88+
walk_expression(self, it);
89+
}
90+
91+
fn visit_object_property(&mut self, it: &mut oxc_ast::ast::ObjectProperty<'a>) {
92+
self.visit_expression(&mut it.value);
93+
}
94+
95+
fn visit_spread_element(&mut self, _: &mut oxc_ast::ast::SpreadElement<'a>) {
96+
// spread be mantained
97+
}
98+
}

libs/extractor/src/extractor/extract_style_from_expression.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ pub fn extract_style_from_expression<'a>(
4141
if name.is_none() && selector.is_none() {
4242
let mut style_order = None;
4343
let mut style_vars = None;
44+
let mut props = None;
4445
return match expression {
4546
Expression::ObjectExpression(obj) => {
4647
let mut props_styles: Vec<ExtractStyleProp<'_>> = vec![];
@@ -61,6 +62,8 @@ pub fn extract_style_from_expression<'a>(
6162
} else if &property_name == "styleVars" {
6263
style_vars =
6364
Some(prop.value.clone_in(ast_builder.allocator));
65+
} else if &property_name == "props" {
66+
props = Some(prop.value.clone_in(ast_builder.allocator));
6467
} else {
6568
let ExtractResult {
6669
styles, tag: _tag, ..
@@ -103,9 +106,11 @@ pub fn extract_style_from_expression<'a>(
103106
tag,
104107
style_order,
105108
style_vars,
109+
props,
106110
}
107111
}
108112
Expression::ConditionalExpression(conditional) => ExtractResult {
113+
props: None,
109114
styles: vec![ExtractStyleProp::Conditional {
110115
condition: conditional.test.clone_in(ast_builder.allocator),
111116
consequent: Some(Box::new(ExtractStyleProp::StaticArray(
@@ -496,6 +501,7 @@ pub fn extract_style_from_expression<'a>(
496501
tag: None,
497502
style_order: None,
498503
style_vars: None,
504+
props: None,
499505
}
500506
}
501507
Expression::ConditionalExpression(conditional) => {

libs/extractor/src/extractor/extract_style_from_member_expression.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ pub(super) fn extract_style_from_member_expression<'a>(
5353
}
5454
}
5555
return ExtractResult {
56+
props: None,
5657
styles: etc
5758
.map(|etc| {
5859
vec![ExtractStyleProp::Static(ExtractStyleValue::Dynamic(

libs/extractor/src/extractor/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ pub struct ExtractResult<'a> {
2222
pub tag: Option<Expression<'a>>,
2323
pub style_order: Option<u8>,
2424
pub style_vars: Option<Expression<'a>>,
25+
pub props: Option<Expression<'a>>,
2526
}
2627

2728
#[derive(Debug)]

0 commit comments

Comments
 (0)