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");
16 const ruleName = "media-feature-name-no-unknown";
18 const messages = ruleMessages(ruleName, {
19 rejected: mediaFeatureName =>
20 `Unexpected unknown media feature name "${mediaFeatureName}"`
23 const rule = function(actual, options) {
24 return (root, result) => {
25 const validOptions = validateOptions(
32 ignoreMediaFeatureNames: [_.isString]
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;
49 isRangeContextMediaFeature(parent.value) ||
50 !isStandardSyntaxMediaFeatureName(value) ||
51 isCustomMediaQuery(value)
56 if (optionsMatches(options, "ignoreMediaFeatureNames", value)) {
61 postcss.vendor.prefix(value) ||
62 keywordSets.mediaFeatureNames.has(value.toLowerCase())
68 index: atRuleParamIndex(atRule) + sourceIndex,
69 message: messages.rejected(value),
79 rule.ruleName = ruleName;
80 rule.messages = messages;
81 module.exports = rule;