UNPKG

eslint-plugin-vue-scoped-css

Version:
65 lines (64 loc) 2.4 kB
"use strict"; 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); } }, }; }, };