index.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // @ts-nocheck
  2. 'use strict';
  3. const blockString = require('../../utils/blockString');
  4. const report = require('../../utils/report');
  5. const ruleMessages = require('../../utils/ruleMessages');
  6. const validateOptions = require('../../utils/validateOptions');
  7. const whitespaceChecker = require('../../utils/whitespaceChecker');
  8. const ruleName = 'declaration-block-semicolon-space-before';
  9. const messages = ruleMessages(ruleName, {
  10. expectedBefore: () => 'Expected single space before ";"',
  11. rejectedBefore: () => 'Unexpected whitespace before ";"',
  12. expectedBeforeSingleLine: () =>
  13. 'Expected single space before ";" in a single-line declaration block',
  14. rejectedBeforeSingleLine: () =>
  15. 'Unexpected whitespace before ";" in a single-line declaration block',
  16. });
  17. function rule(expectation, options, context) {
  18. const checker = whitespaceChecker('space', expectation, messages);
  19. return (root, result) => {
  20. const validOptions = validateOptions(result, ruleName, {
  21. actual: expectation,
  22. possible: ['always', 'never', 'always-single-line', 'never-single-line'],
  23. });
  24. if (!validOptions) {
  25. return;
  26. }
  27. root.walkDecls((decl) => {
  28. // Ignore last declaration if there's no trailing semicolon
  29. const parentRule = decl.parent;
  30. if (!parentRule.raws.semicolon && parentRule.last === decl) {
  31. return;
  32. }
  33. const declString = decl.toString();
  34. checker.before({
  35. source: declString,
  36. index: declString.length,
  37. lineCheckStr: blockString(parentRule),
  38. err: (m) => {
  39. if (context.fix) {
  40. const value = decl.raws.value ? decl.raws.value.raw : decl.value;
  41. if (expectation.startsWith('always')) {
  42. if (decl.important) {
  43. decl.raws.important = ' !important ';
  44. } else if (decl.raws.value) {
  45. decl.raws.value.raw = value.replace(/\s*$/, ' ');
  46. } else {
  47. decl.value = value.replace(/\s*$/, ' ');
  48. }
  49. return;
  50. }
  51. if (expectation.startsWith('never')) {
  52. if (decl.important) {
  53. decl.raws.important = decl.raws.important.replace(/\s*$/, '');
  54. } else if (decl.raws.value) {
  55. decl.raws.value.raw = value.replace(/\s*$/, '');
  56. } else {
  57. decl.value = value.replace(/\s*$/, '');
  58. }
  59. return;
  60. }
  61. }
  62. report({
  63. message: m,
  64. node: decl,
  65. index: decl.toString().length - 1,
  66. result,
  67. ruleName,
  68. });
  69. },
  70. });
  71. });
  72. };
  73. }
  74. rule.ruleName = ruleName;
  75. rule.messages = messages;
  76. module.exports = rule;