diff --git a/packages/svelte/src/internal/client/proxy.js b/packages/svelte/src/internal/client/proxy.js index 5787e7cdc6..633c6a0eeb 100644 --- a/packages/svelte/src/internal/client/proxy.js +++ b/packages/svelte/src/internal/client/proxy.js @@ -39,8 +39,11 @@ export function proxy(value, onchange) { } if (STATE_SYMBOL in value) { - // @ts-ignore - value[PROXY_ONCHANGE_SYMBOL](onchange); + if (onchange) { + // @ts-ignore + value[PROXY_ONCHANGE_SYMBOL](onchange); + } + return value; } @@ -144,7 +147,7 @@ export function proxy(value, onchange) { // when we delete a property if the source is a proxy we remove the current onchange from // the proxy `onchanges` so that it doesn't trigger it anymore - if (typeof s.v === 'object' && s.v !== null && STATE_SYMBOL in s.v) { + if (onchange && typeof s.v === 'object' && s.v !== null && STATE_SYMBOL in s.v) { s.v[PROXY_ONCHANGE_SYMBOL](onchange, true); } @@ -161,24 +164,15 @@ export function proxy(value, onchange) { } if (prop === PROXY_ONCHANGE_SYMBOL) { - return ( - /** @type {(() => unknown) | undefined} */ value, - /** @type {boolean} */ remove - ) => { + return (/** @type {(() => unknown)} */ value, /** @type {boolean} */ remove) => { // we either add or remove the passed in value // to the onchanges array or we set every source onchange // to the passed in value (if it's undefined it will make the chain stop) - if (onchange != null && value) { - if (remove) { - onchanges?.delete(value); - } else { - onchanges?.add(value); - } + // if (onchange != null && value) { + if (remove) { + onchanges?.delete(value); } else { - onchange = value; - for (let [, s] of sources) { - s.o = value; - } + onchanges?.add(value); } }; } @@ -277,6 +271,7 @@ export function proxy(value, onchange) { var other_s = sources.get(i + ''); if (other_s !== undefined) { if ( + onchange && typeof other_s.v === 'object' && other_s.v !== null && STATE_SYMBOL in other_s.v @@ -309,11 +304,13 @@ export function proxy(value, onchange) { } } else { has = s.v !== UNINITIALIZED; + // when we set a property if the source is a proxy we remove the current onchange from // the proxy `onchanges` so that it doesn't trigger it anymore - if (typeof s.v === 'object' && s.v !== null && STATE_SYMBOL in s.v) { + if (onchange && typeof s.v === 'object' && s.v !== null && STATE_SYMBOL in s.v) { s.v[PROXY_ONCHANGE_SYMBOL](onchange, true); } + set( s, with_parent(() => proxy(value, onchange))