@@ -16,8 +16,12 @@ function clone(value, seen = new Map()) {
1616 /** @type {Record<string, any> } */
1717 const o = { } ;
1818 seen . set ( value , o ) ;
19+
20+ const descriptors = Object . getOwnPropertyDescriptors ( value ) ;
1921 for ( const [ key , v ] of Object . entries ( value ) ) {
20- o [ key ] = clone ( v , seen ) ;
22+ const { get, writable } = descriptors [ key ] ;
23+ const readonly = ! writable || get !== undefined ;
24+ o [ key ] = { key, value : clone ( v , seen ) , readonly } ;
2125 }
2226 return o ;
2327 }
@@ -37,13 +41,13 @@ export function serialize(node) {
3741 switch ( node . type ) {
3842 case 'component' : {
3943 const { $$ : internal = { } } = node . detail ;
40- const ctx = clone ( node . detail . $capture_state ?. ( ) || { } ) ;
44+ const captured = node . detail . $capture_state ?. ( ) || { } ;
4145 const bindings = Object . values ( internal . bound || { } ) . map (
4246 /** @param {Function } f */ ( f ) => f . name ,
4347 ) ;
4448 const props = Object . keys ( internal . props || { } ) . flatMap ( ( key ) => {
45- const value = ctx [ key ] ;
46- delete ctx [ key ] ; // deduplicate for ctx
49+ const value = clone ( captured [ key ] ) ;
50+ delete captured [ key ] ; // deduplicate for ctx
4751 if ( value === undefined ) return [ ] ;
4852
4953 const bounded = bindings . some ( ( f ) => f . includes ( key ) ) ;
@@ -55,7 +59,7 @@ export function serialize(node) {
5559 listeners : Object . entries ( internal . callbacks || { } ) . flatMap ( ( [ event , value ] ) =>
5660 value . map ( /** @param {Function } f */ ( f ) => ( { event, handler : f . toString ( ) } ) ) ,
5761 ) ,
58- ctx : Object . entries ( ctx ) . map ( ( [ key , value ] ) => ( { key, value } ) ) ,
62+ ctx : Object . entries ( captured ) . map ( ( [ key , v ] ) => ( { key, value : clone ( v ) } ) ) ,
5963 } ;
6064 break ;
6165 }
0 commit comments