@ec0lint/plugin-css
Version:
ec0lint plugin that provides rules to verify CSS definition objects
73 lines (72 loc) • 2.82 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const utils_1 = require("../utils");
const css_utils_1 = require("../utils/css-utils");
exports.default = (0, utils_1.createRule)("no-dupe-properties", {
meta: {
docs: {
description: "disallow duplicate properties",
category: "Possible Errors",
recommended: true,
stylelint: null,
},
schema: [],
messages: {
unexpected: "Duplicate property '{{name}}' and '{{other}}'.",
},
type: "problem",
},
create(context) {
function createVisitor(_cssContext) {
let scopeStack = { upper: null, names: [] };
function verifyNames(names) {
const reported = new Set();
const map = new Map();
for (const name of names) {
const normalized = (0, css_utils_1.normalizePropertyName)(name.name, {
keepVendorPrefix: true,
});
const already = map.get(normalized);
if (already &&
name.name !== already.name) {
for (const [report, other] of [
[already, name],
[name, already],
].filter(([n]) => !reported.has(n))) {
context.report({
node: report.directExpression ||
report.expression,
messageId: "unexpected",
data: { name: report.name, other: other.name },
});
reported.add(report);
}
}
map.set(normalized, name);
}
}
return {
onRule() {
scopeStack = { upper: scopeStack, names: [] };
},
onProperty(property) {
const name = property.getName();
if (!name) {
return;
}
scopeStack.names.push(name);
},
"onRule:exit"() {
verifyNames(scopeStack.names);
scopeStack = (scopeStack === null || scopeStack === void 0 ? void 0 : scopeStack.upper) || scopeStack;
},
"onRoot:exit"() {
verifyNames(scopeStack.names);
},
};
}
return (0, utils_1.defineCSSVisitor)(context, {
createVisitor,
});
},
});