forked from primer/stylelint-config
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutilities.js
55 lines (46 loc) · 1.51 KB
/
utilities.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
const stylelint = require('stylelint')
const utilities = require('./lib/primer-utilities')
const ruleName = 'primer/utilities'
const messages = stylelint.utils.ruleMessages(ruleName, {
rejected: (selector, utilityClass) => {
return `Consider using the Primer utility '.${utilityClass}' instead of the selector '${selector}' in your html. https://primer.style/css/utilities`
}
})
// eslint-disable-next-line no-unused-vars
module.exports = stylelint.createPlugin(ruleName, (enabled, options = {}, context) => {
if (!enabled) {
return noop
}
const utilityReplacement = (declaration, value) => {
const declarationUtilities = utilities[declaration]
if (declarationUtilities) {
return declarationUtilities.find(utility => {
return utility.value === value
})
}
}
const lintResult = (root, result) => {
root.walkRules(rule => {
if (!/^\.[\w\-_]+$/.exec(rule.selector)) {
return false
}
const decls = rule.nodes.filter(decl => decl.type === 'decl')
if (decls.length === 1) {
const replacement = utilityReplacement(decls[0].prop, decls[0].value)
if (replacement) {
stylelint.utils.report({
index: rule.sourceIndex,
message: messages.rejected(rule.selector, replacement.utilityClass),
node: rule,
result,
ruleName
})
}
}
})
}
return lintResult
})
function noop() {}
module.exports.ruleName = ruleName
module.exports.messages = messages