All files / src/compiler/phases/2-analyze/css css-warn.js

100% Statements 37/37
100% Branches 8/8
100% Functions 4/4
100% Lines 34/34

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 352x 2x 2x 2x 2x 2x 2x 2x 2x 360x 360x 2x 2x 2x 2x 94x 74x 74x 2x 2x 128x 2x 2x 2x 2x 1225x 205x 205x 205x 205x 1225x 1225x 1225x 2x  
import { walk } from 'zimmerframe';
import { warn } from '../../../warnings.js';
import { is_keyframes_node } from '../../css.js';
 
/**
 * @param {import('#compiler').Css.StyleSheet} stylesheet
 * @param {import('../../types.js').RawWarning[]} warnings
 */
export function warn_unused(stylesheet, warnings) {
	walk(stylesheet, { warnings, stylesheet }, visitors);
}
 
/** @type {import('zimmerframe').Visitors<import('#compiler').Css.Node, { warnings: import('../../types.js').RawWarning[], stylesheet: import('#compiler').Css.StyleSheet }>} */
const visitors = {
	Atrule(node, context) {
		if (!is_keyframes_node(node)) {
			context.next();
		}
	},
	PseudoClassSelector(node, context) {
		if (node.name === 'is' || node.name === 'where') {
			context.next();
		}
	},
	ComplexSelector(node, context) {
		if (!node.metadata.used) {
			const content = context.state.stylesheet.content;
			const text = content.styles.substring(node.start - content.start, node.end - content.start);
			warn(context.state.warnings, node, context.path, 'css-unused-selector', text);
		}
 
		context.next();
	}
};