.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / stylelint / lib / rules / media-feature-name-blacklist / index.js
1 "use strict";
2
3 const _ = require("lodash");
4 const atRuleParamIndex = require("../../utils/atRuleParamIndex");
5 const isCustomMediaQuery = require("../../utils/isCustomMediaQuery");
6 const isRangeContextMediaFeature = require("../../utils/isRangeContextMediaFeature");
7 const isStandardSyntaxMediaFeatureName = require("../../utils/isStandardSyntaxMediaFeatureName");
8 const matchesStringOrRegExp = require("../../utils/matchesStringOrRegExp");
9 const mediaParser = require("postcss-media-query-parser").default;
10 const report = require("../../utils/report");
11 const ruleMessages = require("../../utils/ruleMessages");
12 const validateOptions = require("../../utils/validateOptions");
13
14 const ruleName = "media-feature-name-blacklist";
15
16 const messages = ruleMessages(ruleName, {
17   rejected: name => `Unexpected media feature name "${name}"`
18 });
19
20 const rule = function(blacklist) {
21   return (root, result) => {
22     const validOptions = validateOptions(result, ruleName, {
23       actual: blacklist,
24       possible: [_.isString]
25     });
26     if (!validOptions) {
27       return;
28     }
29
30     root.walkAtRules(/^media$/i, atRule => {
31       mediaParser(atRule.params).walk(/^media-feature$/i, mediaFeatureNode => {
32         const parent = mediaFeatureNode.parent,
33           sourceIndex = mediaFeatureNode.sourceIndex,
34           value = mediaFeatureNode.value;
35
36         if (
37           isRangeContextMediaFeature(parent.value) ||
38           !isStandardSyntaxMediaFeatureName(value) ||
39           isCustomMediaQuery(value)
40         ) {
41           return;
42         }
43
44         if (!matchesStringOrRegExp(value, blacklist)) {
45           return;
46         }
47
48         report({
49           index: atRuleParamIndex(atRule) + sourceIndex,
50           message: messages.rejected(value),
51           node: atRule,
52           ruleName,
53           result
54         });
55       });
56     });
57   };
58 };
59
60 rule.primaryOptionArray = true;
61
62 rule.ruleName = ruleName;
63 rule.messages = messages;
64 module.exports = rule;