You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.6 KiB
82 lines
2.6 KiB
|
2 years ago
|
"use strict";
|
||
|
|
|
||
|
|
Object.defineProperty(exports, "__esModule", {
|
||
|
|
value: true
|
||
|
|
});
|
||
|
|
exports["default"] = rule;
|
||
|
|
exports.ruleName = exports.meta = exports.messages = void 0;
|
||
|
|
var _postcssSelectorParser = require("postcss-selector-parser");
|
||
|
|
var _stylelint = require("stylelint");
|
||
|
|
var _utils = require("../../utils");
|
||
|
|
var ruleName = (0, _utils.namespace)("selector-no-union-class-name");
|
||
|
|
exports.ruleName = ruleName;
|
||
|
|
var messages = _stylelint.utils.ruleMessages(ruleName, {
|
||
|
|
rejected: "Unexpected union class name with the parent selector (&)"
|
||
|
|
});
|
||
|
|
exports.messages = messages;
|
||
|
|
var meta = {
|
||
|
|
url: (0, _utils.ruleUrl)(ruleName)
|
||
|
|
};
|
||
|
|
exports.meta = meta;
|
||
|
|
var validNestingTypes = [_postcssSelectorParser.isClassName, _postcssSelectorParser.isCombinator, _postcssSelectorParser.isAttribute, _postcssSelectorParser.isIdentifier, _postcssSelectorParser.isPseudoClass, _postcssSelectorParser.isPseudoElement];
|
||
|
|
function rule(actual) {
|
||
|
|
return function (root, result) {
|
||
|
|
var validOptions = _stylelint.utils.validateOptions(result, ruleName, {
|
||
|
|
actual: actual
|
||
|
|
});
|
||
|
|
if (!validOptions) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
root.walkRules(/&/, function (rule) {
|
||
|
|
var parentNodes = [];
|
||
|
|
var selector = getSelectorFromRule(rule.parent);
|
||
|
|
if (selector) {
|
||
|
|
(0, _utils.parseSelector)(selector, result, rule, function (fullSelector) {
|
||
|
|
fullSelector.walk(function (node) {
|
||
|
|
return parentNodes.push(node);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
}
|
||
|
|
if (parentNodes.length === 0) return;
|
||
|
|
var lastParentNode = parentNodes[parentNodes.length - 1];
|
||
|
|
if (!(0, _postcssSelectorParser.isClassName)(lastParentNode)) return;
|
||
|
|
(0, _utils.parseSelector)(rule.selector, result, rule, function (fullSelector) {
|
||
|
|
fullSelector.walkNesting(function (node) {
|
||
|
|
var next = node.next();
|
||
|
|
if (!next) return;
|
||
|
|
if (validNestingTypes.some(function (isType) {
|
||
|
|
return isType(next);
|
||
|
|
})) return;
|
||
|
|
_stylelint.utils.report({
|
||
|
|
ruleName: ruleName,
|
||
|
|
result: result,
|
||
|
|
node: rule,
|
||
|
|
message: messages.rejected,
|
||
|
|
index: node.sourceIndex
|
||
|
|
});
|
||
|
|
});
|
||
|
|
});
|
||
|
|
});
|
||
|
|
};
|
||
|
|
}
|
||
|
|
rule.ruleName = ruleName;
|
||
|
|
rule.messages = messages;
|
||
|
|
rule.meta = meta;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Searches for the closest rule which
|
||
|
|
* has a selector and returns the selector
|
||
|
|
* @returns {string|undefined}
|
||
|
|
*/
|
||
|
|
function getSelectorFromRule(rule) {
|
||
|
|
// All non at-rules have their own selector
|
||
|
|
if (rule.selector !== undefined) {
|
||
|
|
return rule.selector;
|
||
|
|
}
|
||
|
|
|
||
|
|
// At-rules like @mixin don't have a selector themself
|
||
|
|
// but their parents might have one
|
||
|
|
if (rule.parent) {
|
||
|
|
return getSelectorFromRule(rule.parent);
|
||
|
|
}
|
||
|
|
}
|