index.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // @ts-nocheck
  2. 'use strict';
  3. const _ = require('lodash');
  4. const ruleMessages = require('../../utils/ruleMessages');
  5. const selectorAttributeOperatorSpaceChecker = require('../selectorAttributeOperatorSpaceChecker');
  6. const validateOptions = require('../../utils/validateOptions');
  7. const whitespaceChecker = require('../../utils/whitespaceChecker');
  8. const ruleName = 'selector-attribute-operator-space-after';
  9. const messages = ruleMessages(ruleName, {
  10. expectedAfter: (operator) => `Expected single space after "${operator}"`,
  11. rejectedAfter: (operator) => `Unexpected whitespace after "${operator}"`,
  12. });
  13. function rule(expectation, options, context) {
  14. return (root, result) => {
  15. const checker = whitespaceChecker('space', expectation, messages);
  16. const validOptions = validateOptions(result, ruleName, {
  17. actual: expectation,
  18. possible: ['always', 'never'],
  19. });
  20. if (!validOptions) {
  21. return;
  22. }
  23. selectorAttributeOperatorSpaceChecker({
  24. root,
  25. result,
  26. locationChecker: checker.after,
  27. checkedRuleName: ruleName,
  28. checkBeforeOperator: false,
  29. fix: context.fix
  30. ? (attributeNode) => {
  31. const { operatorAfter, setOperatorAfter } = (() => {
  32. const rawOperator = _.get(attributeNode, 'raws.operator');
  33. if (rawOperator) {
  34. const operatorAfter = rawOperator.slice(attributeNode.operator.length);
  35. return {
  36. operatorAfter,
  37. setOperatorAfter(fixed) {
  38. delete attributeNode.raws.operator;
  39. _.set(attributeNode, 'raws.spaces.operator.after', fixed);
  40. },
  41. };
  42. }
  43. const rawOperatorAfter = _.get(attributeNode, 'raws.spaces.operator.after');
  44. if (rawOperatorAfter) {
  45. return {
  46. operatorAfter: rawOperatorAfter,
  47. setOperatorAfter(fixed) {
  48. attributeNode.raws.spaces.operator.after = fixed;
  49. },
  50. };
  51. }
  52. return {
  53. operatorAfter: _.get(attributeNode, 'spaces.operator.after', ''),
  54. setOperatorAfter(fixed) {
  55. _.set(attributeNode, 'spaces.operator.after', fixed);
  56. },
  57. };
  58. })();
  59. if (expectation === 'always') {
  60. setOperatorAfter(operatorAfter.replace(/^\s*/, ' '));
  61. return true;
  62. }
  63. if (expectation === 'never') {
  64. setOperatorAfter(operatorAfter.replace(/^\s*/, ''));
  65. return true;
  66. }
  67. }
  68. : null,
  69. });
  70. };
  71. }
  72. rule.ruleName = ruleName;
  73. rule.messages = messages;
  74. module.exports = rule;