11'use strict' ;
22
33const createParser = require ( 'css-selector-parser' ) . createParser ;
4- const parse = createParser ( { syntax : 'progressive' } ) ;
5-
6- /* eslint-disable complexity */
4+ const parse = createParser ( { syntax : 'progressive' , strict : false } ) ;
75
86/**
9- * Recursively visits nodes in a CSS rule tree and applies a function to each rule node.
7+ * Recursively visits nodes in a CSS rule tree and applies a function to each rule node item.
8+ * (Classes as attributes are ignored.)
109 *
1110 * @param {Object } node - The root node of the CSS rule tree.
1211 * @param {function } fn - The function to apply to each rule node.
@@ -20,30 +19,18 @@ function visitRules(node, fn) {
2019 node . rules . forEach ( ( rule ) => visitRules ( rule , fn ) ) ;
2120 }
2221
23- if ( node . nestedRule ?. pseudoClasses ) {
24- node . nestedRule . pseudoClasses . forEach ( ( pseudo ) => visitRules ( pseudo . argument , fn ) ) ;
22+ if ( node . nestedRule ) {
23+ visitRules ( node . nestedRule , fn ) ;
2524 }
2625
27- if ( node . attributes ) {
28- const classAttribute = node . attributes . find ( ( attribute ) => attribute . name === 'class' ) ;
29- if ( classAttribute ?. value ?. value ) {
30- fn ( { classNames : [ classAttribute . value . value ] } ) ;
26+ node . items ?. forEach ( ( item ) => {
27+ if ( item . type === 'ClassName' ) {
28+ fn ( item . name ) ;
29+ } else if ( item . type === 'PseudoClass' ) {
30+ visitRules ( item . argument , fn ) ;
3131 }
32- }
33-
34- if ( node . pseudoClasses ) {
35- node . pseudoClasses . forEach ( ( pseudo ) => {
36- if ( pseudo . argument ?. rules ) {
37- pseudo . argument . rules . forEach ( ( rule ) => visitRules ( rule , fn ) ) ;
38- }
39- } ) ;
40- }
41-
42- if ( node . type === 'Rule' ) {
43- fn ( node ) ;
44- }
32+ } ) ;
4533}
46- /* eslint-enable complexity */
4734
4835/**
4936 * Return all the classes in a CSS selector.
@@ -52,13 +39,11 @@ function visitRules(node, fn) {
5239 * @returns {string[] } An array of every class present in the CSS selector
5340 */
5441function getCssSelectorClasses ( selector ) {
55- let list = [ ] ;
42+ const list = [ ] ;
5643 const ast = parse ( selector ) ;
57- visitRules ( ast , ( ruleSet ) => {
58- if ( ruleSet . classNames ) {
59- list = list . concat ( ruleSet . classNames ) ;
60- }
61- } ) ;
44+
45+ visitRules ( ast , ( className ) => list . push ( className ) ) ;
46+
6247 return Array . from ( new Set ( list ) ) ;
6348}
6449
0 commit comments