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

91.89% Statements 68/74
94.44% Branches 17/18
100% Functions 3/3
91.54% Lines 65/71

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 71 722x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 73x 177x 177x 177x 177x 66x 66x 177x 111x 177x 177x 177x 177x 177x 73x 73x 2x 2x 2x 2x 2x 2x 166x 166x 166x 166x 166x 166x 166x             166x 2x 2x 2x 2x 2x 2x 177x 177x 177x 177x 177x 327x 327x 327x 46x 46x 46x 46x 327x 327x 166x 166x 327x 177x  
import { HYDRATION_END, HYDRATION_START } from '../../../constants.js';
import { hydrating } from '../dom/hydration.js';
import { is_array } from '../utils.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);
 
		const nodes = hydrating
			? is_array(dom)
				? dom
				: [dom]
			: dom.nodeType === 11
				? Array.from(dom.childNodes)
				: [dom];
 
		assign_locations(nodes, 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(
			/** @type {import('#client').TemplateNode[]} */ (Array.from(element.childNodes)),
			filename,
			location[2]
		);
	}
}
 
/**
 * @param {import('#client').TemplateNode[]} nodes
 * @param {string} filename
 * @param {import('../../../compiler/phases/3-transform/client/types.js').SourceLocation[]} locations
 */
function assign_locations(nodes, filename, locations) {
	var j = 0;
	var depth = 0;
 
	for (var i = 0; i < nodes.length; i += 1) {
		var node = nodes[i];
 
		if (hydrating && node.nodeType === 8) {
			var comment = /** @type {Comment} */ (node);
			if (comment.data === HYDRATION_START) depth += 1;
			if (comment.data.startsWith(HYDRATION_END)) depth -= 1;
		}
 
		if (depth === 0 && node.nodeType === 1) {
			assign_location(/** @type {Element} */ (node), filename, locations[j++]);
		}
	}
}