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 32x 32x 32x 22x 22x 32x 32x 32x 32x 32x 32x 32x 32x 32x 32x 32x 22x 22x 32x 32x 32x 32x 32x  
/** @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();
}