Skip to content

Commit 93010ce

Browse files
authored
Merge branch 'main' into tanlh/feat/better-snippet-error
2 parents 77d8503 + d1976c0 commit 93010ce

File tree

13 files changed

+87
-13
lines changed

13 files changed

+87
-13
lines changed

.changeset/afraid-kids-hide.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: throw error when auto-subscribed store variable shadow by local variable

.changeset/shy-fishes-drive.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: fix string name of reactive map and set iterator

packages/svelte/src/compiler/phases/2-analyze/index.js

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -302,23 +302,26 @@ export function analyze_component(root, source, options) {
302302
declaration.initial.source.value === 'svelte/store'
303303
))
304304
) {
305-
let is_nested_store_subscription = false;
306-
for (const reference of references) {
305+
let is_nested_store_subscription_node = undefined;
306+
search: for (const reference of references) {
307307
for (let i = reference.path.length - 1; i >= 0; i--) {
308308
const scope =
309309
scopes.get(reference.path[i]) ||
310310
module.scopes.get(reference.path[i]) ||
311311
instance.scopes.get(reference.path[i]);
312312
if (scope) {
313313
const owner = scope?.owner(store_name);
314-
is_nested_store_subscription =
315-
!!owner && owner !== module.scope && owner !== instance.scope;
314+
if (!!owner && owner !== module.scope && owner !== instance.scope) {
315+
is_nested_store_subscription_node = reference.node;
316+
break search;
317+
}
316318
break;
317319
}
318320
}
319321
}
320-
if (is_nested_store_subscription) {
321-
error(references[0].node, 'illegal-store-subscription');
322+
323+
if (is_nested_store_subscription_node) {
324+
error(is_nested_store_subscription_node, 'illegal-store-subscription');
322325
}
323326

324327
if (options.runes !== false) {

packages/svelte/src/compiler/phases/2-analyze/validation.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,8 +356,6 @@ const validation = {
356356
if (binding.kind === 'snippet') {
357357
error(node, 'invalid-snippet-assignment');
358358
}
359-
360-
// TODO handle mutations of non-state/props in runes mode
361359
}
362360

363361
if (node.name === 'group') {

packages/svelte/src/reactivity/map.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,14 +136,15 @@ export class ReactiveMap extends Map {
136136

137137
values() {
138138
get(this.#version);
139-
return map(this.#sources.values(), get);
139+
return map(this.#sources.values(), get, 'Map Iterator');
140140
}
141141

142142
entries() {
143143
get(this.#version);
144144
return map(
145145
this.#sources.entries(),
146-
([key, source]) => /** @type {[K, V]} */ ([key, get(source)])
146+
([key, source]) => /** @type {[K, V]} */ ([key, get(source)]),
147+
'Map Iterator'
147148
);
148149
}
149150

packages/svelte/src/reactivity/set.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,15 +132,15 @@ export class ReactiveSet extends Set {
132132

133133
keys() {
134134
get(this.#version);
135-
return this.#sources.keys();
135+
return map(this.#sources.keys(), (key) => key, 'Set Iterator');
136136
}
137137

138138
values() {
139139
return this.keys();
140140
}
141141

142142
entries() {
143-
return map(this.keys(), (key) => /** @type {[T, T]} */ ([key, key]));
143+
return map(this.keys(), (key) => /** @type {[T, T]} */ ([key, key]), 'Set Iterator');
144144
}
145145

146146
[Symbol.iterator]() {

packages/svelte/src/reactivity/utils.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@
33
* @template U
44
* @param {Iterable<T>} iterable
55
* @param {(value: T) => U} fn
6+
* @param {string} name
67
* @returns {IterableIterator<U>}
78
*/
8-
export function map(iterable, fn) {
9+
export function map(iterable, fn, name) {
910
return {
1011
[Symbol.iterator]: get_this,
1112
next() {
@@ -14,6 +15,10 @@ export function map(iterable, fn) {
1415
}
1516

1617
return { done: true, value: undefined };
18+
},
19+
// @ts-expect-error
20+
get [Symbol.toStringTag]() {
21+
return name;
1722
}
1823
};
1924
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { test } from '../../test';
2+
3+
export default test({
4+
error: {
5+
code: 'illegal-store-subscription',
6+
message: 'Cannot subscribe to stores that are not declared at the top level of the component',
7+
position: [142, 147]
8+
}
9+
});
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<script>
2+
import { writable } from 'svelte/store';
3+
const user = writable(0);
4+
const users = [];
5+
$: selected = users.find(user => user.id == $user);
6+
7+
$: console.log($user);
8+
</script>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { test } from '../../test';
2+
3+
export default test({
4+
error: {
5+
code: 'illegal-store-subscription',
6+
message: 'Cannot subscribe to stores that are not declared at the top level of the component',
7+
position: [167, 172]
8+
}
9+
});
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<script>
2+
import { writable } from 'svelte/store';
3+
const user = writable(0);
4+
const users = [];
5+
6+
$: console.log($user);
7+
$: selected = users.find(user => user.id == $user);
8+
</script>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { test } from '../../test';
2+
3+
export default test({
4+
html: `
5+
<div>[object Set Iterator] [object Set Iterator] [object Set Iterator]</div>
6+
<div>[object Set Iterator] [object Set Iterator] [object Set Iterator]</div>
7+
<div>[object Map Iterator] [object Map Iterator] [object Map Iterator]</div>
8+
<div>[object Map Iterator] [object Map Iterator] [object Map Iterator]</div>
9+
`
10+
});
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<script>
2+
import { Set as ReactiveSet, Map as ReactiveMap } from 'svelte/reactivity';
3+
4+
let map = new Map();
5+
let set = new Set();
6+
let rmap = new ReactiveMap();
7+
let rset = new ReactiveSet();
8+
</script>
9+
10+
<div>{rset.entries()} {rset.keys()} {rset.values()}</div>
11+
<div>{set.entries()} {set.keys()} {set.values()}</div>
12+
<div>{rmap.entries()} {rmap.keys()} {rmap.values()}</div>
13+
<div>{map.entries()} {map.keys()} {map.values()}</div>

0 commit comments

Comments
 (0)