summaryrefslogtreecommitdiff
path: root/node_modules/csso/lib/restructure/prepare/processSelector.js
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2023-10-14 15:05:55 +0800
committerlittleblack111 <littleblack11111@gmail.com>2023-10-14 15:05:55 +0800
commitc06f7ee0a40255214c477e13d9b956a7e07c2900 (patch)
treef5982a568ef8fab865d0142e71c7494fea3e4c1b /node_modules/csso/lib/restructure/prepare/processSelector.js
parent3fd9400d4dccc25aa29b5702216732e0b7542073 (diff)
postcss,(plugins): nanocss, postcss-preset-env
Diffstat (limited to 'node_modules/csso/lib/restructure/prepare/processSelector.js')
-rw-r--r--node_modules/csso/lib/restructure/prepare/processSelector.js97
1 files changed, 97 insertions, 0 deletions
diff --git a/node_modules/csso/lib/restructure/prepare/processSelector.js b/node_modules/csso/lib/restructure/prepare/processSelector.js
new file mode 100644
index 00000000..55a4fed8
--- /dev/null
+++ b/node_modules/csso/lib/restructure/prepare/processSelector.js
@@ -0,0 +1,97 @@
+import { generate } from 'css-tree';
+import specificity from './specificity.js';
+
+const nonFreezePseudoElements = new Set([
+ 'first-letter',
+ 'first-line',
+ 'after',
+ 'before'
+]);
+const nonFreezePseudoClasses = new Set([
+ 'link',
+ 'visited',
+ 'hover',
+ 'active',
+ 'first-letter',
+ 'first-line',
+ 'after',
+ 'before'
+]);
+
+export default 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: ' + 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 = 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;
+};