UNPKG

1.8 kBJavaScriptView Raw
1'use strict';
2
3const hasBlock = require('../../utils/hasBlock');
4const isStandardSyntaxAtRule = require('../../utils/isStandardSyntaxAtRule');
5const nextNonCommentNode = require('../../utils/nextNonCommentNode');
6const rawNodeString = require('../../utils/rawNodeString');
7const report = require('../../utils/report');
8const ruleMessages = require('../../utils/ruleMessages');
9const validateOptions = require('../../utils/validateOptions');
10const whitespaceChecker = require('../../utils/whitespaceChecker');
11
12const ruleName = 'at-rule-semicolon-newline-after';
13
14const messages = ruleMessages(ruleName, {
15 expectedAfter: () => 'Expected newline after ";"',
16});
17
18/** @type {import('stylelint').Rule} */
19const rule = (primary, _secondary, context) => {
20 const checker = whitespaceChecker('newline', primary, messages);
21
22 return (root, result) => {
23 const validOptions = validateOptions(result, ruleName, {
24 actual: primary,
25 possible: ['always'],
26 });
27
28 if (!validOptions) {
29 return;
30 }
31
32 root.walkAtRules((atRule) => {
33 const nextNode = atRule.next();
34
35 if (!nextNode) {
36 return;
37 }
38
39 if (hasBlock(atRule)) {
40 return;
41 }
42
43 if (!isStandardSyntaxAtRule(atRule)) {
44 return;
45 }
46
47 // Allow an end-of-line comment
48 const nodeToCheck = nextNonCommentNode(nextNode);
49
50 if (!nodeToCheck) {
51 return;
52 }
53
54 checker.afterOneOnly({
55 source: rawNodeString(nodeToCheck),
56 index: -1,
57 err: (msg) => {
58 if (context.fix) {
59 nodeToCheck.raws.before = context.newline + nodeToCheck.raws.before;
60 } else {
61 report({
62 message: msg,
63 node: atRule,
64 index: atRule.toString().length + 1,
65 result,
66 ruleName,
67 });
68 }
69 },
70 });
71 });
72 };
73};
74
75rule.ruleName = ruleName;
76rule.messages = messages;
77module.exports = rule;