-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathutil.mjs
82 lines (71 loc) · 2.5 KB
/
util.mjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import postcss from 'postcss';
import postcssNested from 'postcss-nested';
import resolveNestedSelector from '../index.js';
function actualResolvedSelector(plugin, code) {
return postcss(plugin).process(code).then(function(result) {
var resolvedSelectors = [];
result.root.walkRules(function(rule) {
resolvedSelectors = resolvedSelectors.concat(rule.selectors);
});
return resolvedSelectors.sort();
}).catch(function(err) {
console.log(err.stack);
});
}
function postcssNestedResolve(code) {
return actualResolvedSelector(postcssNested(), code);
}
function allExpected(code) {
const codeWithoutAtNest = code.replace(/@nest /g, '/*@nest */');
return postcss().process(codeWithoutAtNest).then(function(result) {
var resolvedSelectors = [];
result.root.walk(function(node) {
if (node.type !== 'rule' && node.type !== 'atrule') return;
const nodeContainsDeclChild = node.some(function(descendant) {
return descendant.type === 'decl';
});
var nodeContainsBlockDescendant = false;
node.walk(function(descendant) {
if (descendant.type === 'rule' || descendant.type === 'atrule') {
nodeContainsBlockDescendant = true;
return false;
}
});
if (node.type !== 'atrule' && !nodeContainsDeclChild && nodeContainsBlockDescendant) return;
if (node.type === 'atrule' && !nodeContainsDeclChild) return;
var selectors = (node.type === 'atrule') ? ['&'] : node.selectors;
selectors.forEach(function(selector) {
resolvedSelectors = resolvedSelectors.concat(resolveNestedSelector(selector, node));
});
});
return resolvedSelectors.sort();
}).catch(function(err) {
console.log(err.stack);
});
}
function resolveChosenSelector(code, chosenSelector) {
return postcss().process(code).then(function(result) {
var chosenNode;
result.root.walk(function(node) {
if (node.type !== 'rule' && node.type !== 'atrule') return;
if (node.type === 'atrule' && node.name !== 'nest') return;
var selectors = (node.type === 'atrule')
? node.params.split(',')
: node.selectors;
for (var i = 0, l = selectors.length; i < l; i++) {
if (selectors[i] === chosenSelector) {
chosenNode = node;
return false;
}
}
});
if (!chosenNode) throw new Error ('The chosen node was not discovered!');
return resolveNestedSelector(chosenSelector, chosenNode).sort();
});
}
export default {
actualResolvedSelector: actualResolvedSelector,
postcssNestedResolve: postcssNestedResolve,
allExpected: allExpected,
resolveChosenSelector: resolveChosenSelector,
};