From cd2ee2519dc63a7c803642fb07b74e16183d61ab Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Wed, 6 Mar 2024 20:11:16 +0100 Subject: [PATCH] illegal-store-subscription part 2 --- packages/svelte/src/compiler/errors.js | 5 --- .../src/compiler/phases/2-analyze/index.js | 33 +++++++++++-------- .../samples/store-shadow-scope/_config.js | 6 ++-- .../_config.js | 6 ++-- 4 files changed, 24 insertions(+), 26 deletions(-) diff --git a/packages/svelte/src/compiler/errors.js b/packages/svelte/src/compiler/errors.js index 1092530db6..72397e1f6e 100644 --- a/packages/svelte/src/compiler/errors.js +++ b/packages/svelte/src/compiler/errors.js @@ -442,11 +442,6 @@ const errors = { // message // }; // }, - // contextual_store: { - // code: 'contextual-store', - // message: - // 'Stores must be declared at the top level of the component (this may change in a future version of Svelte)' - // }, // default_export: { // code: 'default-export', // message: 'A component cannot have a default export' diff --git a/packages/svelte/src/compiler/phases/2-analyze/index.js b/packages/svelte/src/compiler/phases/2-analyze/index.js index 12d1d7ce5e..545fc90ecb 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/index.js +++ b/packages/svelte/src/compiler/phases/2-analyze/index.js @@ -300,21 +300,28 @@ export function analyze_component(root, options) { declaration.initial.source.value === 'svelte/store' )) ) { + let is_nested_store_subscription = false; + for (const reference of references) { + for (let i = reference.path.length - 1; i >= 0; i--) { + const scope = + scopes.get(reference.path[i]) || + module.scopes.get(reference.path[i]) || + instance.scopes.get(reference.path[i]); + if (scope) { + const owner = scope?.owner(store_name); + is_nested_store_subscription = + !!owner && owner !== module.scope && owner !== instance.scope; + break; + } + } + } + if (is_nested_store_subscription) { + error(references[0].node, 'illegal-store-subscription'); + } + if (options.runes !== false) { if (declaration === null && /[a-z]/.test(store_name[0])) { - let is_nested_store_subscription = false; - for (let i = references[0].path.length - 1; i >= 0; i--) { - const scope = scopes.get(references[0].path[i]); - if (scope && scope !== module.scope && scope.declarations.has(store_name)) { - is_nested_store_subscription = true; - break; - } - } - if (is_nested_store_subscription) { - error(references[0].node, 'illegal-store-subscription'); - } else { - error(references[0].node, 'illegal-global', name); - } + error(references[0].node, 'illegal-global', name); } else if (declaration !== null && Runes.includes(/** @type {any} */ (name))) { for (const { node, path } of references) { if (path.at(-1)?.type === 'CallExpression') { diff --git a/packages/svelte/tests/compiler-errors/samples/store-shadow-scope/_config.js b/packages/svelte/tests/compiler-errors/samples/store-shadow-scope/_config.js index 8b7bf1afb1..2a7d0fa0ec 100644 --- a/packages/svelte/tests/compiler-errors/samples/store-shadow-scope/_config.js +++ b/packages/svelte/tests/compiler-errors/samples/store-shadow-scope/_config.js @@ -1,10 +1,8 @@ import { test } from '../../test'; export default test({ - skip: true, error: { - code: '', - message: - 'Stores must be declared at the top level of the component (this may change in a future version of Svelte)' + code: 'illegal-store-subscription', + message: 'Cannot subscribe to stores that are not declared at the top level of the component' } }); diff --git a/packages/svelte/tests/compiler-errors/samples/store-template-expression-scope/_config.js b/packages/svelte/tests/compiler-errors/samples/store-template-expression-scope/_config.js index 8b7bf1afb1..2a7d0fa0ec 100644 --- a/packages/svelte/tests/compiler-errors/samples/store-template-expression-scope/_config.js +++ b/packages/svelte/tests/compiler-errors/samples/store-template-expression-scope/_config.js @@ -1,10 +1,8 @@ import { test } from '../../test'; export default test({ - skip: true, error: { - code: '', - message: - 'Stores must be declared at the top level of the component (this may change in a future version of Svelte)' + code: 'illegal-store-subscription', + message: 'Cannot subscribe to stores that are not declared at the top level of the component' } });