scancss
Version:
A robust CSS stylesheet statistics collector and analyzer
56 lines (42 loc) • 1.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.calculateSpecificity = calculateSpecificity;
var _cssPseudoClasses = require('../../constants/cssPseudoClasses');
var _cssPseudoElements = require('../../constants/cssPseudoElements');
var _reLeadingColons = require('../../constants/reLeadingColons');
/**
* https://www.w3.org/TR/selectors-3/#specificity
*/
function calculateSpecificity(selector) {
if (selector.type === 'id') {
return [1, 0, 0];
}
if (selector.type === 'class' || selector.type === 'attribute') {
return [0, 1, 0];
}
if (selector.type === 'tag') {
return [0, 0, 1];
}
if (selector.type === 'pseudo') {
const pseudoName = selector.value.replace(_reLeadingColons.reLeadingColons, '');
if (_cssPseudoClasses.cssPseudoClasses.includes(pseudoName)) {
/**
* TODO: change calculation of `has`, `matches`, `not`, `nth-child`, `nth-last-child`
* according to future spec https://drafts.csswg.org/selectors-4/#specificity-rules
*/
if (['something', 'not'].includes(pseudoName)) {
return [0, 0, 0];
}
return [0, 1, 0];
}
if (_cssPseudoElements.cssPseudoElements.includes(pseudoName)) {
return [0, 0, 1];
}
}
if (selector.type === 'universal') {
return [0, 0, 0];
}
return [0, 0, 0];
}