summaryrefslogtreecommitdiff
path: root/node_modules/csso/cjs/restructure/prepare/processSelector.cjs
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/csso/cjs/restructure/prepare/processSelector.cjs')
-rw-r--r--node_modules/csso/cjs/restructure/prepare/processSelector.cjs101
1 files changed, 101 insertions, 0 deletions
diff --git a/node_modules/csso/cjs/restructure/prepare/processSelector.cjs b/node_modules/csso/cjs/restructure/prepare/processSelector.cjs
new file mode 100644
index 00000000..5c9e1d21
--- /dev/null
+++ b/node_modules/csso/cjs/restructure/prepare/processSelector.cjs
@@ -0,0 +1,101 @@
+'use strict';
+
+const cssTree = require('css-tree');
+const specificity = require('./specificity.cjs');
+
+const nonFreezePseudoElements = new Set([
+ 'first-letter',
+ 'first-line',
+ 'after',
+ 'before'
+]);
+const nonFreezePseudoClasses = new Set([
+ 'link',
+ 'visited',
+ 'hover',
+ 'active',
+ 'first-letter',
+ 'first-line',
+ 'after',
+ 'before'
+]);
+
+function processSelector(node, usageData) {
+ const pseudos = new Set();
+
+ node.prelude.children.forEach(function(simpleSelector) {
+ let tagName = '*';
+ let scope = 0;
+
+ simpleSelector.children.forEach(function(node) {
+ switch (node.type) {
+ case 'ClassSelector':
+ if (usageData && usageData.scopes) {
+ const classScope = usageData.scopes[node.name] || 0;
+
+ if (scope !== 0 && classScope !== scope) {
+ throw new Error('Selector can\'t has classes from different scopes: ' + cssTree.generate(simpleSelector));
+ }
+
+ scope = classScope;
+ }
+
+ break;
+
+ case 'PseudoClassSelector': {
+ const name = node.name.toLowerCase();
+
+ if (!nonFreezePseudoClasses.has(name)) {
+ pseudos.add(`:${name}`);
+ }
+
+ break;
+ }
+
+ case 'PseudoElementSelector': {
+ const name = node.name.toLowerCase();
+
+ if (!nonFreezePseudoElements.has(name)) {
+ pseudos.add(`::${name}`);
+ }
+
+ break;
+ }
+
+ case 'TypeSelector':
+ tagName = node.name.toLowerCase();
+ break;
+
+ case 'AttributeSelector':
+ if (node.flags) {
+ pseudos.add(`[${node.flags.toLowerCase()}]`);
+ }
+
+ break;
+
+ case 'Combinator':
+ tagName = '*';
+ break;
+ }
+ });
+
+ simpleSelector.compareMarker = specificity(simpleSelector).toString();
+ simpleSelector.id = null; // pre-init property to avoid multiple hidden class
+ simpleSelector.id = cssTree.generate(simpleSelector);
+
+ if (scope) {
+ simpleSelector.compareMarker += ':' + scope;
+ }
+
+ if (tagName !== '*') {
+ simpleSelector.compareMarker += ',' + tagName;
+ }
+ });
+
+ // add property to all rule nodes to avoid multiple hidden class
+ node.pseudoSignature = pseudos.size > 0
+ ? [...pseudos].sort().join(',')
+ : false;
+}
+
+module.exports = processSelector;