UNPKG

eslint-plugin-vue-scoped-css

Version:
65 lines (64 loc) 2.38 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 `:global()`/`::v-global()` style", categories: [], default: "warn", url: "https://future-architect.github.io/eslint-plugin-vue-scoped-css/rules/v-global-pseudo-style.html", }, fixable: "code", messages: { expectedGlobal: "Expected ':global()' instead of '::v-global()'.", expectedVGlobal: "Expected '::v-global()' instead of ':global()'.", }, schema: [{ enum: [":global", "::v-global"] }], 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] || ":global"); const reporter = (0, context_1.getCommentDirectivesReporter)(context); function report(node) { reporter.report({ node, loc: node.loc, messageId: expected === ":global" ? "expectedGlobal" : "expectedVGlobal", fix(fixer) { const nodeText = (0, compat_1.getSourceCode)(context).text.slice(...node.range); return fixer.replaceTextRange(node.range, nodeText.replace(/^(\s*)(?::global|::v-global)(\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.isVGlobalPseudo)(node) && !(0, selectors_1.isPseudoEmptyArguments)(node)) { verifyNode(node); } }, }); } return { "Program:exit"() { for (const style of styles) { verify(style); } }, }; }, };