All files / src/internal/client/dom hydration.js

94.36% Statements 67/71
91.66% Branches 11/12
100% Functions 6/6
94.28% Lines 66/70

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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 712x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 4761x 4761x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 10332x 10332x 2x 2x 7824x 7824x 2x 2x 2x 7671x 3419x 3419x 7671x 2x 2x 485x 218x 218x 485x 2x 2x 2x 2x 2x 440x 440x 440x 440x 455x 440x 440x 440x 440x         440x 15x 15x 15x 15x 15x 440x  
/** @import { TemplateNode } from '#client' */
 
import { HYDRATION_END, HYDRATION_START, HYDRATION_START_ELSE } from '../../../constants.js';
 
/**
 * Use this variable to guard everything related to hydration code so it can be treeshaken out
 * if the user doesn't use the `hydrate` method and these code paths are therefore not needed.
 */
export let hydrating = false;
 
/** @param {boolean} value */
export function set_hydrating(value) {
	hydrating = value;
}
 
/**
 * The node that is currently being hydrated. This starts out as the first node inside the opening
 * <!--[--> comment, and updates each time a component calls `$.child(...)` or `$.sibling(...)`.
 * When entering a block (e.g. `{#if ...}`), `hydrate_node` is the block opening comment; by the
 * time we leave the block it is the closing comment, which serves as the block's anchor.
 * @type {TemplateNode}
 */
export let hydrate_node;
 
/** @param {TemplateNode} node */
export function set_hydrate_node(node) {
	return (hydrate_node = node);
}
 
export function hydrate_next() {
	return (hydrate_node = /** @type {TemplateNode} */ (hydrate_node.nextSibling));
}
 
/** @param {TemplateNode} node */
export function reset(node) {
	if (hydrating) {
		hydrate_node = node;
	}
}
 
export function next() {
	if (hydrating) {
		hydrate_next();
	}
}
 
/**
 * Removes all nodes starting at `hydrate_node` up until the next hydration end comment
 */
export function remove_nodes() {
	var depth = 0;
	var node = hydrate_node;
 
	while (true) {
		if (node.nodeType === 8) {
			var data = /** @type {Comment} */ (node).data;
 
			if (data === HYDRATION_END) {
				if (depth === 0) return node;
				depth -= 1;
			} else if (data === HYDRATION_START || data === HYDRATION_START_ELSE) {
				depth += 1;
			}
		}
 
		var next = /** @type {TemplateNode} */ (node.nextSibling);
		node.remove();
		node = next;
	}
}