All files / src/internal/client/dom/blocks svelte-component.js

100% Statements 32/32
100% Branches 8/8
100% Functions 1/1
100% Lines 31/31

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 322x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 74x 74x 74x 74x 74x 74x 74x 146x 142x 146x 66x 66x 66x 142x 146x 128x 128x 74x 74x  
import { block, branch, pause_effect } from '../../reactivity/effects.js';
 
// TODO seems weird that `anchor` is unused here — possible bug?
 
/**
 * @template P
 * @template {(props: P) => void} C
 * @param {() => C} get_component
 * @param {(component: C) => import('#client').Dom | void} render_fn
 * @returns {void}
 */
export function component(get_component, render_fn) {
	/** @type {C} */
	let component;
 
	/** @type {import('#client').Effect | null} */
	let effect;
 
	block(() => {
		if (component === (component = get_component())) return;
 
		if (effect) {
			pause_effect(effect);
			effect = null;
		}
 
		if (component) {
			effect = branch(() => render_fn(component));
		}
	});
}