@@ -16,7 +16,7 @@ export enum Value_Kind {
1616}
1717
1818export type Value_Data =
19- | { kind : Value_Kind . Observed_Getter ; data : Observed_Prop_Data }
19+ | { kind : Value_Kind . Observed_Getter ; data : Observed_Getter }
2020 | { kind : Value_Kind . Value ; value : unknown }
2121 | { kind : Value_Kind . Value_Obj ; obj : { value ?: unknown } }
2222
@@ -42,10 +42,10 @@ export type Observed_Props = {
4242 props : Solid . Props
4343 on_prop_state_change ?: On_Prop_State_Change | undefined
4444 on_value_update ?: On_Value_Update | undefined
45- observed_getters : Record < string , Observed_Prop_Data >
45+ observed_getters : Record < string , Observed_Getter >
4646}
4747
48- export type Observed_Prop_Data = {
48+ export type Observed_Getter = {
4949 v : unknown | typeof $NOT_SET
5050 n : number // number of listeners
5151}
@@ -87,7 +87,7 @@ export function value_node_make_obj(obj: {value?: unknown}): Value_Node {
8787export function value_node_make_value ( value : unknown ) : Value_Node {
8888 return value_node_make ( { kind : Value_Kind . Value , value} )
8989}
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 {
9191 return value_node_make ( { kind : Value_Kind . Observed_Getter , data} )
9292}
9393
@@ -123,7 +123,7 @@ export function observed_props_make(props: Solid.Props): Observed_Props {
123123 props : props ,
124124 on_prop_state_change : undefined ,
125125 on_value_update : undefined ,
126- observed_getters : { } as Record < string , Observed_Prop_Data >
126+ observed_getters : { } as Record < string , Observed_Getter >
127127 }
128128}
129129
@@ -132,32 +132,38 @@ export function observed_props_observe_prop(
132132 key : string ,
133133 id : ValueItemID ,
134134 get : ( ) => unknown ,
135- ) : { data : Observed_Prop_Data ; is_stale : boolean } {
135+ ) : Observed_Getter {
136136 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 ]
139138 }
140139
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 }
142141
143142 // monkey patch the getter to track when it is accessed and when it is no longer accessed.
144143 // and to track when the value changes.
145144 Object . defineProperty ( observed . props , key , {
146145 get ( ) {
147146 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+ } )
152154 }
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
156162 } ,
157163 enumerable : true ,
158164 } )
159165
160- return { data : o , is_stale : true }
166+ return o
161167}
162168
163169function compare_proxy_prop_keys (
@@ -256,9 +262,8 @@ export function pre_observe_component_props(
256262
257263 // Set up getters for all props to enable tracking
258264 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 )
262267 }
263268 }
264269}
@@ -292,12 +297,12 @@ function map_props<TEl extends object>(
292297 for ( let [ key , desc ] of Object . entries ( Object . getOwnPropertyDescriptors ( props ) ) ) {
293298 let id : ValueItemID = `prop:${ key } `
294299 // 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 ) )
298303 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 ,
301306 }
302307 }
303308 // VALUE
0 commit comments