Skip to content

Commit 08ef730

Browse files
committed
fix: throw error when auto-subscribed store variable shadow by local variable
1 parent f90639d commit 08ef730

File tree

6 files changed

+48
-6
lines changed

6 files changed

+48
-6
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

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) {
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>

0 commit comments

Comments
 (0)