diff --git a/src/client/core.js b/src/client/core.js index 0f203ac..3848557 100644 --- a/src/client/core.js +++ b/src/client/core.js @@ -7,12 +7,25 @@ import { serialize } from './utils.js'; window['#SvelteDevTools'] = { /** * @param {string} id - * @param {string} key + * @param {string[]} keys * @param {any} value */ - inject(id, key, value) { + inject(id, keys, value) { const { detail: component } = v4.map.get(id) || {}; - component && component.$inject_state({ [key]: value }); + if (component) { + const [prop, ...rest] = keys; + const original = component.$capture_state()[prop]; + if (typeof original === 'object') { + let ref = original; + for (let i = 0; i < rest.length - 1; i += 1) { + ref = ref[rest[i]]; + } + ref[rest[rest.length - 1]] = value; + component.$inject_state({ [prop]: original }); + } else { + component.$inject_state({ [prop]: value }); + } + } }, }; diff --git a/src/client/utils.js b/src/client/utils.js index c3eb134..67a3428 100644 --- a/src/client/utils.js +++ b/src/client/utils.js @@ -68,7 +68,7 @@ export function serialize(node) { const listeners = node.detail.__listeners || []; res.detail = { - attributes: attributes.map(({ name: key, value }) => ({ key, value })), + attributes: attributes.map(({ name: key, value }) => ({ key, value, readonly: true })), listeners: listeners.map((o) => ({ ...o, handler: o.handler.toString() })), }; break; @@ -86,7 +86,7 @@ export function serialize(node) { const { ctx, source } = node.detail; const cloned = Object.entries(clone(ctx)); res.detail = { - ctx: cloned.map(([key, value]) => ({ key, value })), + ctx: cloned.map(([key, value]) => ({ key, value, readonly: true })), source: source.slice(source.indexOf('{'), source.indexOf('}') + 1), }; break; diff --git a/src/lib/panel/Editable.svelte b/src/lib/panel/Editable.svelte index be8865a..8a4c8c8 100644 --- a/src/lib/panel/Editable.svelte +++ b/src/lib/panel/Editable.svelte @@ -1,38 +1,66 @@ {#if editing} { - editing = false; // @ts-expect-error - target and value exists - const updated = target.value; - onchange((value = JSON.parse(updated))); + update(target.value); }} onkeydown={({ key, target }) => { if (key !== 'Enter') return; - editing = false; // @ts-expect-error - target and value exists - const updated = target.value; - onchange((value = JSON.parse(updated))); + update(target.value); }} /> {:else} (editing = !readonly)}> - {JSON.stringify(value)} + {type === 'string' ? `"${value}"` : `${value}`} {/if} diff --git a/src/lib/panel/Expandable.svelte b/src/lib/panel/Expandable.svelte deleted file mode 100644 index 8d27af1..0000000 --- a/src/lib/panel/Expandable.svelte +++ /dev/null @@ -1,149 +0,0 @@ - - - - -
{value.source}{/if} - {:else if value.__is === 'symbol'} - {value.name || 'Symbol()'} - {:else if Object.keys(value).length} - Object {…} - {#if expanded} -
{value.source}{/if} + {:else if value.__is === 'symbol'} + {value.name || 'Symbol()'} + {:else if Object.keys(value).length} + Object {…} + + {#if expanded} + {@const entries = Object.entries(value).map(([key, v]) => { + return { key, value: v, readonly }; + })} + +