All files / src/internal/client/dev elements.js

96.72% Statements 59/61
93.75% Branches 15/16
100% Functions 3/3
96.61% Lines 57/59

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 602x 2x 2x 2x 2x 2x 2x 2x 2x 2x 74x 179x 179x 179x 179x 179x 179x 74x 74x 2x 2x 2x 2x 2x 2x 173x 173x 173x 173x 173x 173x 173x     173x 2x 2x 2x 2x 2x 2x 179x 179x 179x 179x 179x 216x 8x 8x 4x 8x 216x 216x 173x 173x 216x 216x 216x 179x  
import { HYDRATION_END, HYDRATION_START } from '../../../constants.js';
import { hydrating } from '../dom/hydration.js';
 
/**
 * @param {any} fn
 * @param {string} filename
 * @param {import('../../../compiler/phases/3-transform/client/types.js').SourceLocation[]} locations
 * @returns {any}
 */
export function add_locations(fn, filename, locations) {
	return (/** @type {any[]} */ ...args) => {
		const dom = fn(...args);
 
		var node = hydrating ? dom : dom.nodeType === 11 ? dom.firstChild : dom;
		assign_locations(node, filename, locations);
 
		return dom;
	};
}
 
/**
 * @param {Element} element
 * @param {string} filename
 * @param {import('../../../compiler/phases/3-transform/client/types.js').SourceLocation} location
 */
function assign_location(element, filename, location) {
	// @ts-expect-error
	element.__svelte_meta = {
		loc: { file: filename, line: location[0], column: location[1] }
	};
 
	if (location[2]) {
		assign_locations(element.firstChild, filename, location[2]);
	}
}
 
/**
 * @param {Node | null} node
 * @param {string} filename
 * @param {import('../../../compiler/phases/3-transform/client/types.js').SourceLocation[]} locations
 */
function assign_locations(node, filename, locations) {
	var i = 0;
	var depth = 0;
 
	while (node && i < locations.length) {
		if (hydrating && node.nodeType === 8) {
			var comment = /** @type {Comment} */ (node);
			if (comment.data === HYDRATION_START) depth += 1;
			else if (comment.data[0] === HYDRATION_END) depth -= 1;
		}
 
		if (depth === 0 && node.nodeType === 1) {
			assign_location(/** @type {Element} */ (node), filename, locations[i++]);
		}
 
		node = node.nextSibling;
	}
}