From 121acce9a731ef549c62a140083235e65dfd3dfe Mon Sep 17 00:00:00 2001 From: Fedya Petrakov Date: Wed, 28 Dec 2022 19:13:48 +0300 Subject: [PATCH] Refactor declaration-block-no-duplicate-properties (#6545) --- .../index.js | 142 ++++++------------ 1 file changed, 48 insertions(+), 94 deletions(-) diff --git a/lib/rules/declaration-block-no-duplicate-properties/index.js b/lib/rules/declaration-block-no-duplicate-properties/index.js index 31a70524e0..cb755c1d64 100644 --- a/lib/rules/declaration-block-no-duplicate-properties/index.js +++ b/lib/rules/declaration-block-no-duplicate-properties/index.js @@ -88,97 +88,58 @@ const rule = (primary, secondaryOptions, context) => { const indexDuplicate = decls.findIndex((d) => d.prop.toLowerCase() === lowerProp); - if (indexDuplicate !== -1) { - const duplicateDecl = decls[indexDuplicate]; - const duplicateValue = duplicateDecl ? duplicateDecl.value : ''; - const duplicateImportant = duplicateDecl ? duplicateDecl.important : false; - - if (ignoreDiffValues || ignorePrefixlessSameValues) { - // fails if duplicates are not consecutive - if (indexDuplicate !== decls.length - 1) { - if (context.fix) { - if (!important && duplicateImportant) { - decl.remove(); - } else { - removePreviousDuplicate(decls, lowerProp); - } - - return; - } - - report({ - message: messages.rejected(prop), - node: decl, - result, - ruleName, - word: prop, - }); - - return; - } - - if (ignorePrefixlessSameValues) { - // fails if values of consecutive, unprefixed duplicates are equal - if (vendor.unprefixed(value) !== vendor.unprefixed(duplicateValue)) { - if (context.fix) { - if (!important && duplicateImportant) { - decl.remove(); - } else { - removePreviousDuplicate(decls, lowerProp); - } - - return; - } - - report({ - message: messages.rejected(prop), - node: decl, - result, - ruleName, - word: prop, - }); - - return; - } - } - - // fails if values of consecutive duplicates are equal - if (value === duplicateValue) { - if (context.fix) { - removePreviousDuplicate(decls, lowerProp); - - return; - } - - report({ - message: messages.rejected(prop), - node: decl, - result, - ruleName, - word: prop, - }); - - return; - } + if (indexDuplicate === -1) { + decls.push(decl); + } - return; + const duplicateDecl = decls[indexDuplicate]; + + if (!duplicateDecl) { + return; + } + + const duplicateValue = duplicateDecl.value || ''; + const duplicateImportant = duplicateDecl.important || false; + const duplicateIsMoreImportant = !important && duplicateImportant; + const duplicatesAreConsecutive = indexDuplicate === decls.length - 1; + const unprefixedDuplicatesAreEqual = + vendor.unprefixed(value) === vendor.unprefixed(duplicateValue); + + const fixOrReport = () => { + if (!context.fix) { + return report({ + message: messages.rejected(prop), + node: decl, + result, + ruleName, + word: prop, + }); } - if (ignoreDuplicates && indexDuplicate === decls.length - 1) { - return; + if (duplicateIsMoreImportant) { + return decl.remove(); } - if (context.fix) { - if (!important && duplicateImportant) { - decl.remove(); - } else { - removePreviousDuplicate(decls, lowerProp); - } + return duplicateDecl.remove(); + }; + + if (ignoreDiffValues || ignorePrefixlessSameValues) { + if ( + !duplicatesAreConsecutive || + (ignorePrefixlessSameValues && !unprefixedDuplicatesAreEqual) + ) { + fixOrReport(); + } + if (value !== duplicateValue) { return; } - report({ + if (context.fix) { + return duplicateDecl.remove(); + } + + return report({ message: messages.rejected(prop), node: decl, result, @@ -187,23 +148,16 @@ const rule = (primary, secondaryOptions, context) => { }); } - decls.push(decl); + if (ignoreDuplicates && duplicatesAreConsecutive) { + return; + } + + fixOrReport(); }); }); }; }; -/** - * @param {import('postcss').Declaration[]} declarations - * @param {string} lowerProperty - * @returns {void} - * */ -function removePreviousDuplicate(declarations, lowerProperty) { - const declToRemove = declarations.find((d) => d.prop.toLowerCase() === lowerProperty); - - if (declToRemove) declToRemove.remove(); -} - rule.ruleName = ruleName; rule.messages = messages; rule.meta = meta;