All files / src/internal/client/dom/blocks snippet.js

100% Statements 59/59
100% Branches 9/9
100% Functions 2/2
100% Lines 55/55

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 49 50 51 52 53 54 55 562x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 72x 72x 72x 72x 72x 72x 72x 90x 86x 90x 14x 14x 14x 86x 86x 86x 86x 72x 72x 2x 2x 2x 2x 2x 2x 2x 2x 13x 13x 13x 13x 10x 10x 10x 10x 10x 10x 10x 10x 10x 13x 13x  
import { add_snippet_symbol } from '../../../shared/validate.js';
import { EFFECT_TRANSPARENT } from '../../constants.js';
import { branch, block, destroy_effect } from '../../reactivity/effects.js';
import { current_component_context, set_current_component_context } from '../../runtime.js';
 
/**
 * @template {(node: import('#client').TemplateNode, ...args: any[]) => import('#client').Dom} SnippetFn
 * @param {() => SnippetFn | null | undefined} get_snippet
 * @param {import('#client').TemplateNode} node
 * @param {(() => any)[]} args
 * @returns {void}
 */
export function snippet(get_snippet, node, ...args) {
	/** @type {SnippetFn | null | undefined} */
	var snippet;
 
	/** @type {import('#client').Effect | null} */
	var snippet_effect;
 
	block(() => {
		if (snippet === (snippet = get_snippet())) return;
 
		if (snippet_effect) {
			destroy_effect(snippet_effect);
			snippet_effect = null;
		}
 
		if (snippet) {
			snippet_effect = branch(() => /** @type {SnippetFn} */ (snippet)(node, ...args));
		}
	}, EFFECT_TRANSPARENT);
}
 
/**
 * In development, wrap the snippet function so that it passes validation, and so that the
 * correct component context is set for ownership checks
 * @param {(node: import('#client').TemplateNode, ...args: any[]) => import('#client').Dom} fn
 * @returns
 */
export function wrap_snippet(fn) {
	let component = current_component_context;
 
	return add_snippet_symbol(
		(/** @type {import('#client').TemplateNode} */ node, /** @type {any[]} */ ...args) => {
			var previous_component_context = current_component_context;
			set_current_component_context(component);
 
			try {
				return fn(node, ...args);
			} finally {
				set_current_component_context(previous_component_context);
			}
		}
	);
}