Skip to content

Commit cb4f82f

Browse files
authored
fix: handle deletions of state proxy properties (#13008)
1 parent 96117fa commit cb4f82f

File tree

4 files changed

+28
-7
lines changed

4 files changed

+28
-7
lines changed

.changeset/beige-lamps-ring.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: always return true from `deleteProperty` trap

.changeset/green-windows-tap.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: handle deletions of previously-unread state proxy properties

packages/svelte/src/internal/client/proxy.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import * as e from './errors.js';
1919
* @param {T} value
2020
* @param {ProxyMetadata | null} [parent]
2121
* @param {Source<T>} [prev] dev mode only
22-
* @returns {ProxyStateObject<T> | T}
22+
* @returns {T}
2323
*/
2424
export function proxy(value, parent = null, prev) {
2525
// if non-proxyable, or is already a proxy, return `value`
@@ -91,17 +91,17 @@ export function proxy(value, parent = null, prev) {
9191

9292
deleteProperty(target, prop) {
9393
var s = sources.get(prop);
94-
var exists = s !== undefined ? s.v !== UNINITIALIZED : prop in target;
9594

96-
if (s !== undefined) {
95+
if (s === undefined) {
96+
if (prop in target) {
97+
sources.set(prop, source(UNINITIALIZED));
98+
}
99+
} else {
97100
set(s, UNINITIALIZED);
98-
}
99-
100-
if (exists) {
101101
update_version(version);
102102
}
103103

104-
return exists;
104+
return true;
105105
},
106106

107107
get(target, prop, receiver) {

packages/svelte/src/internal/client/proxy.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,14 @@ test('does not re-proxy proxies', () => {
8585
assert.equal(inner.count, 1);
8686
assert.equal(outer.inner.count, 1);
8787
});
88+
89+
test('deletes a property', () => {
90+
const state = proxy({ a: 1, b: 2 } as { a?: number; b?: number; c?: number });
91+
92+
delete state.a;
93+
assert.equal(JSON.stringify(state), '{"b":2}');
94+
delete state.a;
95+
96+
// deleting a non-existent property should succeed
97+
delete state.c;
98+
});

0 commit comments

Comments
 (0)