diff --git a/documentation/docs/98-reference/.generated/compile-errors.md b/documentation/docs/98-reference/.generated/compile-errors.md index 2fef3bd45d..58aabe20cb 100644 --- a/documentation/docs/98-reference/.generated/compile-errors.md +++ b/documentation/docs/98-reference/.generated/compile-errors.md @@ -648,6 +648,12 @@ Cannot access a computed property of a rune `%name%` is not a valid rune ``` +### rune_invalid_options + +``` +Options for `%rune%` needs to be declared inline +``` + ### rune_invalid_usage ``` diff --git a/packages/svelte/messages/compile-errors/script.md b/packages/svelte/messages/compile-errors/script.md index 0aa6fbed90..7e56490a2e 100644 --- a/packages/svelte/messages/compile-errors/script.md +++ b/packages/svelte/messages/compile-errors/script.md @@ -158,6 +158,10 @@ This turned out to be buggy and unpredictable, particularly when working with de > `%name%` is not a valid rune +## rune_invalid_options + +> Options for `%rune%` needs to be declared inline + ## rune_invalid_usage > Cannot use `%rune%` rune in non-runes mode diff --git a/packages/svelte/src/compiler/errors.js b/packages/svelte/src/compiler/errors.js index 53a6ac6849..e0d1189e29 100644 --- a/packages/svelte/src/compiler/errors.js +++ b/packages/svelte/src/compiler/errors.js @@ -373,6 +373,16 @@ export function rune_invalid_name(node, name) { e(node, 'rune_invalid_name', `\`${name}\` is not a valid rune\nhttps://svelte.dev/e/rune_invalid_name`); } +/** + * Options for `%rune%` needs to be declared inline + * @param {null | number | NodeLike} node + * @param {string} rune + * @returns {never} + */ +export function rune_invalid_options(node, rune) { + e(node, 'rune_invalid_options', `Options for \`${rune}\` needs to be declared inline\nhttps://svelte.dev/e/rune_invalid_options`); +} + /** * Cannot use `%rune%` rune in non-runes mode * @param {null | number | NodeLike} node diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/CallExpression.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/CallExpression.js index 419cfd7702..e9adebd81a 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/CallExpression.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/CallExpression.js @@ -87,8 +87,13 @@ export function CallExpression(node, context) { if ((rune === '$derived' || rune === '$derived.by') && node.arguments.length !== 1) { e.rune_invalid_arguments_length(node, rune, 'exactly one argument'); - } else if (rune === '$state' && node.arguments.length > 2) { - e.rune_invalid_arguments_length(node, rune, 'at most two arguments'); + } else if (rune === '$state' || rune === '$state.raw') { + if (node.arguments.length > 2) { + e.rune_invalid_arguments_length(node, rune, 'at most two arguments'); + } + if (node.arguments.length === 2 && node.arguments[1].type !== 'ObjectExpression') { + e.rune_invalid_options(node.arguments[1], rune); + } } break; diff --git a/packages/svelte/tests/validator/samples/rune-invalid-options/errors.json b/packages/svelte/tests/validator/samples/rune-invalid-options/errors.json new file mode 100644 index 0000000000..0403da6a28 --- /dev/null +++ b/packages/svelte/tests/validator/samples/rune-invalid-options/errors.json @@ -0,0 +1,14 @@ +[ + { + "code": "rune_invalid_options", + "end": { + "column": 29, + "line": 3 + }, + "start": { + "column": 22, + "line": 3 + }, + "message": "Options for `$state` needs to be declared inline" + } +] diff --git a/packages/svelte/tests/validator/samples/rune-invalid-options/input.svelte b/packages/svelte/tests/validator/samples/rune-invalid-options/input.svelte new file mode 100644 index 0000000000..252737e26c --- /dev/null +++ b/packages/svelte/tests/validator/samples/rune-invalid-options/input.svelte @@ -0,0 +1,4 @@ + \ No newline at end of file