Skip to content

Commit 14b27b7

Browse files
authored
Merge pull request #947 from sveltejs/gh-934
throw error on illegal context
2 parents 5823150 + c9aa723 commit 14b27b7

File tree

6 files changed

+35
-4
lines changed

6 files changed

+35
-4
lines changed

src/parse/state/mustache.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import readExpression from '../read/expression';
22
import { whitespace } from '../../utils/patterns';
33
import { trimStart, trimEnd } from '../../utils/trim';
4+
import reservedNames from '../../utils/reservedNames';
45
import { Parser } from '../index';
56
import { Node } from '../../interfaces';
67

@@ -168,8 +169,15 @@ export default function mustache(parser: Parser) {
168169

169170
do {
170171
parser.allowWhitespace();
172+
173+
const start = parser.index;
171174
const destructuredContext = parser.read(validIdentifier);
175+
172176
if (!destructuredContext) parser.error(`Expected name`);
177+
if (reservedNames.has(destructuredContext)) {
178+
parser.error(`'${destructuredContext}' is a reserved word in JavaScript and cannot be used here`, start);
179+
}
180+
173181
block.destructuredContexts.push(destructuredContext);
174182
parser.allowWhitespace();
175183
} while (parser.eat(','));
@@ -180,7 +188,11 @@ export default function mustache(parser: Parser) {
180188
parser.allowWhitespace();
181189
parser.eat(']', true);
182190
} else {
183-
block.context = parser.read(validIdentifier); // TODO check it's not a keyword
191+
const start = parser.index;
192+
block.context = parser.read(validIdentifier);
193+
if (reservedNames.has(block.context)) {
194+
parser.error(`'${block.context}' is a reserved word in JavaScript and cannot be used here`, start);
195+
}
184196

185197
if (!block.context) parser.error(`Expected name`);
186198
}

src/utils/reservedNames.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,4 @@ const reservedNames = new Set([
4949
'yield',
5050
]);
5151

52-
// prevent e.g. `{{#each states as state}}` breaking
53-
reservedNames.add('state');
54-
5552
export default reservedNames;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[{
2+
"message": "'case' is a reserved word in JavaScript and cannot be used here",
3+
"loc": {
4+
"line": 1,
5+
"column": 18
6+
},
7+
"pos": 18
8+
}]
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{{#each cases as [case]}}
2+
{{case.title}}
3+
{{/each}}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[{
2+
"message": "'case' is a reserved word in JavaScript and cannot be used here",
3+
"loc": {
4+
"line": 1,
5+
"column": 17
6+
},
7+
"pos": 17
8+
}]
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{{#each cases as case}}
2+
{{case.title}}
3+
{{/each}}

0 commit comments

Comments
 (0)