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 9x 9x 9x 9x     6x 6x 9x 3x 3x 3x 3x 3x       9x 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 134x 62x 62x 62x 62x 20x 2x 2x 18x 20x 4x 4x 20x 62x 128x  
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);
			}
		}
	}
}