UNPKG

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