Skip to content

Commit 8c6bf83

Browse files
authored
Merge pull request #360 from dev-five-git/conditional-as
Impl conditional as
2 parents efa075c + 8575de3 commit 8c6bf83

File tree

46 files changed

+1829
-882
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+1829
-882
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

Cargo.lock

Lines changed: 45 additions & 79 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindings/devup-ui-wasm/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ css = { path = "../../libs/css" }
2727
console_error_panic_hook = { version = "0.1.7", optional = true }
2828
once_cell = "1.21.3"
2929
js-sys = "0.3.78"
30-
serde_json = "1.0.143"
30+
serde_json = "1.0.145"
3131
serde-wasm-bindgen = "0.6.5"
3232
bimap = { version = "0.6.3", features = ["serde"] }
3333

libs/css/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ edition = "2024"
77
once_cell = "1.21.3"
88
phf = { version = "0.13", features = ["macros"] }
99
serial_test = "3.2.0"
10-
serde = { version = "1.0.219", features = ["derive"] }
10+
serde = { version = "1.0.225", features = ["derive"] }
1111
regex = "1.11.2"
1212
bimap = { version = "0.6.3" }
1313

libs/extractor/Cargo.toml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ version = "0.1.0"
44
edition = "2024"
55

66
[dependencies]
7-
oxc_parser = "0.87.0"
8-
oxc_syntax = "0.87.0"
9-
oxc_span = "0.87.0"
10-
oxc_allocator = "0.87.0"
11-
oxc_ast = "0.87.0"
12-
oxc_ast_visit = "0.87.0"
13-
oxc_codegen = "0.87.0"
7+
oxc_parser = "0.89.0"
8+
oxc_syntax = "0.89.0"
9+
oxc_span = "0.89.0"
10+
oxc_allocator = "0.89.0"
11+
oxc_ast = "0.89.0"
12+
oxc_ast_visit = "0.89.0"
13+
oxc_codegen = "0.89.0"
1414
css = { path = "../css" }
1515
phf = "0.13"
1616
strum = "0.27.2"

libs/extractor/src/as_visit.rs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
use crate::utils::get_string_by_literal_expression;
2+
use oxc_allocator::{Allocator, CloneIn};
3+
use oxc_ast::ast::{Expression, JSXElement};
4+
use oxc_ast_visit::VisitMut;
5+
use oxc_ast_visit::walk_mut::walk_expression;
6+
7+
use oxc_ast::AstBuilder;
8+
use oxc_span::SPAN;
9+
10+
pub struct AsVisitor<'a> {
11+
ast: AstBuilder<'a>,
12+
element: JSXElement<'a>,
13+
}
14+
15+
impl<'a> AsVisitor<'a> {
16+
pub fn new(allocator: &'a Allocator, element: JSXElement<'a>) -> Self {
17+
Self {
18+
ast: AstBuilder::new(allocator),
19+
element,
20+
}
21+
}
22+
}
23+
24+
fn change_element_name<'a>(ast: &AstBuilder<'a>, element: &mut JSXElement<'a>, element_name: &str) {
25+
let element_name = ast.jsx_element_name_identifier(SPAN, ast.atom(element_name));
26+
element.opening_element.name = element_name.clone_in(ast.allocator);
27+
if let Some(el) = &mut element.closing_element {
28+
el.name = element_name;
29+
}
30+
}
31+
32+
impl<'a> VisitMut<'a> for AsVisitor<'a> {
33+
fn visit_expression(&mut self, it: &mut oxc_ast::ast::Expression<'a>) {
34+
if let Some(element_name) = get_string_by_literal_expression(it) {
35+
let mut element = self.element.clone_in(self.ast.allocator);
36+
change_element_name(&self.ast, &mut element, &element_name);
37+
*it = Expression::JSXElement(self.ast.alloc(element));
38+
} else if let Expression::Identifier(ident) = it {
39+
let element_name = ident.name.to_string();
40+
if element_name != "undefined" {
41+
let mut element = self.element.clone_in(self.ast.allocator);
42+
change_element_name(&self.ast, &mut element, &element_name);
43+
*it = Expression::JSXElement(self.ast.alloc(element));
44+
}
45+
} else if let Expression::ConditionalExpression(conditional) = it {
46+
self.visit_expression(&mut conditional.consequent);
47+
self.visit_expression(&mut conditional.alternate);
48+
} else if let Expression::ComputedMemberExpression(member) = it {
49+
self.visit_expression(&mut member.object);
50+
} else {
51+
walk_expression(self, it);
52+
}
53+
}
54+
55+
fn visit_object_property(&mut self, it: &mut oxc_ast::ast::ObjectProperty<'a>) {
56+
self.visit_expression(&mut it.value);
57+
}
58+
59+
fn visit_spread_element(&mut self, _: &mut oxc_ast::ast::SpreadElement<'a>) {
60+
// spread be mantained
61+
}
62+
}

0 commit comments

Comments
 (0)