UNPKG

1.46 kBJavaScriptView Raw
1'use strict';
2
3const _ = require('lodash');
4const isStandardSyntaxAtRule = require('../../utils/isStandardSyntaxAtRule');
5const keywordSets = require('../../reference/keywordSets');
6const optionsMatches = require('../../utils/optionsMatches');
7const postcss = require('postcss');
8const report = require('../../utils/report');
9const ruleMessages = require('../../utils/ruleMessages');
10const validateOptions = require('../../utils/validateOptions');
11
12const ruleName = 'at-rule-no-unknown';
13
14const messages = ruleMessages(ruleName, {
15 rejected: (atRule) => `Unexpected unknown at-rule "${atRule}"`,
16});
17
18function rule(actual, options) {
19 return (root, result) => {
20 const validOptions = validateOptions(
21 result,
22 ruleName,
23 { actual },
24 {
25 actual: options,
26 possible: {
27 ignoreAtRules: [_.isString, _.isRegExp],
28 },
29 optional: true,
30 },
31 );
32
33 if (!validOptions) {
34 return;
35 }
36
37 root.walkAtRules((atRule) => {
38 if (!isStandardSyntaxAtRule(atRule)) {
39 return;
40 }
41
42 const name = atRule.name;
43
44 // Return early if at-rule is to be ignored
45 if (optionsMatches(options, 'ignoreAtRules', atRule.name)) {
46 return;
47 }
48
49 if (postcss.vendor.prefix(name) || keywordSets.atRules.has(name.toLowerCase())) {
50 return;
51 }
52
53 report({
54 message: messages.rejected(`@${name}`),
55 node: atRule,
56 ruleName,
57 result,
58 });
59 });
60 };
61}
62
63rule.ruleName = ruleName;
64rule.messages = messages;
65module.exports = rule;