UNPKG

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