diff --git a/.changeset/reactive-has-own.md b/.changeset/reactive-has-own.md new file mode 100644 index 0000000000..2ec5d27cee --- /dev/null +++ b/.changeset/reactive-has-own.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: make Object.hasOwn reactive for state proxy ownership changes diff --git a/packages/svelte/src/internal/client/proxy.js b/packages/svelte/src/internal/client/proxy.js index 91d82f8903..d7e8c98896 100644 --- a/packages/svelte/src/internal/client/proxy.js +++ b/packages/svelte/src/internal/client/proxy.js @@ -204,16 +204,21 @@ export function proxy(value) { }, getOwnPropertyDescriptor(target, prop) { + this.has?.(target, prop); + var descriptor = Reflect.getOwnPropertyDescriptor(target, prop); + var s = sources.get(prop); - if (descriptor && 'value' in descriptor) { - var s = sources.get(prop); - if (s) descriptor.value = get(s); - } else if (descriptor === undefined) { - var source = sources.get(prop); - var value = source?.v; + if (s !== undefined) { + var value = get(s); + + if (value === UNINITIALIZED) { + return undefined; + } - if (source !== undefined && value !== UNINITIALIZED) { + if (descriptor && 'value' in descriptor) { + descriptor.value = value; + } else { return { enumerable: true, configurable: true, diff --git a/packages/svelte/tests/runtime-runes/samples/object-has-own-reactive/_config.js b/packages/svelte/tests/runtime-runes/samples/object-has-own-reactive/_config.js new file mode 100644 index 0000000000..17344b343d --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/object-has-own-reactive/_config.js @@ -0,0 +1,24 @@ +import { test } from '../../test'; +import { tick } from 'svelte'; + +export default test({ + html: `

false

`, + + async test({ assert, target }) { + const [add, remove] = target.querySelectorAll('button'); + + add.click(); + await tick(); + assert.htmlEqual( + target.innerHTML, + `

true

` + ); + + remove.click(); + await tick(); + assert.htmlEqual( + target.innerHTML, + `

false

` + ); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/object-has-own-reactive/main.svelte b/packages/svelte/tests/runtime-runes/samples/object-has-own-reactive/main.svelte new file mode 100644 index 0000000000..bd0773ae83 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/object-has-own-reactive/main.svelte @@ -0,0 +1,7 @@ + + + + +

{Object.hasOwn(state, 'y')}