eslint-plugin-vue-scoped-css
Version:
ESLint plugin for Scoped CSS in Vue.js
171 lines (170 loc) • 5.77 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.hasNodesSelector = hasNodesSelector;
exports.normalizePseudoParams = normalizePseudoParams;
exports.isVueSpecialPseudo = isVueSpecialPseudo;
exports.isVDeepPseudoV2 = isVDeepPseudoV2;
exports.isVDeepPseudo = isVDeepPseudo;
exports.isVSlottedPseudo = isVSlottedPseudo;
exports.isVGlobalPseudo = isVGlobalPseudo;
exports.isPseudoEmptyArguments = isPseudoEmptyArguments;
exports.isTypeSelector = isTypeSelector;
exports.isIDSelector = isIDSelector;
exports.isClassSelector = isClassSelector;
exports.isUniversalSelector = isUniversalSelector;
exports.isNestingSelector = isNestingSelector;
exports.isPseudo = isPseudo;
exports.isSelectorCombinator = isSelectorCombinator;
exports.isDescendantCombinator = isDescendantCombinator;
exports.isChildCombinator = isChildCombinator;
exports.isAdjacentSiblingCombinator = isAdjacentSiblingCombinator;
exports.isGeneralSiblingCombinator = isGeneralSiblingCombinator;
exports.isDeepCombinator = isDeepCombinator;
exports.isNestingAtRule = isNestingAtRule;
exports.findNestingSelectors = findNestingSelectors;
exports.findNestingSelector = findNestingSelector;
const ast_1 = require("../ast");
const css_nodes_1 = require("./css-nodes");
function hasNodesSelector(node) {
return (node != null &&
(node.type === "VCSSSelector" || node.type === "VCSSSelectorPseudo"));
}
function normalizePseudoParams(pseudo, nodes) {
const results = [];
let buffer = [];
for (const node of nodes) {
if (node.type === "VCSSSelector") {
if (buffer.length) {
const startNode = buffer[0];
const endNode = buffer[buffer.length - 1];
const loc = {
start: startNode.loc.start,
end: endNode.loc.end,
};
results.push(new ast_1.VCSSSelector(buffer[0], loc, startNode.start, endNode.end, {
parent: pseudo,
nodes: buffer,
}));
buffer = [];
}
results.push(node);
}
else {
buffer.push(node);
}
}
if (buffer.length) {
const startNode = buffer[0];
const endNode = buffer[buffer.length - 1];
const loc = {
start: startNode.loc.start,
end: endNode.loc.end,
};
results.push(new ast_1.VCSSSelector(buffer[0], loc, startNode.start, endNode.end, {
parent: pseudo,
nodes: buffer,
}));
buffer = [];
}
return results;
}
function isVueSpecialPseudo(node) {
return isVDeepPseudo(node) || isVSlottedPseudo(node) || isVGlobalPseudo(node);
}
function isVDeepPseudoV2(node) {
if (isVDeepPseudo(node)) {
return node.nodes.length === 0;
}
return false;
}
function isVDeepPseudo(node) {
if (isPseudo(node)) {
const val = node.value.trim();
return val === "::v-deep" || val === ":deep";
}
return false;
}
function isVSlottedPseudo(node) {
if (isPseudo(node)) {
const val = node.value.trim();
return val === "::v-slotted" || val === ":slotted";
}
return false;
}
function isVGlobalPseudo(node) {
if (isPseudo(node)) {
const val = node.value.trim();
return val === "::v-global" || val === ":global";
}
return false;
}
function isPseudoEmptyArguments(node) {
return (node.nodes.length === 0 ||
(node.nodes.length === 1 && node.nodes[0].nodes.length === 0));
}
function isTypeSelector(node) {
return (node === null || node === void 0 ? void 0 : node.type) === "VCSSTypeSelector";
}
function isIDSelector(node) {
return (node === null || node === void 0 ? void 0 : node.type) === "VCSSIDSelector";
}
function isClassSelector(node) {
return (node === null || node === void 0 ? void 0 : node.type) === "VCSSClassSelector";
}
function isUniversalSelector(node) {
return (node === null || node === void 0 ? void 0 : node.type) === "VCSSUniversalSelector";
}
function isNestingSelector(node) {
return (node === null || node === void 0 ? void 0 : node.type) === "VCSSNestingSelector";
}
function isPseudo(node) {
return (node === null || node === void 0 ? void 0 : node.type) === "VCSSSelectorPseudo";
}
function isSelectorCombinator(node) {
return (node === null || node === void 0 ? void 0 : node.type) === "VCSSSelectorCombinator";
}
function isDescendantCombinator(node) {
return isSelectorCombinator(node) && node.value.trim() === "";
}
function isChildCombinator(node) {
return isSelectorCombinator(node) && node.value.trim() === ">";
}
function isAdjacentSiblingCombinator(node) {
return isSelectorCombinator(node) && node.value.trim() === "+";
}
function isGeneralSiblingCombinator(node) {
return isSelectorCombinator(node) && node.value.trim() === "~";
}
function isDeepCombinator(node) {
if (isSelectorCombinator(node)) {
const val = node.value.trim();
return val === ">>>" || val === "/deep/";
}
return false;
}
function isNestingAtRule(node) {
if (node == null) {
return false;
}
return (0, css_nodes_1.isVCSSAtRule)(node) && node.name === "nest" && node.identifier === "@";
}
function* findNestingSelectors(nodes) {
for (const node of nodes) {
if (isNestingSelector(node)) {
yield {
nestingIndex: nodes.indexOf(node),
node,
nodes,
};
}
if (hasNodesSelector(node)) {
yield* findNestingSelectors(node.nodes);
}
}
}
function findNestingSelector(nodes) {
for (const nest of findNestingSelectors(nodes)) {
return nest;
}
return null;
}