@@ -16,7 +16,7 @@ export enum Value_Kind {
16
16
}
17
17
18
18
export type Value_Data =
19
- | { kind : Value_Kind . Observed_Getter ; data : Observed_Prop_Data }
19
+ | { kind : Value_Kind . Observed_Getter ; data : Observed_Getter }
20
20
| { kind : Value_Kind . Value ; value : unknown }
21
21
| { kind : Value_Kind . Value_Obj ; obj : { value ?: unknown } }
22
22
@@ -42,10 +42,10 @@ export type Observed_Props = {
42
42
props : Solid . Props
43
43
on_prop_state_change ?: On_Prop_State_Change | undefined
44
44
on_value_update ?: On_Value_Update | undefined
45
- observed_getters : Record < string , Observed_Prop_Data >
45
+ observed_getters : Record < string , Observed_Getter >
46
46
}
47
47
48
- export type Observed_Prop_Data = {
48
+ export type Observed_Getter = {
49
49
v : unknown | typeof $NOT_SET
50
50
n : number // number of listeners
51
51
}
@@ -87,7 +87,7 @@ export function value_node_make_obj(obj: {value?: unknown}): Value_Node {
87
87
export function value_node_make_value ( value : unknown ) : Value_Node {
88
88
return value_node_make ( { kind : Value_Kind . Value , value} )
89
89
}
90
- export function value_node_make_observed_getter ( data : Observed_Prop_Data ) : Value_Node {
90
+ export function value_node_make_observed_getter ( data : Observed_Getter ) : Value_Node {
91
91
return value_node_make ( { kind : Value_Kind . Observed_Getter , data} )
92
92
}
93
93
@@ -123,7 +123,7 @@ export function observed_props_make(props: Solid.Props): Observed_Props {
123
123
props : props ,
124
124
on_prop_state_change : undefined ,
125
125
on_value_update : undefined ,
126
- observed_getters : { } as Record < string , Observed_Prop_Data >
126
+ observed_getters : { } as Record < string , Observed_Getter >
127
127
}
128
128
}
129
129
@@ -132,32 +132,38 @@ export function observed_props_observe_prop(
132
132
key : string ,
133
133
id : ValueItemID ,
134
134
get : ( ) => unknown ,
135
- ) : { data : Observed_Prop_Data ; is_stale : boolean } {
135
+ ) : Observed_Getter {
136
136
if ( observed . observed_getters [ key ] ) {
137
- let o = observed . observed_getters [ key ]
138
- return { data : o , is_stale : o . n === 0 }
137
+ return observed . observed_getters [ key ]
139
138
}
140
139
141
- let o : Observed_Prop_Data = ( observed . observed_getters [ key ] = { v : $NOT_SET , n : 0 } )
140
+ let o : Observed_Getter = observed . observed_getters [ key ] = { v : $NOT_SET , n : 0 }
142
141
143
142
// monkey patch the getter to track when it is accessed and when it is no longer accessed.
144
143
// and to track when the value changes.
145
144
Object . defineProperty ( observed . props , key , {
146
145
get ( ) {
147
146
let value = get ( )
148
- if ( setup . solid . getListener ( ) ) {
149
- utils . onCleanup (
150
- ( ) => -- o . n === 0 && observed . on_prop_state_change ?.( key , PropGetterState . Stale ) ,
151
- )
147
+ let listener = setup . solid . getListener ( )
148
+ if ( listener != null ) {
149
+ utils . onOwnerCleanup ( listener , ( ) => {
150
+ if ( -- o . n === 0 ) {
151
+ observed . on_prop_state_change ?.( key , PropGetterState . Stale )
152
+ }
153
+ } )
152
154
}
153
- ++ o . n === 1 && observed . on_prop_state_change ?.( key , PropGetterState . Live )
154
- if ( value !== o . v ) observed . on_value_update ?.( id )
155
- return ( o . v = value )
155
+ if ( ++ o . n === 1 ) {
156
+ observed . on_prop_state_change ?.( key , PropGetterState . Live )
157
+ }
158
+ if ( value !== o . v ) {
159
+ observed . on_value_update ?.( id )
160
+ }
161
+ return o . v = value
156
162
} ,
157
163
enumerable : true ,
158
164
} )
159
165
160
- return { data : o , is_stale : true }
166
+ return o
161
167
}
162
168
163
169
function compare_proxy_prop_keys (
@@ -256,9 +262,8 @@ export function pre_observe_component_props(
256
262
257
263
// Set up getters for all props to enable tracking
258
264
for ( let [ key , desc ] of Object . entries ( Object . getOwnPropertyDescriptors ( props ) ) ) {
259
- if ( desc . get ) {
260
- let id : ValueItemID = `prop:${ key } `
261
- observed_props_observe_prop ( observed , key , id , desc . get )
265
+ if ( desc . get != null ) {
266
+ observed_props_observe_prop ( observed , key , `prop:${ key } ` , desc . get )
262
267
}
263
268
}
264
269
}
@@ -292,12 +297,12 @@ function map_props<TEl extends object>(
292
297
for ( let [ key , desc ] of Object . entries ( Object . getOwnPropertyDescriptors ( props ) ) ) {
293
298
let id : ValueItemID = `prop:${ key } `
294
299
// GETTER
295
- if ( desc . get ) {
296
- let { data , is_stale } = observed_props_observe_prop ( observed , key , id , desc . get )
297
- ctx . value_map . set ( id , value_node_make_observed_getter ( data ) )
300
+ if ( desc . get != null ) {
301
+ let prop_data = observed_props_observe_prop ( observed , key , id , desc . get )
302
+ ctx . value_map . set ( id , value_node_make_observed_getter ( prop_data ) )
298
303
record [ key ] = {
299
- getter : is_stale ? PropGetterState . Stale : PropGetterState . Live ,
300
- value : data . v !== $NOT_SET ? encodeValue ( data . v , false , ctx . config . eli ) : null ,
304
+ getter : prop_data . n === 0 ? PropGetterState . Stale : PropGetterState . Live ,
305
+ value : prop_data . v !== $NOT_SET ? encodeValue ( prop_data . v , false , ctx . config . eli ) : null ,
301
306
}
302
307
}
303
308
// VALUE
0 commit comments