Skip to content

Commit 862949d

Browse files
fix: increment version when creating new source in Map.get or Map.has (#11913)
Closes #11909
1 parent ca6e9b5 commit 862949d

File tree

4 files changed

+72
-21
lines changed

4 files changed

+72
-21
lines changed

.changeset/cold-beans-tease.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: increment version when creating new source in Map.get or Map.has

packages/svelte/src/reactivity/map.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export class ReactiveMap extends Map {
4545
if (ret !== undefined) {
4646
s = source(Symbol());
4747
sources.set(key, s);
48+
this.#increment_version();
4849
} else {
4950
// We should always track the version in case
5051
// the Set ever gets this value in the future.
@@ -77,6 +78,7 @@ export class ReactiveMap extends Map {
7778
if (ret !== undefined) {
7879
s = source(Symbol());
7980
sources.set(key, s);
81+
this.#increment_version();
8082
} else {
8183
// We should always track the version in case
8284
// the Set ever gets this value in the future.

packages/svelte/tests/runtime-runes/samples/reactive-map/_config.js

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,49 +2,67 @@ import { flushSync } from '../../../../src/index-client';
22
import { test } from '../../test';
33

44
export default test({
5-
html: `<button>add</button><button>delete</button><button>clear</button>`,
5+
html: `<button>set if</button><button>set if 1</button><button>add</button><button>delete</button><button>clear</button><div>0:0</div>`,
66

77
test({ assert, target }) {
8-
const [btn, btn2, btn3] = target.querySelectorAll('button');
8+
const [btn, btn2, btn3, btn4, btn5] = target.querySelectorAll('button');
99

1010
flushSync(() => {
1111
btn?.click();
1212
});
1313

1414
assert.htmlEqual(
1515
target.innerHTML,
16-
`<button>add</button><button>delete</button><button>clear</button><div>1:1</div>`
16+
`<button>set if</button><button>set if 1</button><button>add</button><button>delete</button><button>clear</button><div>0:1</div>`
1717
);
1818

1919
flushSync(() => {
20-
btn?.click();
20+
btn2?.click();
2121
});
2222

23+
assert.htmlEqual(
24+
target.innerHTML,
25+
`<button>set if</button><button>set if 1</button><button>add</button><button>delete</button><button>clear</button><div>0:0</div>`
26+
);
27+
2328
flushSync(() => {
24-
btn?.click();
29+
btn3?.click();
2530
});
2631

2732
assert.htmlEqual(
2833
target.innerHTML,
29-
`<button>add</button><button>delete</button><button>clear</button><div>1:1</div><div>2:2</div><div>3:3</div>`
34+
`<button>set if</button><button>set if 1</button><button>add</button><button>delete</button><button>clear</button><div>0:0</div><div>2:2</div>`
3035
);
3136

3237
flushSync(() => {
33-
btn2?.click();
38+
btn3?.click();
39+
});
40+
41+
flushSync(() => {
42+
btn3?.click();
3443
});
3544

3645
assert.htmlEqual(
3746
target.innerHTML,
38-
`<button>add</button><button>delete</button><button>clear</button><div>1:1</div><div>2:2</div>`
47+
`<button>set if</button><button>set if 1</button><button>add</button><button>delete</button><button>clear</button><div>0:0</div><div>2:2</div><div>3:3</div><div>4:4</div>`
3948
);
4049

4150
flushSync(() => {
42-
btn3?.click();
51+
btn4?.click();
52+
});
53+
54+
assert.htmlEqual(
55+
target.innerHTML,
56+
`<button>set if</button><button>set if 1</button><button>add</button><button>delete</button><button>clear</button><div>0:0</div><div>2:2</div><div>3:3</div>`
57+
);
58+
59+
flushSync(() => {
60+
btn5?.click();
4361
});
4462

4563
assert.htmlEqual(
4664
target.innerHTML,
47-
`<button>add</button><button>delete</button><button>clear</button>`
65+
`<button>set if</button><button>set if 1</button><button>add</button><button>delete</button><button>clear</button>`
4866
);
4967
}
5068
});

packages/svelte/tests/runtime-runes/samples/reactive-map/main.svelte

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,46 @@
11
<script>
2-
import {Map} from 'svelte/reactivity';
2+
import { Map } from 'svelte/reactivity';
33
4-
let state = new Map();
4+
let state = new Map([[0, 0]]);
55
</script>
66

7-
<button onclick={() => {
8-
state.set(state.size + 1, state.size + 1);
9-
}}>add</button>
7+
<button
8+
onclick={() => {
9+
if (state.has(0)) {
10+
state.set(0, 1);
11+
}
12+
}}
13+
>
14+
set if
15+
</button>
1016

11-
<button onclick={() => {
12-
state.delete(state.size);
13-
}}>delete</button>
17+
<button
18+
onclick={() => {
19+
if (state.get(0) === 1) {
20+
state.set(0, 0);
21+
}
22+
}}
23+
>
24+
set if 1
25+
</button>
1426

15-
<button onclick={() => {
16-
state.clear();
17-
}}>clear</button>
27+
<button
28+
onclick={() => {
29+
state.set(state.size + 1, state.size + 1);
30+
}}>add</button
31+
>
32+
33+
<button
34+
onclick={() => {
35+
state.delete(state.size);
36+
}}>delete</button
37+
>
38+
39+
<button
40+
onclick={() => {
41+
state.clear();
42+
}}>clear</button
43+
>
1844

1945
{#each state as [key, value]}
2046
<div>{key}:{value}</div>

0 commit comments

Comments
 (0)