index.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // @ts-nocheck
  2. 'use strict';
  3. const declarationBangSpaceChecker = require('../declarationBangSpaceChecker');
  4. const declarationValueIndex = require('../../utils/declarationValueIndex');
  5. const ruleMessages = require('../../utils/ruleMessages');
  6. const validateOptions = require('../../utils/validateOptions');
  7. const whitespaceChecker = require('../../utils/whitespaceChecker');
  8. const ruleName = 'declaration-bang-space-before';
  9. const messages = ruleMessages(ruleName, {
  10. expectedBefore: () => 'Expected single space before "!"',
  11. rejectedBefore: () => 'Unexpected whitespace before "!"',
  12. });
  13. function rule(expectation, options, context) {
  14. const checker = whitespaceChecker('space', expectation, messages);
  15. return (root, result) => {
  16. const validOptions = validateOptions(result, ruleName, {
  17. actual: expectation,
  18. possible: ['always', 'never'],
  19. });
  20. if (!validOptions) {
  21. return;
  22. }
  23. declarationBangSpaceChecker({
  24. root,
  25. result,
  26. locationChecker: checker.before,
  27. checkedRuleName: ruleName,
  28. fix: context.fix
  29. ? (decl, index) => {
  30. let bangIndex = index - declarationValueIndex(decl);
  31. const value = decl.raws.value ? decl.raws.value.raw : decl.value;
  32. let target;
  33. let setFixed;
  34. if (bangIndex < value.length) {
  35. target = value;
  36. setFixed = (value) => {
  37. if (decl.raws.value) {
  38. decl.raws.value.raw = value;
  39. } else {
  40. decl.value = value;
  41. }
  42. };
  43. } else if (decl.important) {
  44. target = decl.raws.important || ' !important';
  45. bangIndex -= value.length;
  46. setFixed = (value) => {
  47. decl.raws.important = value;
  48. };
  49. } else {
  50. return false; // not standard
  51. }
  52. const targetBefore = target.slice(0, bangIndex);
  53. const targetAfter = target.slice(bangIndex);
  54. if (expectation === 'always') {
  55. // eslint-disable-next-line prefer-template
  56. setFixed(targetBefore.replace(/\s*$/, '') + ' ' + targetAfter);
  57. return true;
  58. }
  59. if (expectation === 'never') {
  60. setFixed(targetBefore.replace(/\s*$/, '') + targetAfter);
  61. return true;
  62. }
  63. }
  64. : null,
  65. });
  66. };
  67. }
  68. rule.ruleName = ruleName;
  69. rule.messages = messages;
  70. module.exports = rule;