Skip to content

Commit 6bd7c17

Browse files
authored
Merge pull request #36 from merkle-open/feature/css-selector-parser-v3
feat(#35): update css-selector-parser to v3.3.0
2 parents 0fd089a + 5402a24 commit 6bd7c17

File tree

4 files changed

+20
-39
lines changed

4 files changed

+20
-39
lines changed

lib/css-selector-classes.js

Lines changed: 15 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
'use strict';
22

33
const 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
*/
5441
function 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

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
"author": "Merkle Inc.",
3535
"license": "MIT",
3636
"dependencies": {
37-
"css-selector-parser": "2.3.2",
37+
"css-selector-parser": "3.3.0",
3838
"postcss-resolve-nested-selector": "0.1.6"
3939
},
4040
"peerDependencies": {

test/default.test.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,6 @@ testRule({
8686
code: '.z-block {}',
8787
message: `Expected class name "z-block" to start with a valid prefix: "a-", "m-", "o-", "l-", "g-", "h-", "state-". (${ruleName})`,
8888
},
89-
{
90-
code: '.0-block {}',
91-
message: `Expected class name "0-block" to start with a valid prefix: "a-", "m-", "o-", "l-", "g-", "h-", "state-". (${ruleName})`,
92-
},
9389
{
9490
code: '.-block {}',
9591
message: `Expected class name "-block" to start with a valid prefix: "a-", "m-", "o-", "l-", "g-", "h-", "state-". (${ruleName})`,

0 commit comments

Comments
 (0)