fix: track missing proxy keys in unowned deriveds (#18944)

Co-authored-by: svelte-triage-bot <team@svelte.com>
pull/18889/merge
svelte-triage-bot[bot] 3 days ago committed by GitHub
parent 10fdca7d70
commit c85120fb9f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: track missing state property checks in unowned deriveds

@ -2,7 +2,6 @@
import { DEV } from 'esm-env';
import {
get,
active_effect,
update_version,
active_reaction,
set_update_version,
@ -241,7 +240,7 @@ export function proxy(value) {
if (
s !== undefined ||
(active_effect !== null && (!has || get_descriptor(target, prop)?.writable))
(active_reaction !== null && (!has || get_descriptor(target, prop)?.writable))
) {
if (s === undefined) {
s = with_parent(() => {

@ -153,6 +153,46 @@ describe('signals', () => {
};
});
test('unowned deriveds track missing property checks on proxies', () => {
const value = proxy<Record<string, boolean>>({});
return () => {
const has_x = derived(() => 'x' in value);
const owns_y = derived(() => Object.hasOwn(value, 'y'));
assert.isFalse($.get(has_x));
assert.isFalse($.get(owns_y));
value.x = true;
value.y = true;
assert.isTrue($.get(has_x));
assert.isTrue($.get(owns_y));
delete value.x;
delete value.y;
assert.isFalse($.get(has_x));
assert.isFalse($.get(owns_y));
};
});
test('unowned deriveds track missing array indexes', () => {
const value = proxy<boolean[]>([]);
return () => {
const has_first = derived(() => 0 in value);
assert.isFalse($.get(has_first));
value.push(true);
assert.isTrue($.get(has_first));
value.length = 0;
assert.isFalse($.get(has_first));
};
});
test('derived from state', () => {
const log: number[] = [];

Loading…
Cancel
Save