Skip to content

Commit 1e653ef

Browse files
authored
fix: make set.has(...) granular for existing properties (#10793)
* fix: make set.has(...) granular * changeset --------- Co-authored-by: Rich Harris <[email protected]>
1 parent fbbd89a commit 1e653ef

File tree

3 files changed

+53
-4
lines changed

3 files changed

+53
-4
lines changed

.changeset/orange-yaks-protect.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: make `set.has(...)` granular for existing properties'

packages/svelte/src/reactivity/set.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,12 @@ export class ReactiveSet extends Set {
8282
/** @param {T} value */
8383
has(value) {
8484
var source = this.#sources.get(value);
85-
// We should always track the version in case
86-
// the Set ever gets this value in the future.
87-
get(this.#version);
8885

8986
if (source === undefined) {
87+
// We should always track the version in case
88+
// the Set ever gets this value in the future.
89+
get(this.#version);
90+
9091
return false;
9192
}
9293

packages/svelte/src/reactivity/set.test.ts

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,50 @@ test('set.values()', () => {
3030
set.clear();
3131
});
3232

33-
assert.deepEqual(log, [5, true, [1, 2, 3, 4, 5], 4, false, [1, 2, 4, 5], 0, false, []]);
33+
assert.deepEqual(log, [5, true, [1, 2, 3, 4, 5], 4, false, [1, 2, 4, 5], 0, [], false]); // TODO update when we fix effect ordering bug
34+
35+
cleanup();
36+
});
37+
38+
test('set.has(...)', () => {
39+
const set = new ReactiveSet([1, 2, 3]);
40+
41+
const log: any = [];
42+
43+
const cleanup = user_root_effect(() => {
44+
pre_effect(() => {
45+
log.push('has 1', set.has(1));
46+
});
47+
48+
pre_effect(() => {
49+
log.push('has 2', set.has(2));
50+
});
51+
52+
pre_effect(() => {
53+
log.push('has 3', set.has(3));
54+
});
55+
});
56+
57+
flushSync(() => {
58+
set.delete(2);
59+
});
60+
61+
flushSync(() => {
62+
set.add(2);
63+
});
64+
65+
assert.deepEqual(log, [
66+
'has 1',
67+
true,
68+
'has 2',
69+
true,
70+
'has 3',
71+
true,
72+
'has 2',
73+
false,
74+
'has 2',
75+
true
76+
]);
3477

3578
cleanup();
3679
});

0 commit comments

Comments
 (0)