index.js 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. 'use strict';
  2. const hasBlock = require('../../utils/hasBlock');
  3. const isStandardSyntaxAtRule = require('../../utils/isStandardSyntaxAtRule');
  4. const rawNodeString = require('../../utils/rawNodeString');
  5. const report = require('../../utils/report');
  6. const ruleMessages = require('../../utils/ruleMessages');
  7. const validateOptions = require('../../utils/validateOptions');
  8. const whitespaceChecker = require('../../utils/whitespaceChecker');
  9. const ruleName = 'at-rule-semicolon-space-before';
  10. const messages = ruleMessages(ruleName, {
  11. expectedBefore: () => 'Expected single space before ";"',
  12. rejectedBefore: () => 'Unexpected whitespace before ";"',
  13. });
  14. const meta = {
  15. url: 'https://stylelint.io/user-guide/rules/at-rule-semicolon-space-before',
  16. deprecated: true,
  17. };
  18. /** @type {import('stylelint').Rule} */
  19. const rule = (primary) => {
  20. const checker = whitespaceChecker('space', primary, messages);
  21. return (root, result) => {
  22. const validOptions = validateOptions(result, ruleName, {
  23. actual: primary,
  24. possible: ['always', 'never'],
  25. });
  26. if (!validOptions) {
  27. return;
  28. }
  29. root.walkAtRules((atRule) => {
  30. if (hasBlock(atRule)) {
  31. return;
  32. }
  33. if (!isStandardSyntaxAtRule(atRule)) {
  34. return;
  35. }
  36. const nodeString = rawNodeString(atRule);
  37. checker.before({
  38. source: nodeString,
  39. index: nodeString.length,
  40. err: (m) => {
  41. report({
  42. message: m,
  43. node: atRule,
  44. index: nodeString.length - 1,
  45. result,
  46. ruleName,
  47. });
  48. },
  49. });
  50. });
  51. };
  52. };
  53. rule.ruleName = ruleName;
  54. rule.messages = messages;
  55. rule.meta = meta;
  56. module.exports = rule;