@@ -6,6 +6,7 @@ use oxc_ast::ast::{
66} ;
77use oxc_ast:: AstBuilder ;
88use oxc_span:: SPAN ;
9+ use std:: collections:: BTreeMap ;
910pub fn gen_styles < ' a > (
1011 ast_builder : & AstBuilder < ' a > ,
1112 style_props : & [ ExtractStyleProp < ' a > ] ,
@@ -198,6 +199,90 @@ fn gen_style<'a>(
198199 }
199200 }
200201 }
202+ ExtractStyleProp :: MemberExpression { map, expression } => {
203+ let mut tmp_map = BTreeMap :: < String , Vec < ( String , String ) > > :: new ( ) ;
204+ for ( key, value) in map. iter ( ) {
205+ for style in value. extract ( ) {
206+ match style. extract ( ) {
207+ StyleProperty :: ClassName ( _) => { }
208+ StyleProperty :: Variable {
209+ variable_name,
210+ identifier,
211+ ..
212+ } => {
213+ tmp_map
214+ . entry ( variable_name)
215+ . or_default ( )
216+ . push ( ( key. to_string ( ) , identifier) ) ;
217+ }
218+ }
219+ }
220+ }
221+
222+ for ( key, value) in tmp_map {
223+ properties. push ( ObjectPropertyKind :: ObjectProperty (
224+ ast_builder. alloc_object_property (
225+ SPAN ,
226+ PropertyKind :: Init ,
227+ PropertyKey :: StringLiteral (
228+ ast_builder. alloc_string_literal ( SPAN , key, None ) ,
229+ ) ,
230+ if value. len ( ) == 1 {
231+ // do not create object expression when property is single
232+ Expression :: Identifier (
233+ ast_builder. alloc_identifier_reference ( SPAN , & value[ 0 ] . 1 ) ,
234+ )
235+ } else {
236+ Expression :: ComputedMemberExpression (
237+ ast_builder. alloc_computed_member_expression (
238+ SPAN ,
239+ Expression :: ObjectExpression (
240+ ast_builder. alloc_object_expression (
241+ SPAN ,
242+ oxc_allocator:: Vec :: from_iter_in (
243+ value
244+ . into_iter ( )
245+ . map ( |( k, v) | {
246+ ObjectPropertyKind :: ObjectProperty (
247+ ast_builder. alloc_object_property (
248+ SPAN ,
249+ PropertyKind :: Init ,
250+ PropertyKey :: StaticIdentifier (
251+ ast_builder
252+ . alloc_identifier_name (
253+ SPAN , k,
254+ ) ,
255+ ) ,
256+ Expression :: Identifier (
257+ ast_builder
258+ . alloc_identifier_reference (
259+ SPAN , v,
260+ ) ,
261+ ) ,
262+ false ,
263+ false ,
264+ false ,
265+ ) ,
266+ )
267+ } )
268+ . collect :: < Vec < _ > > ( ) ,
269+ ast_builder. allocator ,
270+ ) ,
271+ None ,
272+ ) ,
273+ ) ,
274+ expression. clone_in ( ast_builder. allocator ) ,
275+ false ,
276+ ) ,
277+ )
278+ } ,
279+ false ,
280+ false ,
281+ false ,
282+ ) ,
283+ ) ) ;
284+ }
285+ }
201286 }
202287 properties. sort_by_key ( |p| {
203288 if let ObjectPropertyKind :: ObjectProperty ( p) = p {
0 commit comments