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

100% Statements 42/42
100% Branches 7/7
100% Functions 1/1
100% Lines 38/38

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 392x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 30x 13x 13x 30x 30x 30x 30x 30x 30x 30x 30x 62x 58x 28x 28x 58x 58x 58x 30x 30x 30x 13x 13x 30x  
/** @import { Effect, TemplateNode } from '#client' */
import { UNINITIALIZED } from '../../../../constants.js';
import { block, branch, pause_effect } from '../../reactivity/effects.js';
import { safe_not_equal } from '../../reactivity/equality.js';
import { hydrate_next, hydrate_node, hydrating } from '../hydration.js';
 
/**
 * @template V
 * @param {TemplateNode} anchor
 * @param {() => V} get_key
 * @param {(anchor: Node) => TemplateNode | void} render_fn
 * @returns {void}
 */
export function key_block(anchor, get_key, render_fn) {
	if (hydrating) {
		hydrate_next();
	}
 
	/** @type {V | typeof UNINITIALIZED} */
	let key = UNINITIALIZED;
 
	/** @type {Effect} */
	let effect;
 
	block(() => {
		if (safe_not_equal(key, (key = get_key()))) {
			if (effect) {
				pause_effect(effect);
			}
 
			effect = branch(() => render_fn(anchor));
		}
	});
 
	if (hydrating) {
		anchor = hydrate_node;
	}
}