UNPKG

2.25 kBJavaScriptView Raw
1// @ts-nocheck
2
3'use strict';
4
5const _ = require('lodash');
6const declarationValueIndex = require('../../utils/declarationValueIndex');
7const findFontFamily = require('../../utils/findFontFamily');
8const keywordSets = require('../../reference/keywordSets');
9const optionsMatches = require('../../utils/optionsMatches');
10const report = require('../../utils/report');
11const ruleMessages = require('../../utils/ruleMessages');
12const validateOptions = require('../../utils/validateOptions');
13
14const ruleName = 'font-family-no-duplicate-names';
15
16const messages = ruleMessages(ruleName, {
17 rejected: (name) => `Unexpected duplicate name ${name}`,
18});
19
20const isFamilyNameKeyword = (node) =>
21 !node.quote && keywordSets.fontFamilyKeywords.has(node.value.toLowerCase());
22
23function rule(actual, options) {
24 return (root, result) => {
25 const validOptions = validateOptions(
26 result,
27 ruleName,
28 { actual },
29 {
30 actual: options,
31 possible: {
32 ignoreFontFamilyNames: [_.isString, _.isRegExp],
33 },
34 optional: true,
35 },
36 );
37
38 if (!validOptions) {
39 return;
40 }
41
42 root.walkDecls(/^font(-family)?$/i, (decl) => {
43 const keywords = new Set();
44 const familyNames = new Set();
45
46 const fontFamilies = findFontFamily(decl.value);
47
48 if (fontFamilies.length === 0) {
49 return;
50 }
51
52 fontFamilies.forEach((fontFamilyNode) => {
53 const family = fontFamilyNode.value.trim();
54
55 if (optionsMatches(options, 'ignoreFontFamilyNames', fontFamilyNode.value.trim())) {
56 return;
57 }
58
59 if (isFamilyNameKeyword(fontFamilyNode)) {
60 if (keywords.has(family.toLowerCase())) {
61 complain(
62 messages.rejected(family),
63 declarationValueIndex(decl) + fontFamilyNode.sourceIndex,
64 decl,
65 );
66
67 return;
68 }
69
70 keywords.add(family);
71
72 return;
73 }
74
75 if (familyNames.has(family)) {
76 complain(
77 messages.rejected(family),
78 declarationValueIndex(decl) + fontFamilyNode.sourceIndex,
79 decl,
80 );
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
101rule.ruleName = ruleName;
102rule.messages = messages;
103module.exports = rule;