Skip to content

Commit be27fe7

Browse files
feat: fine-grained readonly markers (#195)
Co-authored-by: Ignatius Bagus <[email protected]>
1 parent 2fa5cae commit be27fe7

File tree

2 files changed

+10
-10
lines changed

2 files changed

+10
-10
lines changed

workspace/extension/src/client/utils.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

workspace/extension/src/lib/panel/PropertyList.svelte

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,7 @@
8686
<span class="object">Object &lbrace;&hellip;&rbrace;</span>
8787

8888
{#if expanded[key]}
89-
{@const entries = Object.entries(value).map(([key, v]) => {
90-
return { key, value: v, readonly };
91-
})}
92-
93-
<PropertyList {entries} {keys} />
89+
<PropertyList entries={Object.values(value)} {keys} />
9490
{/if}
9591
{:else}
9692
<span class="object">Object &lbrace; &rbrace;</span>

0 commit comments

Comments
 (0)