All files / src/compiler/phases/3-transform/server/visitors SlotElement.js

100% Statements 50/50
100% Branches 12/12
100% Functions 1/1
100% Lines 48/48

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 492x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 240x 240x 240x 240x 240x 240x 240x 240x 240x 240x 172x 4x 172x 167x 167x 167x 80x 167x 85x 85x 167x 172x 240x 240x 240x 240x 240x 240x 240x 240x 240x 240x 240x 240x 240x 240x 240x  
/** @import { BlockStatement, Expression, ExpressionStatement, Property } from 'estree' */
/** @import { SlotElement } from '#compiler' */
/** @import { ComponentContext } from '../types.js' */
import * as b from '../../../../utils/builders.js';
import { empty_comment, build_attribute_value } from './shared/utils.js';
 
/**
 * @param {SlotElement} node
 * @param {ComponentContext} context
 */
export function SlotElement(node, context) {
	/** @type {Property[]} */
	const props = [];
 
	/** @type {Expression[]} */
	const spreads = [];
 
	/** @type {Expression} */
	let expression = b.call('$.default_slot', b.id('$$props'));
 
	for (const attribute of node.attributes) {
		if (attribute.type === 'SpreadAttribute') {
			spreads.push(/** @type {Expression} */ (context.visit(attribute)));
		} else if (attribute.type === 'Attribute') {
			const value = build_attribute_value(attribute.value, context, false, true);
 
			if (attribute.name === 'name') {
				expression = b.member(b.member_id('$$props.$$slots'), value, true, true);
			} else if (attribute.name !== 'slot') {
				props.push(b.init(attribute.name, value));
			}
		}
	}
 
	const props_expression =
		spreads.length === 0
			? b.object(props)
			: b.call('$.spread_props', b.array([b.object(props), ...spreads]));
 
	const fallback =
		node.fragment.nodes.length === 0
			? b.literal(null)
			: b.thunk(/** @type {BlockStatement} */ (context.visit(node.fragment)));
 
	const slot = b.call('$.slot', b.id('$$payload'), expression, props_expression, fallback);
 
	context.state.template.push(empty_comment, b.stmt(slot), empty_comment);
}