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");
14 const ruleName = "media-feature-name-blacklist";
16 const messages = ruleMessages(ruleName, {
17 rejected: name => `Unexpected media feature name "${name}"`
20 const rule = function(blacklist) {
21 return (root, result) => {
22 const validOptions = validateOptions(result, ruleName, {
24 possible: [_.isString]
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;
37 isRangeContextMediaFeature(parent.value) ||
38 !isStandardSyntaxMediaFeatureName(value) ||
39 isCustomMediaQuery(value)
44 if (!matchesStringOrRegExp(value, blacklist)) {
49 index: atRuleParamIndex(atRule) + sourceIndex,
50 message: messages.rejected(value),
60 rule.primaryOptionArray = true;
62 rule.ruleName = ruleName;
63 rule.messages = messages;
64 module.exports = rule;