All files / src/rules element-permitted-order.ts

100% Statements 10/10
100% Branches 2/2
100% Functions 4/4
100% Lines 10/10
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      1x   1x           411x       411x 411x 862x 3x     859x 859x 10x        
import { Rule, RuleReport, RuleParserProxy } from '../rule';
import { DOMNode } from '../dom';
import { DOMReadyEvent } from '../event';
import { Validator } from '../meta';
 
export = {
	name: 'element-permitted-order',
	init,
} as Rule;
 
function init(parser: RuleParserProxy){
	parser.on('dom:ready', validate);
}
 
function validate(event: DOMReadyEvent, report: RuleReport){
	const doc = event.document;
	doc.visitDepthFirst((node: DOMNode) => {
		if (!node.meta){
			return;
		}
 
		const rules = node.meta.permittedOrder;
		Validator.validateOrder(node.children, rules, (child: DOMNode, prev: DOMNode) => {
			report(node, `Element <${child.tagName}> must be used before <${prev.tagName}> in this context`);
		});
	});
}