eslint-plugin-vue-scoped-css
Version:
ESLint plugin for Scoped CSS in Vue.js
69 lines (68 loc) • 2.43 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: "disallow using deprecated deep combinators",
categories: ["vue3-recommended"],
default: "warn",
url: "https://future-architect.github.io/eslint-plugin-vue-scoped-css/rules/no-deprecated-deep-combinator.html",
},
fixable: "code",
messages: {
deprecated: "The deep combinator `{{value}}` is deprecated.",
},
schema: [],
type: "suggestion",
},
create(context) {
const styles = (0, context_1.getStyleContexts)(context)
.filter(context_1.isValidStyleContext)
.filter((style) => style.scoped);
if (!styles.length) {
return {};
}
const reporter = (0, context_1.getCommentDirectivesReporter)(context);
function report(node) {
reporter.report({
node,
loc: node.loc,
messageId: "deprecated",
data: {
value: node.value.trim(),
},
fix(fixer) {
var _a, _b;
const sourceCodeText = (0, compat_1.getSourceCode)(context).text;
const range = [...node.range];
let newText = "::v-deep";
if ((_a = sourceCodeText[range[0] - 1]) === null || _a === void 0 ? void 0 : _a.trim()) {
newText = ` ${newText}`;
}
if ((_b = sourceCodeText[range[1]]) === null || _b === void 0 ? void 0 : _b.trim()) {
newText = `${newText} `;
}
return fixer.replaceTextRange(range, newText);
},
});
}
function verify(style) {
style.traverseSelectorNodes({
enterNode(node) {
if ((0, selectors_1.isDeepCombinator)(node)) {
report(node);
}
},
});
}
return {
"Program:exit"() {
for (const style of styles) {
verify(style);
}
},
};
},
};
;