eslint-plugin-vue-scoped-css
Version:
ESLint plugin for Scoped CSS in Vue.js
65 lines (64 loc) • 2.4 kB
JavaScript
const context_1 = require("../styles/context");
const selectors_1 = require("../styles/utils/selectors");
const compat_1 = require("../utils/compat");
module.exports = {
meta: {
docs: {
description: "enforce `:slotted()`/`::v-slotted()` style",
categories: [],
default: "warn",
url: "https://future-architect.github.io/eslint-plugin-vue-scoped-css/rules/v-slotted-pseudo-style.html",
},
fixable: "code",
messages: {
expectedSlotted: "Expected ':slotted()' instead of '::v-slotted()'.",
expectedVSlotted: "Expected '::v-slotted()' instead of ':slotted()'.",
},
schema: [{ enum: [":slotted", "::v-slotted"] }],
type: "suggestion",
},
create(context) {
const styles = (0, context_1.getStyleContexts)(context)
.filter(context_1.isValidStyleContext)
.filter((style) => style.scoped);
if (!styles.length) {
return {};
}
const expected = (context.options[0] || ":slotted");
const reporter = (0, context_1.getCommentDirectivesReporter)(context);
function report(node) {
reporter.report({
node,
loc: node.loc,
messageId: expected === ":slotted" ? "expectedSlotted" : "expectedVSlotted",
fix(fixer) {
const nodeText = (0, compat_1.getSourceCode)(context).text.slice(...node.range);
return fixer.replaceTextRange(node.range, nodeText.replace(/^(\s*)(?::slotted|::v-slotted)(\s*\()/u, (_, prefix, suffix) => `${prefix}${expected}${suffix}`));
},
});
}
function verifyNode(node) {
if (node.value === expected) {
return;
}
report(node);
}
function verify(style) {
style.traverseSelectorNodes({
enterNode(node) {
if ((0, selectors_1.isVSlottedPseudo)(node) && !(0, selectors_1.isPseudoEmptyArguments)(node)) {
verifyNode(node);
}
},
});
}
return {
"Program:exit"() {
for (const style of styles) {
verify(style);
}
},
};
},
};
;