brute force new keyed each block syntax

pull/1330/head
Rich-Harris 6 years ago
parent cc0055cf82
commit 90a372ebf3

@ -274,7 +274,25 @@ export default function mustache(parser: Parser) {
parser.allowWhitespace();
}
if (parser.eat('@')) {
if (parser.eat('key')) {
parser.requireWhitespace();
const expression = readExpression(parser);
// TODO eventually, we should accept any expression, and turn
// it into a function. For now, assume that every expression
// follows the `foo.id` pattern, and equates to `@id`
if (
expression.type !== 'MemberExpression' ||
expression.property.computed ||
expression.property.type !== 'Identifier'
) {
parser.error('invalid key', expression.start);
}
block.key = expression.property.name;
parser.allowWhitespace();
} else if (parser.eat('@')) {
block.key = parser.readIdentifier();
if (!block.key) parser.error(`Expected name`);
parser.allowWhitespace();

@ -2,7 +2,7 @@ import assert from 'assert';
import fs from 'fs';
import { svelte, tryToLoadJson } from '../helpers.js';
describe.only('parse', () => {
describe('parse', () => {
fs.readdirSync('test/parser/samples').forEach(dir => {
if (dir[0] === '.') return;

@ -7,30 +7,38 @@
"children": [
{
"start": 0,
"end": 35,
"type": "Text",
"data": "{#each todos as todo key todo.id}\n\t"
},
{
"start": 35,
"end": 48,
"type": "Element",
"name": "p",
"attributes": [],
"end": 56,
"type": "EachBlock",
"expression": {
"type": "Identifier",
"start": 7,
"end": 12,
"name": "todos"
},
"children": [
{
"start": 38,
"end": 44,
"type": "Text",
"data": "{todo}"
"start": 35,
"end": 48,
"type": "Element",
"name": "p",
"attributes": [],
"children": [
{
"start": 38,
"end": 44,
"type": "MustacheTag",
"expression": {
"type": "Identifier",
"start": 39,
"end": 43,
"name": "todo"
}
}
]
}
]
},
{
"start": 48,
"end": 56,
"type": "Text",
"data": "\n{/each}"
],
"context": "todo",
"key": "id"
}
]
},

@ -1,36 +1,36 @@
{
"hash": 2025411181,
"hash": "3sm0ec",
"html": {
"start": 0,
"end": 54,
"end": 56,
"type": "Fragment",
"children": [
{
"start": 0,
"end": 54,
"end": 56,
"type": "EachBlock",
"expression": {
"type": "Identifier",
"start": 8,
"end": 13,
"start": 7,
"end": 12,
"name": "todos"
},
"children": [
{
"start": 29,
"end": 44,
"start": 35,
"end": 48,
"type": "Element",
"name": "p",
"attributes": [],
"children": [
{
"start": 32,
"end": 40,
"start": 38,
"end": 44,
"type": "MustacheTag",
"expression": {
"type": "Identifier",
"start": 34,
"end": 38,
"start": 39,
"end": 43,
"name": "todo"
}
}

Loading…
Cancel
Save