index.js 1.9 KB

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