.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / stylelint / lib / rules / media-feature-name-no-unknown / 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 keywordSets = require("../../reference/keywordSets");
9 const mediaParser = require("postcss-media-query-parser").default;
10 const optionsMatches = require("../../utils/optionsMatches");
11 const postcss = require("postcss");
12 const report = require("../../utils/report");
13 const ruleMessages = require("../../utils/ruleMessages");
14 const validateOptions = require("../../utils/validateOptions");
15
16 const ruleName = "media-feature-name-no-unknown";
17
18 const messages = ruleMessages(ruleName, {
19   rejected: mediaFeatureName =>
20     `Unexpected unknown media feature name "${mediaFeatureName}"`
21 });
22
23 const rule = function(actual, options) {
24   return (root, result) => {
25     const validOptions = validateOptions(
26       result,
27       ruleName,
28       { actual },
29       {
30         actual: options,
31         possible: {
32           ignoreMediaFeatureNames: [_.isString]
33         },
34         optional: true
35       }
36     );
37
38     if (!validOptions) {
39       return;
40     }
41
42     root.walkAtRules(/^media$/i, atRule => {
43       mediaParser(atRule.params).walk(/^media-feature$/i, mediaFeatureNode => {
44         const parent = mediaFeatureNode.parent,
45           sourceIndex = mediaFeatureNode.sourceIndex,
46           value = mediaFeatureNode.value;
47
48         if (
49           isRangeContextMediaFeature(parent.value) ||
50           !isStandardSyntaxMediaFeatureName(value) ||
51           isCustomMediaQuery(value)
52         ) {
53           return;
54         }
55
56         if (optionsMatches(options, "ignoreMediaFeatureNames", value)) {
57           return;
58         }
59
60         if (
61           postcss.vendor.prefix(value) ||
62           keywordSets.mediaFeatureNames.has(value.toLowerCase())
63         ) {
64           return;
65         }
66
67         report({
68           index: atRuleParamIndex(atRule) + sourceIndex,
69           message: messages.rejected(value),
70           node: atRule,
71           ruleName,
72           result
73         });
74       });
75     });
76   };
77 };
78
79 rule.ruleName = ruleName;
80 rule.messages = messages;
81 module.exports = rule;