All files / src/internal/client validate.js

89.13% Statements 82/92
76.19% Branches 16/21
75% Functions 3/4
88.76% Lines 79/89

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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 902x 2x 2x 2x 2x 2x 2x 2x 2x       2x 2x 2x 2x 2x 2x 7x 7x 7x 7x     4x 4x 7x 3x 3x 3x 3x 3x       7x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x   2x 2x 2x 8x 8x 2x 2x 2x 2x 2x 2x 2x 2x 2x 6x 6x   2x 2x 2x 2x 2x 2x 2x 2x 126x 52x 52x 52x 52x 18x 2x 2x 16x 18x 4x 4x 18x 52x 120x  
import { untrack } from './runtime.js';
import { get_descriptor, is_array } from './utils.js';
import * as e from './errors.js';
 
/** regex of all html void element names */
const void_element_names =
	/^(?:area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/;
 
/** @param {string} tag */
function is_void(tag) {
	return void_element_names.test(tag) || tag.toLowerCase() === '!doctype';
}
 
/**
 * @param {() => any} component_fn
 * @returns {any}
 */
export function validate_dynamic_component(component_fn) {
	try {
		const instance = component_fn();
 
		if (instance !== undefined && typeof instance !== 'object') {
			e.svelte_component_invalid_this_value();
		}
 
		return instance;
	} catch (err) {
		const { message } = /** @type {Error} */ (err);
 
		if (typeof message === 'string' && message.indexOf('is not a function') !== -1) {
			e.svelte_component_invalid_this_value();
		}

		throw err;
	}
}
 
/**
 * @param {() => any} collection
 * @param {(item: any, index: number) => string} key_fn
 * @returns {void}
 */
export function validate_each_keys(collection, key_fn) {
	const keys = new Map();
	const maybe_array = untrack(() => collection());
	const array = is_array(maybe_array)
		? maybe_array
		: maybe_array == null
			? []
			: Array.from(maybe_array);
	const length = array.length;
	for (let i = 0; i < length; i++) {
		const key = key_fn(array[i], i);
		if (keys.has(key)) {
			const a = String(keys.get(key));
			const b = String(i);
 
			/** @type {string | null} */
			let k = String(array[i]);
			if (k.startsWith('[object ')) k = null;
 
			e.each_key_duplicate(a, b, k);
		}
		keys.set(key, i);
	}
}
 
/**
 * @param {Record<string, any>} $$props
 * @param {string[]} bindable
 * @param {string[]} exports
 * @param {Function & { filename: string }} component
 */
export function validate_prop_bindings($$props, bindable, exports, component) {
	for (const key in $$props) {
		var setter = get_descriptor($$props, key)?.set;
		var name = component.name;
 
		if (setter) {
			if (exports.includes(key)) {
				e.bind_invalid_export(component.filename, key, name);
			}
 
			if (!bindable.includes(key)) {
				e.bind_not_bindable(key, component.filename, name);
			}
		}
	}
}