@@ -34,6 +34,7 @@ import {
34
34
EACH_ITEM_REACTIVE ,
35
35
EACH_KEYED
36
36
} from '../../../../../constants.js' ;
37
+ import { regex_is_valid_identifier } from '../../../patterns.js' ;
37
38
38
39
/**
39
40
* Serializes each style directive into something like `$.style(element, style_property, value)`
@@ -75,19 +76,24 @@ function serialize_style_directives(style_directives, element_id, context, is_at
75
76
}
76
77
77
78
/**
78
- * goes from nested.access to nested['access']
79
- * @param {string } expression
79
+ * For unfortunate legacy reasons, directive names can look like this `use:a.b-c`
80
+ * This turns that string into a member expression
81
+ * @param {string } name
80
82
*/
81
- function member_expression_id_to_literal ( expression ) {
83
+ function parse_directive_name ( name ) {
82
84
// this allow for accessing members of an object
83
- const splitted_expression = expression . split ( '.' ) ;
85
+ const parts = name . split ( '.' ) ;
86
+ let part = /** @type {string } */ ( parts . shift ( ) ) ;
84
87
85
- let new_expression = splitted_expression . shift ( ) ?? '' ;
88
+ /** @type {import('estree').Identifier | import('estree').MemberExpression } */
89
+ let expression = b . id ( part ) ;
86
90
87
- for ( let new_piece of splitted_expression ) {
88
- new_expression += `['${ new_piece } ']` ;
91
+ while ( ( part = /** @type {string } */ ( parts . shift ( ) ) ) ) {
92
+ const computed = ! regex_is_valid_identifier . test ( part ) ;
93
+ expression = b . member ( expression , computed ? b . literal ( part ) : b . id ( part ) , computed ) ;
89
94
}
90
- return new_expression ;
95
+
96
+ return expression ;
91
97
}
92
98
93
99
/**
@@ -1697,7 +1703,7 @@ export const template_visitors = {
1697
1703
b . call (
1698
1704
'$.animate' ,
1699
1705
state . node ,
1700
- b . id ( member_expression_id_to_literal ( node . name ) ) ,
1706
+ /** @type { import('estree').Expression } */ ( visit ( parse_directive_name ( node . name ) ) ) ,
1701
1707
expression
1702
1708
)
1703
1709
)
@@ -1721,7 +1727,7 @@ export const template_visitors = {
1721
1727
b . call (
1722
1728
type ,
1723
1729
state . node ,
1724
- b . id ( member_expression_id_to_literal ( node . name ) ) ,
1730
+ /** @type { import('estree').Expression } */ ( visit ( parse_directive_name ( node . name ) ) ) ,
1725
1731
expression ,
1726
1732
node . modifiers . includes ( 'global' ) ? b . true : b . false
1727
1733
)
@@ -2445,7 +2451,7 @@ export const template_visitors = {
2445
2451
b . arrow (
2446
2452
params ,
2447
2453
b . call (
2448
- serialize_get_binding ( b . id ( member_expression_id_to_literal ( node . name ) ) , state ) ,
2454
+ /** @type { import('estree').Expression } */ ( visit ( parse_directive_name ( node . name ) ) ) ,
2449
2455
...params
2450
2456
)
2451
2457
)
0 commit comments