| // @ts-nocheck |
| |
| 'use strict'; |
| |
| const isStandardSyntaxRule = require('../utils/isStandardSyntaxRule'); |
| const parseSelector = require('../utils/parseSelector'); |
| const report = require('../utils/report'); |
| const styleSearch = require('style-search'); |
| |
| module.exports = function (options) { |
| options.root.walkRules((rule) => { |
| if (!isStandardSyntaxRule(rule)) { |
| return; |
| } |
| |
| if (!rule.selector.includes('[') || !rule.selector.includes('=')) { |
| return; |
| } |
| |
| let hasFixed = false; |
| const selector = rule.raws.selector ? rule.raws.selector.raw : rule.selector; |
| |
| const fixedSelector = parseSelector(selector, options.result, rule, (selectorTree) => { |
| selectorTree.walkAttributes((attributeNode) => { |
| const operator = attributeNode.operator; |
| |
| if (!operator) { |
| return; |
| } |
| |
| const attributeNodeString = attributeNode.toString(); |
| |
| styleSearch({ source: attributeNodeString, target: operator }, (match) => { |
| const index = options.checkBeforeOperator ? match.startIndex : match.endIndex - 1; |
| |
| checkOperator(attributeNodeString, index, rule, attributeNode, operator); |
| }); |
| }); |
| }); |
| |
| if (hasFixed) { |
| if (!rule.raws.selector) { |
| rule.selector = fixedSelector; |
| } else { |
| rule.raws.selector.raw = fixedSelector; |
| } |
| } |
| |
| function checkOperator(source, index, node, attributeNode, operator) { |
| options.locationChecker({ |
| source, |
| index, |
| err: (m) => { |
| if (options.fix && options.fix(attributeNode)) { |
| hasFixed = true; |
| |
| return; |
| } |
| |
| report({ |
| message: m.replace( |
| options.checkBeforeOperator ? operator[0] : operator[operator.length - 1], |
| operator, |
| ), |
| node, |
| index: attributeNode.sourceIndex + index, |
| result: options.result, |
| ruleName: options.checkedRuleName, |
| }); |
| }, |
| }); |
| } |
| }); |
| }; |