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 54x 54x 54x 27x 27x 54x 54x 54x 54x 54x 54x 54x 54x 54x 54x 54x 27x 27x 54x 54x 54x 54x 54x  
/** @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.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();
}