Skip to content

Commit

Permalink
Refactor declaration-block-no-duplicate-properties (#6545)
Browse files Browse the repository at this point in the history
  • Loading branch information
fpetrakov committed Dec 28, 2022
1 parent b165c0b commit 121acce
Showing 1 changed file with 48 additions and 94 deletions.
142 changes: 48 additions & 94 deletions lib/rules/declaration-block-no-duplicate-properties/index.js
Expand Up @@ -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,
Expand All @@ -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;
Expand Down

0 comments on commit 121acce

Please sign in to comment.