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

100% Statements 36/36
100% Branches 3/3
100% Functions 1/1
100% Lines 34/34

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 352x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 48x 48x 48x 27x 27x 48x 48x 48x 48x 48x 48x 48x 48x 48x 48x 48x 27x 27x 48x 48x 48x 48x 48x  
/** @import { Expression } from 'estree' */
/** @import { UseDirective } from '#compiler' */
/** @import { ComponentContext } from '../types' */
import * as b from '../../../../utils/builders.js';
import { parse_directive_name } from './shared/utils.js';
 
/**
 * @param {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.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();
}