UNPKG

1.43 kBJavaScriptView Raw
1'use strict';
2
3const beforeBlockString = require('../../utils/beforeBlockString');
4const blockString = require('../../utils/blockString');
5const isSingleLineString = require('../../utils/isSingleLineString');
6const report = require('../../utils/report');
7const ruleMessages = require('../../utils/ruleMessages');
8const validateOptions = require('../../utils/validateOptions');
9const { isNumber } = require('../../utils/validateTypes');
10
11const ruleName = 'declaration-block-single-line-max-declarations';
12
13const messages = ruleMessages(ruleName, {
14 expected: (max) => `Expected no more than ${max} ${max === 1 ? 'declaration' : 'declarations'}`,
15});
16
17/** @type {import('stylelint').Rule} */
18const rule = (primary) => {
19 return (root, result) => {
20 const validOptions = validateOptions(result, ruleName, {
21 actual: primary,
22 possible: [isNumber],
23 });
24
25 if (!validOptions) {
26 return;
27 }
28
29 root.walkRules((ruleNode) => {
30 if (!isSingleLineString(blockString(ruleNode))) {
31 return;
32 }
33
34 if (!ruleNode.nodes) {
35 return;
36 }
37
38 const decls = ruleNode.nodes.filter((node) => node.type === 'decl');
39
40 if (decls.length <= primary) {
41 return;
42 }
43
44 report({
45 message: messages.expected(primary),
46 node: ruleNode,
47 index: beforeBlockString(ruleNode, { noRawBefore: true }).length,
48 result,
49 ruleName,
50 });
51 });
52 };
53};
54
55rule.ruleName = ruleName;
56rule.messages = messages;
57module.exports = rule;