From 069c4249dc10a71e0fef455bf4ebea17776dbcf2 Mon Sep 17 00:00:00 2001 From: Peng Yang Date: Tue, 25 May 2021 04:38:40 +0800 Subject: [PATCH] fix(postcss-merge-rules): check all intersections when merging rules (#1116) * fix: 1112 * test: test-case --- .../src/__tests__/index.js | 8 ++++++++ packages/postcss-merge-rules/src/index.js | 20 ++++++++++--------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/packages/postcss-merge-rules/src/__tests__/index.js b/packages/postcss-merge-rules/src/__tests__/index.js index 2213f89cf..94f8b63eb 100644 --- a/packages/postcss-merge-rules/src/__tests__/index.js +++ b/packages/postcss-merge-rules/src/__tests__/index.js @@ -815,3 +815,11 @@ test( 'a,a:link,a:visited{color:#555}' ) ); + +test( + 'should not merge colors', + processCSS( + 'h1{color:#001;color:#002;color:#003}h2{color:#001;color:#002}', + 'h1{color:#001;color:#002;color:#003}h2{color:#001;color:#002}' + ) +); diff --git a/packages/postcss-merge-rules/src/index.js b/packages/postcss-merge-rules/src/index.js index 04f6e9175..d735f83be 100644 --- a/packages/postcss-merge-rules/src/index.js +++ b/packages/postcss-merge-rules/src/index.js @@ -206,23 +206,25 @@ function partialMerge(first, second) { // Filter out intersections with later conflicts in First intersection = intersection.filter((decl, intersectIndex) => { - const index = indexOfDeclaration(firstDecls, decl); + const indexOfDecl = indexOfDeclaration(firstDecls, decl); const nextConflictInFirst = firstDecls - .slice(index + 1) - .find((d) => isConflictingProp(d.prop, decl.prop)); - if (!nextConflictInFirst) { + .slice(indexOfDecl + 1) + .filter((d) => isConflictingProp(d.prop, decl.prop)); + if (!nextConflictInFirst.length) { return true; } const nextConflictInIntersection = intersection .slice(intersectIndex + 1) - .find((d) => isConflictingProp(d.prop, decl.prop)); - if (!nextConflictInIntersection) { + .filter((d) => isConflictingProp(d.prop, decl.prop)); + if (!nextConflictInIntersection.length) { return false; } - if (declarationIsEqual(nextConflictInFirst, nextConflictInIntersection)) { - return true; + if (nextConflictInFirst.length !== nextConflictInIntersection.length) { + return false; } - return false; + return nextConflictInFirst.every((d, index) => + declarationIsEqual(d, nextConflictInIntersection[index]) + ); }); // Filter out intersections with previous conflicts in Second