All files / src/compiler/phases/3-transform/client/visitors UseDirective.js

100% Statements 39/39
100% Branches 3/3
100% Functions 1/1
100% Lines 37/37

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 382x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 56x 56x 56x 27x 27x 56x 56x 56x 56x 56x 56x 56x 56x 56x 56x 56x 56x 56x 56x 27x 27x 56x 56x 56x 56x 56x  
/** @import { Expression } from 'estree' */
/** @import { AST } from '#compiler' */
/** @import { ComponentContext } from '../types' */
import * as b from '../../../../utils/builders.js';
import { parse_directive_name } from './shared/utils.js';
 
/**
 * @param {AST.UseDirective} node
 * @param {ComponentContext} context
 */
export function UseDirective(node, context) {
	const params = [b.id('$$node')];
 
	if (node.expression) {
		params.push(b.id('$$action_arg'));
	}
 
	/** @type {Expression[]} */
	const args = [
		context.state.node,
		b.arrow(
			params,
			b.maybe_call(
				/** @type {Expression} */ (context.visit(parse_directive_name(node.name))),
				...params
			)
		)
	];
 
	if (node.expression) {
		args.push(b.thunk(/** @type {Expression} */ (context.visit(node.expression))));
	}
 
	// actions need to run after attribute updates in order with bindings/events
	context.state.after_update.push(b.stmt(b.call('$.action', ...args)));
	context.next();
}