@@ -36,13 +36,20 @@ export function BindDirective(node, context) {
3636 ) ;
3737 }
3838
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+ )
4447 ) ;
4548
49+ if ( get === set ) {
50+ set = undefined ;
51+ }
52+
4653 /** @type {CallExpression } */
4754 let call ;
4855
@@ -52,101 +59,106 @@ export function BindDirective(node, context) {
5259 b . literal ( node . name ) ,
5360 b . literal ( property . event ) ,
5461 context . state . node ,
55- setter ,
56- property . bidirectional && getter
62+ set ?? get ,
63+ property . bidirectional && get
5764 ) ;
5865 } else {
5966 // special cases
6067 switch ( node . name ) {
6168 // window
6269 case 'online' :
63- call = b . call ( `$.bind_online` , setter ) ;
70+ call = b . call ( `$.bind_online` , set ?? get ) ;
6471 break ;
6572
6673 case 'scrollX' :
6774 case 'scrollY' :
6875 call = b . call (
6976 '$.bind_window_scroll' ,
7077 b . literal ( node . name === 'scrollX' ? 'x' : 'y' ) ,
71- getter ,
72- setter
78+ get ,
79+ set
7380 ) ;
7481 break ;
7582
7683 case 'innerWidth' :
7784 case 'innerHeight' :
7885 case 'outerWidth' :
7986 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 ) ;
8188 break ;
8289
8390 // document
8491 case 'activeElement' :
85- call = b . call ( '$.bind_active_element' , setter ) ;
92+ call = b . call ( '$.bind_active_element' , set ?? get ) ;
8693 break ;
8794
8895 // media
8996 case 'muted' :
90- call = b . call ( `$.bind_muted` , context . state . node , getter , setter ) ;
97+ call = b . call ( `$.bind_muted` , context . state . node , get , set ) ;
9198 break ;
9299 case 'paused' :
93- call = b . call ( `$.bind_paused` , context . state . node , getter , setter ) ;
100+ call = b . call ( `$.bind_paused` , context . state . node , get , set ) ;
94101 break ;
95102 case 'volume' :
96- call = b . call ( `$.bind_volume` , context . state . node , getter , setter ) ;
103+ call = b . call ( `$.bind_volume` , context . state . node , get , set ) ;
97104 break ;
98105 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 ) ;
100107 break ;
101108 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 ) ;
103110 break ;
104111 case 'buffered' :
105- call = b . call ( `$.bind_buffered` , context . state . node , setter ) ;
112+ call = b . call ( `$.bind_buffered` , context . state . node , set ?? get ) ;
106113 break ;
107114 case 'played' :
108- call = b . call ( `$.bind_played` , context . state . node , setter ) ;
115+ call = b . call ( `$.bind_played` , context . state . node , set ?? get ) ;
109116 break ;
110117 case 'seekable' :
111- call = b . call ( `$.bind_seekable` , context . state . node , setter ) ;
118+ call = b . call ( `$.bind_seekable` , context . state . node , set ?? get ) ;
112119 break ;
113120 case 'seeking' :
114- call = b . call ( `$.bind_seeking` , context . state . node , setter ) ;
121+ call = b . call ( `$.bind_seeking` , context . state . node , set ?? get ) ;
115122 break ;
116123 case 'ended' :
117- call = b . call ( `$.bind_ended` , context . state . node , setter ) ;
124+ call = b . call ( `$.bind_ended` , context . state . node , set ?? get ) ;
118125 break ;
119126 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 ) ;
121128 break ;
122129
123130 // dimensions
124131 case 'contentRect' :
125132 case 'contentBoxSize' :
126133 case 'borderBoxSize' :
127134 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+ ) ;
129141 break ;
130142
131143 case 'clientWidth' :
132144 case 'clientHeight' :
133145 case 'offsetWidth' :
134146 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 ) ;
136148 break ;
137149
138150 // various
139151 case 'value' : {
140152 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 ) ;
142154 } else {
143- call = b . call ( `$.bind_value` , context . state . node , getter , setter ) ;
155+ call = b . call ( `$.bind_value` , context . state . node , get , set ) ;
144156 }
145157 break ;
146158 }
147159
148160 case 'files' :
149- call = b . call ( `$.bind_files` , context . state . node , getter , setter ) ;
161+ call = b . call ( `$.bind_files` , context . state . node , get , set ) ;
150162 break ;
151163
152164 case 'this' :
@@ -160,18 +172,18 @@ export function BindDirective(node, context) {
160172 '$.bind_content_editable' ,
161173 b . literal ( node . name ) ,
162174 context . state . node ,
163- getter ,
164- setter
175+ get ,
176+ set
165177 ) ;
166178 break ;
167179
168180 // checkbox/radio
169181 case 'checked' :
170- call = b . call ( `$.bind_checked` , context . state . node , getter , setter ) ;
182+ call = b . call ( `$.bind_checked` , context . state . node , get , set ) ;
171183 break ;
172184
173185 case 'focused' :
174- call = b . call ( `$.bind_focused` , context . state . node , setter ) ;
186+ call = b . call ( `$.bind_focused` , context . state . node , set ?? get ) ;
175187 break ;
176188
177189 case 'group' : {
@@ -184,7 +196,7 @@ export function BindDirective(node, context) {
184196
185197 // We need to additionally invoke the value attribute signal to register it as a dependency,
186198 // so that when the value is updated, the group binding is updated
187- let group_getter = getter ;
199+ let group_getter = get ;
188200
189201 if ( parent ?. type === 'RegularElement' ) {
190202 const value = /** @type {any[] } */ (
@@ -215,7 +227,7 @@ export function BindDirective(node, context) {
215227 b . array ( indexes ) ,
216228 context . state . node ,
217229 group_getter ,
218- setter
230+ set ?? get
219231 ) ;
220232 break ;
221233 }
0 commit comments