UNPKG

2.14 kBJavaScriptView Raw
1// @ts-nocheck
2
3'use strict';
4
5const declarationValueIndex = require('../../utils/declarationValueIndex');
6const findFontFamily = require('../../utils/findFontFamily');
7const isVariable = require('../../utils/isVariable');
8const keywordSets = require('../../reference/keywordSets');
9const optionsMatches = require('../../utils/optionsMatches');
10const postcss = require('postcss');
11const report = require('../../utils/report');
12const ruleMessages = require('../../utils/ruleMessages');
13const validateOptions = require('../../utils/validateOptions');
14
15const _ = require('lodash');
16
17const ruleName = 'font-family-no-missing-generic-family-keyword';
18
19const messages = ruleMessages(ruleName, {
20 rejected: 'Unexpected missing generic font family',
21});
22
23const isFamilyNameKeyword = (node) =>
24 !node.quote && keywordSets.fontFamilyKeywords.has(node.value.toLowerCase());
25
26function rule(actual, options) {
27 return (root, result) => {
28 const validOptions = validateOptions(
29 result,
30 ruleName,
31 { actual },
32 {
33 actual: options,
34 possible: {
35 ignoreFontFamilies: [_.isString, _.isRegExp],
36 },
37 optional: true,
38 },
39 );
40
41 if (!validOptions) {
42 return;
43 }
44
45 root.walkDecls(/^font(-family)?$/i, (decl) => {
46 // Ignore @font-face
47 if (
48 decl.parent &&
49 decl.parent.type === 'atrule' &&
50 decl.parent.name.toLowerCase() === 'font-face'
51 ) {
52 return;
53 }
54
55 if (decl.prop === 'font' && keywordSets.systemFontValues.has(decl.value.toLowerCase())) {
56 return;
57 }
58
59 const fontFamilies = findFontFamily(decl.value);
60
61 if (fontFamilies.length === 0) {
62 return;
63 }
64
65 if (fontFamilies.some(isFamilyNameKeyword)) {
66 return;
67 }
68
69 if (postcss.list.space(decl.value).some(isVariable)) {
70 return;
71 }
72
73 if (fontFamilies.some((node) => optionsMatches(options, 'ignoreFontFamilies', node.value))) {
74 return;
75 }
76
77 report({
78 result,
79 ruleName,
80 message: messages.rejected,
81 node: decl,
82 index: declarationValueIndex(decl) + fontFamilies[fontFamilies.length - 1].sourceIndex,
83 });
84 });
85 };
86}
87
88rule.ruleName = ruleName;
89rule.messages = messages;
90module.exports = rule;