All files / src/compiler/phases/2-analyze/visitors SvelteElement.js

100% Statements 66/66
100% Branches 20/20
100% Functions 1/1
100% Lines 62/62

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 632x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 2x 149x 149x 149x 149x 149x 149x 149x 149x 149x 149x 149x 149x 149x 6x 6x 149x 143x 143x 203x 203x 203x 203x 203x 203x 197x 203x 6x 6x 6x 6x 6x 197x 203x 22x 22x 22x 22x 22x 22x 22x 22x 22x 22x 22x 22x 203x 143x 149x 149x 149x  
/** @import { Attribute, SvelteElement, Text } from '#compiler' */
/** @import { Context } from '../types' */
import { namespace_mathml, namespace_svg } from '../../../../constants.js';
import { is_text_attribute } from '../../../utils/ast.js';
import { check_element } from './shared/a11y.js';
import { validate_element } from './shared/element.js';
 
/**
 * @param {SvelteElement} node
 * @param {Context} context
 */
export function SvelteElement(node, context) {
	validate_element(node, context);
 
	check_element(node, context.state);
 
	context.state.analysis.elements.push(node);
 
	const xmlns = /** @type {Attribute & { value: [Text] } | undefined} */ (
		node.attributes.find(
			(a) => a.type === 'Attribute' && a.name === 'xmlns' && is_text_attribute(a)
		)
	);
 
	if (xmlns) {
		node.metadata.svg = xmlns.value[0].data === namespace_svg;
		node.metadata.mathml = xmlns.value[0].data === namespace_mathml;
	} else {
		let i = context.path.length;
		while (i--) {
			const ancestor = context.path[i];
 
			if (
				ancestor.type === 'Component' ||
				ancestor.type === 'SvelteComponent' ||
				ancestor.type === 'SvelteFragment' ||
				ancestor.type === 'SnippetBlock'
			) {
				// Inside a slot or a snippet -> this resets the namespace, so assume the component namespace
				node.metadata.svg = context.state.options.namespace === 'svg';
				node.metadata.mathml = context.state.options.namespace === 'mathml';
				break;
			}
 
			if (ancestor.type === 'SvelteElement' || ancestor.type === 'RegularElement') {
				node.metadata.svg =
					ancestor.type === 'RegularElement' && ancestor.name === 'foreignObject'
						? false
						: ancestor.metadata.svg;
 
				node.metadata.mathml =
					ancestor.type === 'RegularElement' && ancestor.name === 'foreignObject'
						? false
						: ancestor.metadata.mathml;
 
				break;
			}
		}
	}
 
	context.next({ ...context.state, parent_element: null });
}