-
Notifications
You must be signed in to change notification settings - Fork 31
/
getOrderData.js
90 lines (74 loc) · 2.16 KB
/
getOrderData.js
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
83
84
85
86
87
88
89
90
const isStandardSyntaxProperty = require('./isStandardSyntaxProperty');
const isCustomProperty = require('./isCustomProperty');
const isDollarVariable = require('./isDollarVariable');
const isAtVariable = require('./isAtVariable');
const calcAtRulePatternPriority = require('./calcAtRulePatternPriority');
const calcRulePatternPriority = require('./calcRulePatternPriority');
module.exports = function getOrderData(expectedOrder, node) {
let nodeType;
if (node.type === 'decl') {
if (isCustomProperty(node.prop)) {
nodeType = 'custom-properties';
} else if (isDollarVariable(node.prop)) {
nodeType = 'dollar-variables';
} else if (isAtVariable(node.prop)) {
nodeType = 'at-variables';
} else if (isStandardSyntaxProperty(node.prop)) {
nodeType = 'declarations';
}
} else if (node.type === 'rule') {
nodeType = {
type: 'rule',
selector: node.selector,
};
const rules = expectedOrder.rule;
// Looking for most specified pattern, because it can match many patterns
if (rules && rules.length) {
let prioritizedPattern;
let max = 0;
rules.forEach(function(pattern) {
const priority = calcRulePatternPriority(pattern, nodeType);
if (priority > max) {
max = priority;
prioritizedPattern = pattern;
}
});
if (max) {
return prioritizedPattern;
}
}
} else if (node.type === 'atrule') {
nodeType = {
type: 'at-rule',
name: node.name,
hasBlock: false,
};
if (node.nodes && node.nodes.length) {
nodeType.hasBlock = true;
}
if (node.params && node.params.length) {
nodeType.parameter = node.params;
}
const atRules = expectedOrder['at-rule'];
// Looking for most specified pattern, because it can match many patterns
if (atRules && atRules.length) {
let prioritizedPattern;
let max = 0;
atRules.forEach(function(pattern) {
const priority = calcAtRulePatternPriority(pattern, nodeType);
if (priority > max) {
max = priority;
prioritizedPattern = pattern;
}
});
if (max) {
return prioritizedPattern;
}
}
}
if (expectedOrder[nodeType]) {
return expectedOrder[nodeType];
}
// Return null if there no patterns for that node
return null;
};