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

100% Statements 44/44
100% Branches 7/7
100% Functions 1/1
100% Lines 40/40

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 412x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 28x 12x 12x 28x 28x 28x 28x 28x 28x 28x 28x 28x 28x 58x 54x 26x 26x 54x 54x 54x 28x 28x 28x 12x 12x 28x  
/** @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} node
 * @param {() => V} get_key
 * @param {(anchor: Node) => TemplateNode | void} render_fn
 * @returns {void}
 */
export function key_block(node, get_key, render_fn) {
	if (hydrating) {
		hydrate_next();
	}
 
	var anchor = node;
 
	/** @type {V | typeof UNINITIALIZED} */
	var key = UNINITIALIZED;
 
	/** @type {Effect} */
	var 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;
	}
}