From 0c21b6a22046b79f11ff9b76255e0c4951054a45 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 27 Apr 2018 09:20:20 -0400 Subject: [PATCH] destructuring --- src/generators/nodes/EachBlock.ts | 6 ++++++ src/generators/server-side-rendering/visitors/EachBlock.ts | 7 +++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/generators/nodes/EachBlock.ts b/src/generators/nodes/EachBlock.ts index e8dc64a0b7..f4d90a8cfc 100644 --- a/src/generators/nodes/EachBlock.ts +++ b/src/generators/nodes/EachBlock.ts @@ -36,6 +36,12 @@ export default class EachBlock extends Node { // TODO handle indexes and destructuring this.scope.add(this.context, this.expression.dependencies); + // TODO more general approach to destructuring + this.destructuredContexts = info.destructuredContexts || []; + this.destructuredContexts.forEach(name => { + this.scope.add(name, this.expression.dependencies); + }); + this.children = mapChildren(compiler, this, this.scope, info.children); this.else = info.else diff --git a/src/generators/server-side-rendering/visitors/EachBlock.ts b/src/generators/server-side-rendering/visitors/EachBlock.ts index ed8bd2f123..4c542e65bb 100644 --- a/src/generators/server-side-rendering/visitors/EachBlock.ts +++ b/src/generators/server-side-rendering/visitors/EachBlock.ts @@ -10,9 +10,12 @@ export default function visitEachBlock( ) { const { snippet } = node.expression; + const props = [`${node.context}: item`] + .concat(node.destructuredContexts.map((name, i) => `${name}: item[${i}]`)); + const getContext = node.index - ? `(item, i) => Object.assign({}, ctx, { ${node.context}: item, ${node.index}: i })` - : `item => Object.assign({}, ctx, { ${node.context}: item })`; + ? `(item, i) => Object.assign({}, ctx, { ${props.join(', ')}, ${node.index}: i })` + : `item => Object.assign({}, ctx, { ${props.join(', ')} })`; const open = `\${ ${node.else ? `${snippet}.length ? ` : ''}__each(${snippet}, ${getContext}, ctx => \``; generator.append(open);