UNPKG

@ec0lint/plugin-css

Version:

ec0lint plugin that provides rules to verify CSS definition objects

73 lines (72 loc) 2.82 kB
"use strict"; 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, }); }, });