UNPKG

2.26 kBJavaScriptView Raw
1'use strict';
2
3const declarationValueIndex = require('../../utils/declarationValueIndex');
4const findNotContiguousOrRectangular = require('./utils/findNotContiguousOrRectangular');
5const isRectangular = require('./utils/isRectangular');
6const report = require('../../utils/report');
7const ruleMessages = require('../../utils/ruleMessages');
8const validateOptions = require('../../utils/validateOptions');
9const valueParser = require('postcss-value-parser');
10
11const ruleName = 'named-grid-areas-no-invalid';
12
13const messages = ruleMessages(ruleName, {
14 expectedToken: () => 'Expected cell token within string',
15 expectedSameNumber: () => 'Expected same number of cell tokens in each string',
16 expectedRectangle: (name) => `Expected single filled-in rectangle for "${name}"`,
17});
18
19/** @type {import('stylelint').Rule} */
20const rule = (primary) => {
21 return (root, result) => {
22 const validOptions = validateOptions(result, ruleName, { actual: primary });
23
24 if (!validOptions) {
25 return;
26 }
27
28 root.walkDecls(/^(?:grid|grid-template|grid-template-areas)$/i, (decl) => {
29 const { value } = decl;
30
31 if (value.toLowerCase().trim() === 'none') return;
32
33 /** @type {string[][]} */
34 const areas = [];
35 let reportSent = false;
36
37 valueParser(value).walk(({ sourceIndex, type, value: tokenValue }) => {
38 if (type !== 'string') return;
39
40 if (tokenValue === '') {
41 complain(messages.expectedToken(), sourceIndex);
42 reportSent = true;
43
44 return;
45 }
46
47 areas.push(
48 tokenValue
49 .trim()
50 .split(' ')
51 .filter((s) => s.length > 0),
52 );
53 });
54
55 if (reportSent) return;
56
57 if (!isRectangular(areas)) {
58 complain(messages.expectedSameNumber());
59
60 return;
61 }
62
63 const notContiguousOrRectangular = findNotContiguousOrRectangular(areas);
64
65 notContiguousOrRectangular.sort().forEach((name) => {
66 complain(messages.expectedRectangle(name));
67 });
68
69 /**
70 * @param {string} message
71 * @param {number} [sourceIndex=0]
72 */
73 function complain(message, sourceIndex = 0) {
74 report({
75 message,
76 node: decl,
77 index: declarationValueIndex(decl) + sourceIndex,
78 result,
79 ruleName,
80 });
81 }
82 });
83 };
84};
85
86rule.ruleName = ruleName;
87rule.messages = messages;
88module.exports = rule;