@@ -16,8 +16,12 @@ function clone(value, seen = new Map()) {
16
16
/** @type {Record<string, any> } */
17
17
const o = { } ;
18
18
seen . set ( value , o ) ;
19
+
20
+ const descriptors = Object . getOwnPropertyDescriptors ( value ) ;
19
21
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 } ;
21
25
}
22
26
return o ;
23
27
}
@@ -37,13 +41,13 @@ export function serialize(node) {
37
41
switch ( node . type ) {
38
42
case 'component' : {
39
43
const { $$ : internal = { } } = node . detail ;
40
- const ctx = clone ( node . detail . $capture_state ?. ( ) || { } ) ;
44
+ const captured = node . detail . $capture_state ?. ( ) || { } ;
41
45
const bindings = Object . values ( internal . bound || { } ) . map (
42
46
/** @param {Function } f */ ( f ) => f . name ,
43
47
) ;
44
48
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
47
51
if ( value === undefined ) return [ ] ;
48
52
49
53
const bounded = bindings . some ( ( f ) => f . includes ( key ) ) ;
@@ -55,7 +59,7 @@ export function serialize(node) {
55
59
listeners : Object . entries ( internal . callbacks || { } ) . flatMap ( ( [ event , value ] ) =>
56
60
value . map ( /** @param {Function } f */ ( f ) => ( { event, handler : f . toString ( ) } ) ) ,
57
61
) ,
58
- ctx : Object . entries ( ctx ) . map ( ( [ key , value ] ) => ( { key, value } ) ) ,
62
+ ctx : Object . entries ( captured ) . map ( ( [ key , v ] ) => ( { key, value : clone ( v ) } ) ) ,
59
63
} ;
60
64
break ;
61
65
}
0 commit comments