Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 474x 474x 474x 474x 474x 474x 474x 474x 474x 474x 474x 474x 474x 474x 474x 41x 41x 474x 1x 1x 474x 474x 474x 474x 474x 474x 474x 474x 474x 474x 474x 26x 26x 26x 26x 26x 26x 26x 26x 26x 26x 26x 26x 26x 26x 26x 26x 474x 448x 448x 474x | /** @import { BlockStatement, Expression, Pattern, Statement } from 'estree' */ /** @import { EachBlock } from '#compiler' */ /** @import { ComponentContext } from '../types.js' */ import { BLOCK_OPEN_ELSE } from '../../../../../internal/server/hydration.js'; import * as b from '../../../../utils/builders.js'; import { block_close, block_open } from './shared/utils.js'; /** * @param {EachBlock} node * @param {ComponentContext} context */ export function EachBlock(node, context) { const state = context.state; const each_node_meta = node.metadata; const collection = /** @type {Expression} */ (context.visit(node.expression)); const item = each_node_meta.item; const index = each_node_meta.contains_group_binding || !node.index ? each_node_meta.index : b.id(node.index); const array_id = state.scope.root.unique('each_array'); state.init.push(b.const(array_id, b.call('$.ensure_array_like', collection))); /** @type {Statement[]} */ const each = [b.const(item, b.member(array_id, index, true))]; if (node.context.type !== 'Identifier') { each.push(b.const(/** @type {Pattern} */ (node.context), item)); } if (index.name !== node.index && node.index != null) { each.push(b.let(node.index, index)); } each.push(.../** @type {BlockStatement} */ (context.visit(node.body)).body); const for_loop = b.for( b.let(index, b.literal(0)), b.binary('<', index, b.member(array_id, b.id('length'))), b.update('++', index, false), b.block(each) ); if (node.fallback) { const open = b.stmt(b.assignment('+=', b.id('$$payload.out'), block_open)); const fallback = /** @type {BlockStatement} */ (context.visit(node.fallback)); fallback.body.unshift( b.stmt(b.assignment('+=', b.id('$$payload.out'), b.literal(BLOCK_OPEN_ELSE))) ); state.template.push( b.if( b.binary('!==', b.member(array_id, b.id('length')), b.literal(0)), b.block([open, for_loop]), fallback ), block_close ); } else { state.template.push(block_open, for_loop, block_close); } } |