Skip to content

Commit 5e0845f

Browse files
authored
fix: disallow sequence expressions in @const tags (#11357)
* fix: disallow sequence expressions in `@const` tags closes #11349 * allow parenthesized sequence expression
1 parent 0cf10a3 commit 5e0845f

File tree

6 files changed

+32
-3
lines changed

6 files changed

+32
-3
lines changed

.changeset/orange-masks-exercise.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: disallow sequence expressions in `@const` tags

packages/svelte/messages/compile-errors/template.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@
9494
9595
## const_tag_invalid_expression
9696

97-
> {@const ...} must be an assignment
97+
> {@const ...} must consist of a single variable declaration
9898
9999
## const_tag_invalid_placement
100100

packages/svelte/src/compiler/errors.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -729,12 +729,12 @@ export function component_invalid_directive(node) {
729729
}
730730

731731
/**
732-
* {@const ...} must be an assignment
732+
* {@const ...} must consist of a single variable declaration
733733
* @param {null | number | NodeLike} node
734734
* @returns {never}
735735
*/
736736
export function const_tag_invalid_expression(node) {
737-
e(node, "const_tag_invalid_expression", "{@const ...} must be an assignment");
737+
e(node, "const_tag_invalid_expression", "{@const ...} must consist of a single variable declaration");
738738
}
739739

740740
/**

packages/svelte/src/compiler/phases/1-parse/state/tag.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,15 @@ function special(parser) {
551551
parser.eat('=', true);
552552
parser.allow_whitespace();
553553

554+
const expression_start = parser.index;
554555
const init = read_expression(parser);
556+
if (
557+
init.type === 'SequenceExpression' &&
558+
!parser.template.substring(expression_start, init.start).includes('(')
559+
) {
560+
// const a = (b, c) is allowed but a = b, c = d is not;
561+
e.const_tag_invalid_expression(init);
562+
}
555563
parser.allow_whitespace();
556564

557565
parser.eat('}', true);
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: 'const_tag_invalid_expression',
6+
message: '{@const ...} must consist of a single variable declaration',
7+
position: [75, 93]
8+
}
9+
});
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{#if true}
2+
{@const foo = ('bar', 'baz')}
3+
{/if}
4+
5+
{#if true}
6+
{@const foo = 'foo', bar = 'bar'}
7+
{/if}

0 commit comments

Comments
 (0)