.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / stylelint / lib / rules / font-family-no-duplicate-names / index.js
1 "use strict";
2
3 const _ = require("lodash");
4 const declarationValueIndex = require("../../utils/declarationValueIndex");
5 const findFontFamily = require("../../utils/findFontFamily");
6 const keywordSets = require("../../reference/keywordSets");
7 const optionsMatches = require("../../utils/optionsMatches");
8 const report = require("../../utils/report");
9 const ruleMessages = require("../../utils/ruleMessages");
10 const validateOptions = require("../../utils/validateOptions");
11
12 const ruleName = "font-family-no-duplicate-names";
13
14 const messages = ruleMessages(ruleName, {
15   rejected: name => `Unexpected duplicate name ${name}`
16 });
17
18 const isFamilyNameKeyword = node =>
19   !node.quote && keywordSets.fontFamilyKeywords.has(node.value.toLowerCase());
20
21 const rule = function(actual, options) {
22   return (root, result) => {
23     const validOptions = validateOptions(
24       result,
25       ruleName,
26       { actual },
27       {
28         actual: options,
29         possible: {
30           ignoreFontFamilyNames: [_.isString]
31         },
32         optional: true
33       }
34     );
35     if (!validOptions) {
36       return;
37     }
38
39     root.walkDecls(/^font(-family)?$/i, decl => {
40       const keywords = new Set();
41       const familyNames = new Set();
42
43       const fontFamilies = findFontFamily(decl.value);
44
45       if (fontFamilies.length === 0) {
46         return;
47       }
48
49       fontFamilies.forEach(fontFamilyNode => {
50         const family = fontFamilyNode.value.trim();
51
52         if (
53           optionsMatches(
54             options,
55             "ignoreFontFamilyNames",
56             fontFamilyNode.value.trim()
57           )
58         ) {
59           return;
60         }
61
62         if (isFamilyNameKeyword(fontFamilyNode)) {
63           if (keywords.has(family.toLowerCase())) {
64             complain(
65               messages.rejected(family),
66               declarationValueIndex(decl) + fontFamilyNode.sourceIndex,
67               decl
68             );
69             return;
70           }
71
72           keywords.add(family);
73           return;
74         }
75
76         if (familyNames.has(family)) {
77           complain(
78             messages.rejected(family),
79             declarationValueIndex(decl) + fontFamilyNode.sourceIndex,
80             decl
81           );
82           return;
83         }
84
85         familyNames.add(family);
86       });
87     });
88
89     function complain(message, index, decl) {
90       report({
91         result,
92         ruleName,
93         message,
94         node: decl,
95         index
96       });
97     }
98   };
99 };
100
101 rule.ruleName = ruleName;
102 rule.messages = messages;
103 module.exports = rule;