Fix declaration-block-no-duplicate-properties false negatives for named colors with ignore: ['consecutive-duplicates-with-different-syntaxes']#8665
Conversation
🦋 Changeset detectedLatest commit: 874bed3 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
…cate detection; added comprehensive tests for named color scenarios
0cc8154 to
0514f8a
Compare
|
This PR is packaged and the instant preview is available (874bed3). View the demo website. Install it locally: npm i -D https://pkg.pr.new/stylelint@874bed3 |
|
Hello @sw1tch3roo, Thanks for your first contribution. Check my comment above. You should also filter out the properties using our p {
animation-name: red;
animation-name: black;
} |
…es only, preventing false negatives for properties like scrollbar-color, border-color, and animation-name
…olors' into fix-duplicate-properties-named-colors
|
Thank u for the review @Mouvedia!! I've implemented the fix by restricting named color equivalence to only properties in the All the test cases you mentioned now pass correctly =) |
|
If the goal of the PR is to only target color properties then you have to restrict it to
a {
border-color: red yellow;
border-color: green;
}won't produce an error in the demo; is it by design?
Is the number of values considered a different "type"? |
|
Honestly, I was a bit confused by all the edge cases at first, but after going through everything again I think we got it right now =D After that confusion earlier, I kept the named color logic but refined it to only apply to actual color properties and respect that different value counts = different syntaxes. So a {
border-color: red yellow;
border-color: green;
}correctly doesn't error since they have different structures |
As I asked before, is that the expected behaviour? ref In particular
seems to indicate that it should error out? |
@Mouvedia yep, this is expected behavior
I think so. So this case has different structures: a {
border-color: red yellow;
border-color: green;
}So we treat them as different syntaxes - no error with the ignore option. Our named color logic only kicks in when values have the same structure (like We're being smarter about it - instead of just comparing keywords, we look at the whole value syntax. This catches real duplicates while allowing legitimate fallback patterns, which is what @romainmenke wanted |
|
@Mouvedia @romainmenke guys, what do you think about the above? |
jeddy3
left a comment
There was a problem hiding this comment.
Thank you for your efforts working through the edge cases of this pull request.
I've made one minor request. Otherwise, it LGTM.
| datasource | package | from | to | | ---------- | --------- | ------- | ------- | | npm | stylelint | 16.20.0 | 16.23.0 | ## [v16.23.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16230---2025-07-29) It adds 5 new rules, 1 option to a rule and fixes 3 bugs. We've turned on the new rules in our [standard config](https://www.npmjs.com/package/stylelint-config-standard). - Added: `block-no-redundant-nested-style-rules` rule ([#8684](stylelint/stylelint#8684)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `media-type-no-deprecated` rule ([#8668](stylelint/stylelint#8668)) ([@immitsu](https://github.com/immitsu)). - Added: `nesting-selector-no-missing-scoping-root` rule ([#8674](stylelint/stylelint#8674)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `no-invalid-position-declaration` rule ([#8669](stylelint/stylelint#8669)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `property-no-deprecated` rule ([#8682](stylelint/stylelint#8682)) ([@immitsu](https://github.com/immitsu)). - Added: `except: ["exact-value"]` to `media-feature-range-notation` ([#8675](stylelint/stylelint#8675)) ([@immitsu](https://github.com/immitsu)). - Fixed: `declaration-block-no-duplicate-properties` false negatives for named colors with `ignore: ['consecutive-duplicates-with-different-syntaxes']` ([#8665](stylelint/stylelint#8665)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Fixed: `function-no-unknown` false positives ([#8677](stylelint/stylelint#8677)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `no-irregular-whitespace` false positives for strings ([#8667](stylelint/stylelint#8667)) ([@immitsu](https://github.com/immitsu)). ## [v16.22.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16220---2025-07-18) It adds 3 rule features and fixes 2 bugs. - Added: `messageArgs` to `color-named` ([#8663](stylelint/stylelint#8663)) ([@Mouvedia](https://github.com/Mouvedia)). - Added: `messageArgs` to `declaration-property-value-keyword-no-deprecated` ([#8654](stylelint/stylelint#8654)) ([@Mouvedia](https://github.com/Mouvedia)). - Added: `no-descending-specificity` report message includes line number of the anchoring selector ([#8666](stylelint/stylelint#8666)) ([@immitsu](https://github.com/immitsu)). - Fixed: `at-rule-no-deprecated` false positives for `@apply` ([#8630](stylelint/stylelint#8630)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `lightness-notation` crash with `"number"` option and single-digit percentage ([#8661](stylelint/stylelint#8661)) ([@ybiquitous](https://github.com/ybiquitous)). ## [v16.21.1](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16211---2025-07-03) It fixes 3 bugs. - Fixed: unexpected change of syntax in computed `EditInfo` ([#8638](stylelint/stylelint#8638)) ([@romainmenke](https://github.com/romainmenke)). - Fixed: `function-linear-gradient-no-nonstandard-direction` false positives for CSS variables' names containing a direction substring ([#8643](stylelint/stylelint#8643)) ([@Solomon-mithra](https://github.com/Solomon-mithra)). - Fixed: `media-feature-range-notation` autofix for exact values ([#8651](stylelint/stylelint#8651)) ([@romainmenke](https://github.com/romainmenke)). ## [v16.21.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16210---2025-06-19) It rounds out the `message` secondary option and marks it as stable, adds 1 new option to a rule, and fixes 4 bugs. - Added: non-experimental support for functional `message` secondary option ([#8595](stylelint/stylelint#8595)) ([@ybiquitous](https://github.com/ybiquitous)). - Added: `ignore: ["after-custom-property"]` to `custom-property-empty-line-before` ([#8627](stylelint/stylelint#8627)) ([@imkesin](https://github.com/imkesin)). - Fixed: `cache` configuration property not being respected ([#8599](stylelint/stylelint#8599)) ([@ybiquitous](https://github.com/ybiquitous)). - Fixed: `fastest-levenshtein` import when bundling ([#8621](stylelint/stylelint#8621)) ([@onigoetz](https://github.com/onigoetz)). - Fixed: `named-grid-areas-no-invalid` false positives for interpolated grid-template-areas in CSS-in-JS ([#8606](stylelint/stylelint#8606)) ([@shahana308](https://github.com/shahana308)). - Fixed: `selector-pseudo-*-no-unknown` false positives for the missing form control styling selectors ([#8623](stylelint/stylelint#8623)) ([@tyrann0us](https://github.com/tyrann0us)).
| datasource | package | from | to | | ---------- | --------- | ------- | ------- | | npm | stylelint | 16.20.0 | 16.23.0 | ## [v16.23.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16230---2025-07-29) It adds 5 new rules, 1 option to a rule and fixes 3 bugs. We've turned on the new rules in our [standard config](https://www.npmjs.com/package/stylelint-config-standard). - Added: `block-no-redundant-nested-style-rules` rule ([#8684](stylelint/stylelint#8684)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `media-type-no-deprecated` rule ([#8668](stylelint/stylelint#8668)) ([@immitsu](https://github.com/immitsu)). - Added: `nesting-selector-no-missing-scoping-root` rule ([#8674](stylelint/stylelint#8674)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `no-invalid-position-declaration` rule ([#8669](stylelint/stylelint#8669)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `property-no-deprecated` rule ([#8682](stylelint/stylelint#8682)) ([@immitsu](https://github.com/immitsu)). - Added: `except: ["exact-value"]` to `media-feature-range-notation` ([#8675](stylelint/stylelint#8675)) ([@immitsu](https://github.com/immitsu)). - Fixed: `declaration-block-no-duplicate-properties` false negatives for named colors with `ignore: ['consecutive-duplicates-with-different-syntaxes']` ([#8665](stylelint/stylelint#8665)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Fixed: `function-no-unknown` false positives ([#8677](stylelint/stylelint#8677)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `no-irregular-whitespace` false positives for strings ([#8667](stylelint/stylelint#8667)) ([@immitsu](https://github.com/immitsu)). ## [v16.22.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16220---2025-07-18) It adds 3 rule features and fixes 2 bugs. - Added: `messageArgs` to `color-named` ([#8663](stylelint/stylelint#8663)) ([@Mouvedia](https://github.com/Mouvedia)). - Added: `messageArgs` to `declaration-property-value-keyword-no-deprecated` ([#8654](stylelint/stylelint#8654)) ([@Mouvedia](https://github.com/Mouvedia)). - Added: `no-descending-specificity` report message includes line number of the anchoring selector ([#8666](stylelint/stylelint#8666)) ([@immitsu](https://github.com/immitsu)). - Fixed: `at-rule-no-deprecated` false positives for `@apply` ([#8630](stylelint/stylelint#8630)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `lightness-notation` crash with `"number"` option and single-digit percentage ([#8661](stylelint/stylelint#8661)) ([@ybiquitous](https://github.com/ybiquitous)). ## [v16.21.1](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16211---2025-07-03) It fixes 3 bugs. - Fixed: unexpected change of syntax in computed `EditInfo` ([#8638](stylelint/stylelint#8638)) ([@romainmenke](https://github.com/romainmenke)). - Fixed: `function-linear-gradient-no-nonstandard-direction` false positives for CSS variables' names containing a direction substring ([#8643](stylelint/stylelint#8643)) ([@Solomon-mithra](https://github.com/Solomon-mithra)). - Fixed: `media-feature-range-notation` autofix for exact values ([#8651](stylelint/stylelint#8651)) ([@romainmenke](https://github.com/romainmenke)). ## [v16.21.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16210---2025-06-19) It rounds out the `message` secondary option and marks it as stable, adds 1 new option to a rule, and fixes 4 bugs. - Added: non-experimental support for functional `message` secondary option ([#8595](stylelint/stylelint#8595)) ([@ybiquitous](https://github.com/ybiquitous)). - Added: `ignore: ["after-custom-property"]` to `custom-property-empty-line-before` ([#8627](stylelint/stylelint#8627)) ([@imkesin](https://github.com/imkesin)). - Fixed: `cache` configuration property not being respected ([#8599](stylelint/stylelint#8599)) ([@ybiquitous](https://github.com/ybiquitous)). - Fixed: `fastest-levenshtein` import when bundling ([#8621](stylelint/stylelint#8621)) ([@onigoetz](https://github.com/onigoetz)). - Fixed: `named-grid-areas-no-invalid` false positives for interpolated grid-template-areas in CSS-in-JS ([#8606](stylelint/stylelint#8606)) ([@shahana308](https://github.com/shahana308)). - Fixed: `selector-pseudo-*-no-unknown` false positives for the missing form control styling selectors ([#8623](stylelint/stylelint#8623)) ([@tyrann0us](https://github.com/tyrann0us)).
| datasource | package | from | to | | ---------- | --------- | ------- | ------- | | npm | stylelint | 16.20.0 | 16.23.0 | ## [v16.23.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16230---2025-07-29) It adds 5 new rules, 1 option to a rule and fixes 3 bugs. We've turned on the new rules in our [standard config](https://www.npmjs.com/package/stylelint-config-standard). - Added: `block-no-redundant-nested-style-rules` rule ([#8684](stylelint/stylelint#8684)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `media-type-no-deprecated` rule ([#8668](stylelint/stylelint#8668)) ([@immitsu](https://github.com/immitsu)). - Added: `nesting-selector-no-missing-scoping-root` rule ([#8674](stylelint/stylelint#8674)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `no-invalid-position-declaration` rule ([#8669](stylelint/stylelint#8669)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `property-no-deprecated` rule ([#8682](stylelint/stylelint#8682)) ([@immitsu](https://github.com/immitsu)). - Added: `except: ["exact-value"]` to `media-feature-range-notation` ([#8675](stylelint/stylelint#8675)) ([@immitsu](https://github.com/immitsu)). - Fixed: `declaration-block-no-duplicate-properties` false negatives for named colors with `ignore: ['consecutive-duplicates-with-different-syntaxes']` ([#8665](stylelint/stylelint#8665)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Fixed: `function-no-unknown` false positives ([#8677](stylelint/stylelint#8677)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `no-irregular-whitespace` false positives for strings ([#8667](stylelint/stylelint#8667)) ([@immitsu](https://github.com/immitsu)). ## [v16.22.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16220---2025-07-18) It adds 3 rule features and fixes 2 bugs. - Added: `messageArgs` to `color-named` ([#8663](stylelint/stylelint#8663)) ([@Mouvedia](https://github.com/Mouvedia)). - Added: `messageArgs` to `declaration-property-value-keyword-no-deprecated` ([#8654](stylelint/stylelint#8654)) ([@Mouvedia](https://github.com/Mouvedia)). - Added: `no-descending-specificity` report message includes line number of the anchoring selector ([#8666](stylelint/stylelint#8666)) ([@immitsu](https://github.com/immitsu)). - Fixed: `at-rule-no-deprecated` false positives for `@apply` ([#8630](stylelint/stylelint#8630)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `lightness-notation` crash with `"number"` option and single-digit percentage ([#8661](stylelint/stylelint#8661)) ([@ybiquitous](https://github.com/ybiquitous)). ## [v16.21.1](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16211---2025-07-03) It fixes 3 bugs. - Fixed: unexpected change of syntax in computed `EditInfo` ([#8638](stylelint/stylelint#8638)) ([@romainmenke](https://github.com/romainmenke)). - Fixed: `function-linear-gradient-no-nonstandard-direction` false positives for CSS variables' names containing a direction substring ([#8643](stylelint/stylelint#8643)) ([@Solomon-mithra](https://github.com/Solomon-mithra)). - Fixed: `media-feature-range-notation` autofix for exact values ([#8651](stylelint/stylelint#8651)) ([@romainmenke](https://github.com/romainmenke)). ## [v16.21.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16210---2025-06-19) It rounds out the `message` secondary option and marks it as stable, adds 1 new option to a rule, and fixes 4 bugs. - Added: non-experimental support for functional `message` secondary option ([#8595](stylelint/stylelint#8595)) ([@ybiquitous](https://github.com/ybiquitous)). - Added: `ignore: ["after-custom-property"]` to `custom-property-empty-line-before` ([#8627](stylelint/stylelint#8627)) ([@imkesin](https://github.com/imkesin)). - Fixed: `cache` configuration property not being respected ([#8599](stylelint/stylelint#8599)) ([@ybiquitous](https://github.com/ybiquitous)). - Fixed: `fastest-levenshtein` import when bundling ([#8621](stylelint/stylelint#8621)) ([@onigoetz](https://github.com/onigoetz)). - Fixed: `named-grid-areas-no-invalid` false positives for interpolated grid-template-areas in CSS-in-JS ([#8606](stylelint/stylelint#8606)) ([@shahana308](https://github.com/shahana308)). - Fixed: `selector-pseudo-*-no-unknown` false positives for the missing form control styling selectors ([#8623](stylelint/stylelint#8623)) ([@tyrann0us](https://github.com/tyrann0us)).
| datasource | package | from | to | | ---------- | --------- | ------- | ------- | | npm | stylelint | 16.20.0 | 16.23.1 | ## [v16.23.1](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16231---2025-08-07) It fixes 7 bugs. - Fixed: `no-invalid-position-declaration` false positives for embedded styles ([#8701](stylelint/stylelint#8701)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Fixed: `property-no-deprecated` erroneously autofixing `clip` ([#8699](stylelint/stylelint#8699)) ([@immitsu](https://github.com/immitsu)). - Fixed: `property-no-deprecated` false positives for `-webkit-box-orient: vertical;` ([#8699](stylelint/stylelint#8699)) ([@immitsu](https://github.com/immitsu)). - Fixed: `selector-pseudo-*-no-unknown` false positives for some meter pseudo classes/elements ([#8708](stylelint/stylelint#8708)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `selector-pseudo-class-no-unknown` false positives for `:unchecked` ([#8705](stylelint/stylelint#8705)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `selector-pseudo-element-no-unknown` false positives for `::search-text` ([#8707](stylelint/stylelint#8707)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `selector-type-no-unknown` false positives for `selectedcontent` ([#8716](stylelint/stylelint#8716)) ([@Mouvedia](https://github.com/Mouvedia)). ## [v16.23.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16230---2025-07-29) It adds 5 new rules, 1 option to a rule and fixes 3 bugs. We've turned on the new rules in our [standard config](https://www.npmjs.com/package/stylelint-config-standard). - Added: `block-no-redundant-nested-style-rules` rule ([#8684](stylelint/stylelint#8684)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `media-type-no-deprecated` rule ([#8668](stylelint/stylelint#8668)) ([@immitsu](https://github.com/immitsu)). - Added: `nesting-selector-no-missing-scoping-root` rule ([#8674](stylelint/stylelint#8674)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `no-invalid-position-declaration` rule ([#8669](stylelint/stylelint#8669)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Added: `property-no-deprecated` rule ([#8682](stylelint/stylelint#8682)) ([@immitsu](https://github.com/immitsu)). - Added: `except: ["exact-value"]` to `media-feature-range-notation` ([#8675](stylelint/stylelint#8675)) ([@immitsu](https://github.com/immitsu)). - Fixed: `declaration-block-no-duplicate-properties` false negatives for named colors with `ignore: ['consecutive-duplicates-with-different-syntaxes']` ([#8665](stylelint/stylelint#8665)) ([@sw1tch3roo](https://github.com/sw1tch3roo)). - Fixed: `function-no-unknown` false positives ([#8677](stylelint/stylelint#8677)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `no-irregular-whitespace` false positives for strings ([#8667](stylelint/stylelint#8667)) ([@immitsu](https://github.com/immitsu)). ## [v16.22.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16220---2025-07-18) It adds 3 rule features and fixes 2 bugs. - Added: `messageArgs` to `color-named` ([#8663](stylelint/stylelint#8663)) ([@Mouvedia](https://github.com/Mouvedia)). - Added: `messageArgs` to `declaration-property-value-keyword-no-deprecated` ([#8654](stylelint/stylelint#8654)) ([@Mouvedia](https://github.com/Mouvedia)). - Added: `no-descending-specificity` report message includes line number of the anchoring selector ([#8666](stylelint/stylelint#8666)) ([@immitsu](https://github.com/immitsu)). - Fixed: `at-rule-no-deprecated` false positives for `@apply` ([#8630](stylelint/stylelint#8630)) ([@Mouvedia](https://github.com/Mouvedia)). - Fixed: `lightness-notation` crash with `"number"` option and single-digit percentage ([#8661](stylelint/stylelint#8661)) ([@ybiquitous](https://github.com/ybiquitous)). ## [v16.21.1](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16211---2025-07-03) It fixes 3 bugs. - Fixed: unexpected change of syntax in computed `EditInfo` ([#8638](stylelint/stylelint#8638)) ([@romainmenke](https://github.com/romainmenke)). - Fixed: `function-linear-gradient-no-nonstandard-direction` false positives for CSS variables' names containing a direction substring ([#8643](stylelint/stylelint#8643)) ([@Solomon-mithra](https://github.com/Solomon-mithra)). - Fixed: `media-feature-range-notation` autofix for exact values ([#8651](stylelint/stylelint#8651)) ([@romainmenke](https://github.com/romainmenke)). ## [v16.21.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#16210---2025-06-19) It rounds out the `message` secondary option and marks it as stable, adds 1 new option to a rule, and fixes 4 bugs. - Added: non-experimental support for functional `message` secondary option ([#8595](stylelint/stylelint#8595)) ([@ybiquitous](https://github.com/ybiquitous)). - Added: `ignore: ["after-custom-property"]` to `custom-property-empty-line-before` ([#8627](stylelint/stylelint#8627)) ([@imkesin](https://github.com/imkesin)). - Fixed: `cache` configuration property not being respected ([#8599](stylelint/stylelint#8599)) ([@ybiquitous](https://github.com/ybiquitous)). - Fixed: `fastest-levenshtein` import when bundling ([#8621](stylelint/stylelint#8621)) ([@onigoetz](https://github.com/onigoetz)). - Fixed: `named-grid-areas-no-invalid` false positives for interpolated grid-template-areas in CSS-in-JS ([#8606](stylelint/stylelint#8606)) ([@shahana308](https://github.com/shahana308)). - Fixed: `selector-pseudo-*-no-unknown` false positives for the missing form control styling selectors ([#8623](stylelint/stylelint#8623)) ([@tyrann0us](https://github.com/tyrann0us)).
Closes #8535
This PR fixes a false negative where duplicate named colors were not being flagged when using
ignore: ['consecutive-duplicates-with-different-syntaxes'].The Problem:
Previously, this would not trigger a warning with ignore:
['consecutive-duplicates-with-different-syntaxes']because the rule incorrectly treated red and blue as having different syntaxes.The Solution:
Changes:
The fix ensures consistency with how other color formats are handled and prevents unintentional duplicate declarations.