index.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. 'use strict';
  2. const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule');
  3. const matchesStringOrRegExp = require('../../utils/matchesStringOrRegExp');
  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 { isRegExp, isString } = require('../../utils/validateTypes');
  9. const ruleName = 'selector-attribute-name-disallowed-list';
  10. const messages = ruleMessages(ruleName, {
  11. rejected: (name) => `Unexpected name "${name}"`,
  12. });
  13. const meta = {
  14. url: 'https://stylelint.io/user-guide/rules/list/selector-attribute-name-disallowed-list',
  15. };
  16. /** @type {import('stylelint').Rule<string | RegExp | Array<string | RegExp>>} */
  17. const rule = (primary) => {
  18. return (root, result) => {
  19. const validOptions = validateOptions(result, ruleName, {
  20. actual: primary,
  21. possible: [isString, isRegExp],
  22. });
  23. if (!validOptions) {
  24. return;
  25. }
  26. root.walkRules((ruleNode) => {
  27. if (!isStandardSyntaxRule(ruleNode)) {
  28. return;
  29. }
  30. if (!ruleNode.selector.includes('[')) {
  31. return;
  32. }
  33. parseSelector(ruleNode.selector, result, ruleNode, (selectorTree) => {
  34. selectorTree.walkAttributes((attributeNode) => {
  35. const attributeName = attributeNode.qualifiedAttribute;
  36. if (!matchesStringOrRegExp(attributeName, primary)) {
  37. return;
  38. }
  39. const index = attributeNode.sourceIndex + attributeNode.offsetOf('attribute');
  40. const endIndex = index + attributeName.length;
  41. report({
  42. message: messages.rejected(attributeName),
  43. node: ruleNode,
  44. index,
  45. endIndex,
  46. result,
  47. ruleName,
  48. });
  49. });
  50. });
  51. });
  52. };
  53. };
  54. rule.primaryOptionArray = true;
  55. rule.ruleName = ruleName;
  56. rule.messages = messages;
  57. rule.meta = meta;
  58. module.exports = rule;