All files / src/internal/client validate.js

90.21% Statements 83/92
80.95% Branches 17/21
75% Functions 3/4
89.88% Lines 80/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 11x 11x 11x 11x     8x 8x 11x 3x 3x 3x 3x 3x       11x 2x 2x 2x 2x 2x 2x 2x 4x 4x 4x 4x 4x   4x 4x 4x 8x 8x 2x 2x 2x 2x 2x 2x 2x 2x 2x 6x 6x 2x 2x 2x 2x 2x 2x 2x 2x 2x 147x 62x 62x 62x 62x 20x 2x 2x 18x 20x 4x 4x 20x 62x 141x  
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);
			}
		}
	}
}