@@ -36,13 +36,20 @@ export function BindDirective(node, context) {
36
36
) ;
37
37
}
38
38
39
- const getter = b . thunk ( /** @type {Expression } */ ( context . visit ( expression ) ) ) ;
40
-
41
- const setter = b . arrow (
42
- [ b . id ( '$$value' ) ] ,
43
- /** @type {Expression } */ ( context . visit ( b . assignment ( '=' , expression , b . id ( '$$value' ) ) ) )
39
+ const get = b . thunk ( /** @type {Expression } */ ( context . visit ( expression ) ) ) ;
40
+
41
+ /** @type {Expression | undefined } */
42
+ let set = b . unthunk (
43
+ b . arrow (
44
+ [ b . id ( '$$value' ) ] ,
45
+ /** @type {Expression } */ ( context . visit ( b . assignment ( '=' , expression , b . id ( '$$value' ) ) ) )
46
+ )
44
47
) ;
45
48
49
+ if ( get === set ) {
50
+ set = undefined ;
51
+ }
52
+
46
53
/** @type {CallExpression } */
47
54
let call ;
48
55
@@ -52,101 +59,106 @@ export function BindDirective(node, context) {
52
59
b . literal ( node . name ) ,
53
60
b . literal ( property . event ) ,
54
61
context . state . node ,
55
- setter ,
56
- property . bidirectional && getter
62
+ set ?? get ,
63
+ property . bidirectional && get
57
64
) ;
58
65
} else {
59
66
// special cases
60
67
switch ( node . name ) {
61
68
// window
62
69
case 'online' :
63
- call = b . call ( `$.bind_online` , setter ) ;
70
+ call = b . call ( `$.bind_online` , set ?? get ) ;
64
71
break ;
65
72
66
73
case 'scrollX' :
67
74
case 'scrollY' :
68
75
call = b . call (
69
76
'$.bind_window_scroll' ,
70
77
b . literal ( node . name === 'scrollX' ? 'x' : 'y' ) ,
71
- getter ,
72
- setter
78
+ get ,
79
+ set
73
80
) ;
74
81
break ;
75
82
76
83
case 'innerWidth' :
77
84
case 'innerHeight' :
78
85
case 'outerWidth' :
79
86
case 'outerHeight' :
80
- call = b . call ( '$.bind_window_size' , b . literal ( node . name ) , setter ) ;
87
+ call = b . call ( '$.bind_window_size' , b . literal ( node . name ) , set ?? get ) ;
81
88
break ;
82
89
83
90
// document
84
91
case 'activeElement' :
85
- call = b . call ( '$.bind_active_element' , setter ) ;
92
+ call = b . call ( '$.bind_active_element' , set ?? get ) ;
86
93
break ;
87
94
88
95
// media
89
96
case 'muted' :
90
- call = b . call ( `$.bind_muted` , context . state . node , getter , setter ) ;
97
+ call = b . call ( `$.bind_muted` , context . state . node , get , set ) ;
91
98
break ;
92
99
case 'paused' :
93
- call = b . call ( `$.bind_paused` , context . state . node , getter , setter ) ;
100
+ call = b . call ( `$.bind_paused` , context . state . node , get , set ) ;
94
101
break ;
95
102
case 'volume' :
96
- call = b . call ( `$.bind_volume` , context . state . node , getter , setter ) ;
103
+ call = b . call ( `$.bind_volume` , context . state . node , get , set ) ;
97
104
break ;
98
105
case 'playbackRate' :
99
- call = b . call ( `$.bind_playback_rate` , context . state . node , getter , setter ) ;
106
+ call = b . call ( `$.bind_playback_rate` , context . state . node , get , set ) ;
100
107
break ;
101
108
case 'currentTime' :
102
- call = b . call ( `$.bind_current_time` , context . state . node , getter , setter ) ;
109
+ call = b . call ( `$.bind_current_time` , context . state . node , get , set ) ;
103
110
break ;
104
111
case 'buffered' :
105
- call = b . call ( `$.bind_buffered` , context . state . node , setter ) ;
112
+ call = b . call ( `$.bind_buffered` , context . state . node , set ?? get ) ;
106
113
break ;
107
114
case 'played' :
108
- call = b . call ( `$.bind_played` , context . state . node , setter ) ;
115
+ call = b . call ( `$.bind_played` , context . state . node , set ?? get ) ;
109
116
break ;
110
117
case 'seekable' :
111
- call = b . call ( `$.bind_seekable` , context . state . node , setter ) ;
118
+ call = b . call ( `$.bind_seekable` , context . state . node , set ?? get ) ;
112
119
break ;
113
120
case 'seeking' :
114
- call = b . call ( `$.bind_seeking` , context . state . node , setter ) ;
121
+ call = b . call ( `$.bind_seeking` , context . state . node , set ?? get ) ;
115
122
break ;
116
123
case 'ended' :
117
- call = b . call ( `$.bind_ended` , context . state . node , setter ) ;
124
+ call = b . call ( `$.bind_ended` , context . state . node , set ?? get ) ;
118
125
break ;
119
126
case 'readyState' :
120
- call = b . call ( `$.bind_ready_state` , context . state . node , setter ) ;
127
+ call = b . call ( `$.bind_ready_state` , context . state . node , set ?? get ) ;
121
128
break ;
122
129
123
130
// dimensions
124
131
case 'contentRect' :
125
132
case 'contentBoxSize' :
126
133
case 'borderBoxSize' :
127
134
case 'devicePixelContentBoxSize' :
128
- call = b . call ( '$.bind_resize_observer' , context . state . node , b . literal ( node . name ) , setter ) ;
135
+ call = b . call (
136
+ '$.bind_resize_observer' ,
137
+ context . state . node ,
138
+ b . literal ( node . name ) ,
139
+ set ?? get
140
+ ) ;
129
141
break ;
130
142
131
143
case 'clientWidth' :
132
144
case 'clientHeight' :
133
145
case 'offsetWidth' :
134
146
case 'offsetHeight' :
135
- call = b . call ( '$.bind_element_size' , context . state . node , b . literal ( node . name ) , setter ) ;
147
+ call = b . call ( '$.bind_element_size' , context . state . node , b . literal ( node . name ) , set ?? get ) ;
136
148
break ;
137
149
138
150
// various
139
151
case 'value' : {
140
152
if ( parent ?. type === 'RegularElement' && parent . name === 'select' ) {
141
- call = b . call ( `$.bind_select_value` , context . state . node , getter , setter ) ;
153
+ call = b . call ( `$.bind_select_value` , context . state . node , get , set ) ;
142
154
} else {
143
- call = b . call ( `$.bind_value` , context . state . node , getter , setter ) ;
155
+ call = b . call ( `$.bind_value` , context . state . node , get , set ) ;
144
156
}
145
157
break ;
146
158
}
147
159
148
160
case 'files' :
149
- call = b . call ( `$.bind_files` , context . state . node , getter , setter ) ;
161
+ call = b . call ( `$.bind_files` , context . state . node , get , set ) ;
150
162
break ;
151
163
152
164
case 'this' :
@@ -160,18 +172,18 @@ export function BindDirective(node, context) {
160
172
'$.bind_content_editable' ,
161
173
b . literal ( node . name ) ,
162
174
context . state . node ,
163
- getter ,
164
- setter
175
+ get ,
176
+ set
165
177
) ;
166
178
break ;
167
179
168
180
// checkbox/radio
169
181
case 'checked' :
170
- call = b . call ( `$.bind_checked` , context . state . node , getter , setter ) ;
182
+ call = b . call ( `$.bind_checked` , context . state . node , get , set ) ;
171
183
break ;
172
184
173
185
case 'focused' :
174
- call = b . call ( `$.bind_focused` , context . state . node , setter ) ;
186
+ call = b . call ( `$.bind_focused` , context . state . node , set ?? get ) ;
175
187
break ;
176
188
177
189
case 'group' : {
@@ -184,7 +196,7 @@ export function BindDirective(node, context) {
184
196
185
197
// We need to additionally invoke the value attribute signal to register it as a dependency,
186
198
// so that when the value is updated, the group binding is updated
187
- let group_getter = getter ;
199
+ let group_getter = get ;
188
200
189
201
if ( parent ?. type === 'RegularElement' ) {
190
202
const value = /** @type {any[] } */ (
@@ -215,7 +227,7 @@ export function BindDirective(node, context) {
215
227
b . array ( indexes ) ,
216
228
context . state . node ,
217
229
group_getter ,
218
- setter
230
+ set ?? get
219
231
) ;
220
232
break ;
221
233
}
0 commit comments