diff --git a/.changeset/odd-taxis-retire.md b/.changeset/odd-taxis-retire.md deleted file mode 100644 index b60a450c3a..0000000000 --- a/.changeset/odd-taxis-retire.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"svelte": patch ---- - -fix: disallow exporting props, derived and reassigned state from within components diff --git a/packages/svelte/src/compiler/errors.js b/packages/svelte/src/compiler/errors.js index 050e7ec432..a0ff66085a 100644 --- a/packages/svelte/src/compiler/errors.js +++ b/packages/svelte/src/compiler/errors.js @@ -170,12 +170,8 @@ const runes = { 'invalid-legacy-export': () => `Cannot use \`export let\` in runes mode — use $props instead`, /** @param {string} rune */ 'invalid-rune-usage': (rune) => `Cannot use ${rune} rune in non-runes mode`, - 'invalid-state-export': () => - `Cannot export state if it is reassigned. Either export a function returning the state value or only mutate the state value's properties`, - 'invalid-derived-export': () => - `Cannot export derived state. To expose the current derived value, export a function returning its value`, - 'invalid-prop-export': () => - `Cannot export properties. To expose the current value of a property, export a function returning its value`, + 'invalid-state-export': () => `Cannot export state if it is reassigned`, + 'invalid-derived-export': () => `Cannot export derived state`, 'invalid-props-id': () => `$props() can only be used with an object destructuring pattern`, 'invalid-props-pattern': () => `$props() assignment must not contain nested properties or computed keys`, diff --git a/packages/svelte/src/compiler/phases/2-analyze/validation.js b/packages/svelte/src/compiler/phases/2-analyze/validation.js index 959f508742..35374d2f1e 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/validation.js +++ b/packages/svelte/src/compiler/phases/2-analyze/validation.js @@ -733,10 +733,6 @@ function validate_export(node, scope, name) { const binding = scope.get(name); if (!binding) return; - if (binding.kind === 'prop') { - error(node, 'invalid-prop-export'); - } - if (binding.kind === 'derived') { error(node, 'invalid-derived-export'); } @@ -964,20 +960,10 @@ export const validation_runes = merge(validation, a11y_validators, { if (node.label.name !== '$' || path.at(-1)?.type !== 'Program') return; error(node, 'invalid-legacy-reactive-statement'); }, - ExportNamedDeclaration(node, { state, next }) { + ExportNamedDeclaration(node, { state }) { if (node.declaration?.type !== 'VariableDeclaration') return; - - // visit children, so bindings are correctly initialised - next(); - - for (const declarator of node.declaration.declarations) { - for (const id of extract_identifiers(declarator.id)) { - validate_export(node, state.scope, id.name); - } - } - - if (state.analysis.instance.scope !== state.scope) return; if (node.declaration.kind !== 'let') return; + if (state.analysis.instance.scope !== state.scope) return; error(node, 'invalid-legacy-export'); }, ExportSpecifier(node, { state }) { diff --git a/packages/svelte/tests/compiler-errors/samples/export-derived-state/_config.js b/packages/svelte/tests/compiler-errors/samples/export-derived-state/_config.js index 31ee52b2ba..1c171d19c0 100644 --- a/packages/svelte/tests/compiler-errors/samples/export-derived-state/_config.js +++ b/packages/svelte/tests/compiler-errors/samples/export-derived-state/_config.js @@ -3,7 +3,7 @@ import { test } from '../../test'; export default test({ error: { code: 'invalid-derived-export', - message: - 'Cannot export derived state. To expose the current derived value, export a function returning its value' + message: 'Cannot export derived state', + position: [24, 66] } }); diff --git a/packages/svelte/tests/compiler-errors/samples/export-derived-state/main.svelte b/packages/svelte/tests/compiler-errors/samples/export-derived-state/main.svelte deleted file mode 100644 index 634022db6a..0000000000 --- a/packages/svelte/tests/compiler-errors/samples/export-derived-state/main.svelte +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/packages/svelte/tests/compiler-errors/samples/export-state-2/_config.js b/packages/svelte/tests/compiler-errors/samples/export-state-2/_config.js deleted file mode 100644 index 09fc4498fa..0000000000 --- a/packages/svelte/tests/compiler-errors/samples/export-state-2/_config.js +++ /dev/null @@ -1,10 +0,0 @@ -import { test } from '../../test'; - -export default test({ - error: { - code: 'invalid-state-export', - message: - "Cannot export state if it is reassigned. Either export a function returning the state value or only mutate the state value's properties", - position: [59, 99] - } -}); diff --git a/packages/svelte/tests/compiler-errors/samples/export-state-2/main.svelte b/packages/svelte/tests/compiler-errors/samples/export-state-2/main.svelte deleted file mode 100644 index ed98777664..0000000000 --- a/packages/svelte/tests/compiler-errors/samples/export-state-2/main.svelte +++ /dev/null @@ -1,15 +0,0 @@ - diff --git a/packages/svelte/tests/compiler-errors/samples/export-state/_config.js b/packages/svelte/tests/compiler-errors/samples/export-state/_config.js index a8e8b4b258..5ddb2a859a 100644 --- a/packages/svelte/tests/compiler-errors/samples/export-state/_config.js +++ b/packages/svelte/tests/compiler-errors/samples/export-state/_config.js @@ -3,8 +3,7 @@ import { test } from '../../test'; export default test({ error: { code: 'invalid-state-export', - message: - "Cannot export state if it is reassigned. Either export a function returning the state value or only mutate the state value's properties", + message: 'Cannot export state if it is reassigned', position: [46, 86] } }); diff --git a/packages/svelte/tests/compiler-errors/samples/runes-export-named-state/_config.js b/packages/svelte/tests/compiler-errors/samples/runes-export-named-state/_config.js index 1eac29db14..a42a651141 100644 --- a/packages/svelte/tests/compiler-errors/samples/runes-export-named-state/_config.js +++ b/packages/svelte/tests/compiler-errors/samples/runes-export-named-state/_config.js @@ -3,8 +3,7 @@ import { test } from '../../test'; export default test({ error: { code: 'invalid-state-export', - message: - "Cannot export state if it is reassigned. Either export a function returning the state value or only mutate the state value's properties", + message: 'Cannot export state if it is reassigned', position: [28, 53] } }); diff --git a/packages/svelte/tests/compiler-errors/samples/runes-export-prop/_config.js b/packages/svelte/tests/compiler-errors/samples/runes-export-prop/_config.js deleted file mode 100644 index ce8f97e0d1..0000000000 --- a/packages/svelte/tests/compiler-errors/samples/runes-export-prop/_config.js +++ /dev/null @@ -1,9 +0,0 @@ -import { test } from '../../test'; - -export default test({ - error: { - code: 'invalid-prop-export', - message: - 'Cannot export properties. To expose the current value of a property, export a function returning its value' - } -}); diff --git a/packages/svelte/tests/compiler-errors/samples/runes-export-prop/main.svelte b/packages/svelte/tests/compiler-errors/samples/runes-export-prop/main.svelte deleted file mode 100644 index 3d3fd554fa..0000000000 --- a/packages/svelte/tests/compiler-errors/samples/runes-export-prop/main.svelte +++ /dev/null @@ -1,4 +0,0 @@ -