index.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // @ts-nocheck
  2. 'use strict';
  3. const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule');
  4. const parseSelector = require('../../utils/parseSelector');
  5. const report = require('../../utils/report');
  6. const ruleMessages = require('../../utils/ruleMessages');
  7. const validateOptions = require('../../utils/validateOptions');
  8. const ruleName = 'selector-attribute-quotes';
  9. const messages = ruleMessages(ruleName, {
  10. expected: (value) => `Expected quotes around "${value}"`,
  11. rejected: (value) => `Unexpected quotes around "${value}"`,
  12. });
  13. function rule(expectation) {
  14. return (root, result) => {
  15. const validOptions = validateOptions(result, ruleName, {
  16. actual: expectation,
  17. possible: ['always', 'never'],
  18. });
  19. if (!validOptions) {
  20. return;
  21. }
  22. root.walkRules((rule) => {
  23. if (!isStandardSyntaxRule(rule)) {
  24. return;
  25. }
  26. if (!rule.selector.includes('[') || !rule.selector.includes('=')) {
  27. return;
  28. }
  29. parseSelector(rule.selector, result, rule, (selectorTree) => {
  30. selectorTree.walkAttributes((attributeNode) => {
  31. if (!attributeNode.operator) {
  32. return;
  33. }
  34. if (!attributeNode.quoted && expectation === 'always') {
  35. complain(
  36. messages.expected(attributeNode.value),
  37. attributeNode.sourceIndex + attributeNode.offsetOf('value'),
  38. );
  39. }
  40. if (attributeNode.quoted && expectation === 'never') {
  41. complain(
  42. messages.rejected(attributeNode.value),
  43. attributeNode.sourceIndex + attributeNode.offsetOf('value'),
  44. );
  45. }
  46. });
  47. });
  48. function complain(message, index) {
  49. report({
  50. message,
  51. index,
  52. result,
  53. ruleName,
  54. node: rule,
  55. });
  56. }
  57. });
  58. };
  59. }
  60. rule.ruleName = ruleName;
  61. rule.messages = messages;
  62. module.exports = rule;