Skip to content

Add ignoreSelectors: [] to no-duplicate-selectors#8883

Merged
jeddy3 merged 7 commits intostylelint:v17from
kovsu:fix-#8696
Dec 5, 2025
Merged

Add ignoreSelectors: [] to no-duplicate-selectors#8883
jeddy3 merged 7 commits intostylelint:v17from
kovsu:fix-#8696

Conversation

@kovsu
Copy link
Copy Markdown
Contributor

@kovsu kovsu commented Dec 4, 2025

Which issue, if any, is this issue related to?

Closes #8696

Is there anything in the PR that needs further explanation?

No

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Dec 4, 2025

🦋 Changeset detected

Latest commit: 9818427

The changes in this PR will be included in the next version bump.

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

@ybiquitous ybiquitous linked an issue Dec 4, 2025 that may be closed by this pull request
Copy link
Copy Markdown
Member

@ybiquitous ybiquitous left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kovsu Thanks for the pull request. Can you check my reviews?

Comment thread lib/rules/no-duplicate-selectors/index.mjs
Comment thread lib/rules/no-duplicate-selectors/index.mjs
Comment thread lib/rules/no-duplicate-selectors/index.mjs
Comment thread lib/rules/no-duplicate-selectors/__tests__/index.mjs Outdated
@kovsu
Copy link
Copy Markdown
Contributor Author

kovsu commented Dec 4, 2025

[suggestion] Should we skip the process if flattenedNestedSelectors contains an ignored selector? I guess we should filter out the ignored ones in it, instead

Using .filter() would cause incorrect behavior:

const flattenedNestedSelectors = flattenNestedSelectorsForRule(ruleNode, result)
  .flatMap(({ resolvedSelectors }) => resolvedSelectors.nodes)
  .filter((selector) => !optionsMatches(secondaryOptions, 'ignoreSelectors', selector.toString()));
a, b {} 
/* -> `flattenedNestedSelectors`: [b] */

b, a {}
/* -> `flattenedNestedSelectors`: [b] */

This would incorrectly report a duplication error for b, a, even though both rules contain the ignored selector a.

Expected behavior:

When a rule contains any ignored selector, the entire rule should be skipped from duplicate checking. This is why I use hasIgnoredSelector to check if the rule contains any ignored selectors, and if so, skip processing that rule entirely.

@ybiquitous
Copy link
Copy Markdown
Member

Understood. Sorry for my wrong suggestions. 🙏🏼

@ybiquitous ybiquitous changed the title Add ignoreSelectors option to no-duplicate-selectors Add ignoreSelectors: [] to no-duplicate-selectors Dec 4, 2025
Copy link
Copy Markdown
Member

@ybiquitous ybiquitous left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, LGTM 👍🏼

@ybiquitous
Copy link
Copy Markdown
Member

@jeddy3 Can you take a look when you have time? 🙏🏼

Copy link
Copy Markdown
Member

@jeddy3 jeddy3 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kovsu Thank you for your second contribution!

It looks great.

I've requested some minor changes to follow our conventions for tests and docs. We've many of them, so we try to keep them consistent.

Some of the code in our older rules, like this one, is a bit behind our latest conventions, but we follow them for any new code we add.

Comment thread lib/rules/no-duplicate-selectors/__tests__/index.mjs Outdated
Comment thread lib/rules/no-duplicate-selectors/__tests__/index.mjs Outdated
Comment thread lib/rules/no-duplicate-selectors/README.md Outdated
Comment thread lib/rules/no-duplicate-selectors/README.md Outdated
Comment thread lib/rules/no-duplicate-selectors/README.md Outdated
Comment thread lib/rules/no-duplicate-selectors/README.md Outdated
Copy link
Copy Markdown
Member

@jeddy3 jeddy3 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thank you!

@jeddy3 jeddy3 merged commit 055c71e into stylelint:v17 Dec 5, 2025
14 checks passed
@kovsu kovsu deleted the fix-#8696 branch December 5, 2025 09:14
renovate Bot added a commit to andrei-picus-tink/auto-renovate that referenced this pull request Jan 15, 2026
| datasource | package   | from    | to     |
| ---------- | --------- | ------- | ------ |
| npm        | stylelint | 16.26.1 | 17.0.0 |


## [v17.0.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#1700---2026-01-15)

It contains 14 breaking changes, which we've detailed in the [migrating to `17.0.0` guide](docs/migration-guide/to-17.md). Additionally, it adds 3 options to the rules and fixes 9 bugs. We've also released compatible versions of our [shared config](https://www.npmjs.com/package/stylelint-config-standard), [Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=stylelint.vscode-stylelint), [Node.js Rule Tester](https://www.npmjs.com/package/stylelint-test-rule-node) and [Jest preset](https://www.npmjs.com/package/jest-preset-stylelint).

- Removed: CommonJS Node.js API ([#8859](stylelint/stylelint#8859)) ([@jeddy3](https://github.com/jeddy3)).
- Removed: `output` property in the Node.js API returned resolved object ([#8878](stylelint/stylelint#8878)) ([@jeddy3](https://github.com/jeddy3)).
- Removed: support for Node.js less than 20.19.0 ([#8867](stylelint/stylelint#8867)) ([@jeddy3](https://github.com/jeddy3)).
- Removed: GitHub formatter ([#8888](stylelint/stylelint#8888)) ([@jeddy3](https://github.com/jeddy3)).
- Removed: `resolveNestedSelectors` option from `selector-class-pattern` ([#8931](stylelint/stylelint#8931)) ([@jeddy3](https://github.com/jeddy3)).
- Removed: `checkContextFunctionalPseudoClasses` option from `selector-max-id` ([#8913](stylelint/stylelint#8913)) ([@jeddy3](https://github.com/jeddy3)).
- Changed: default `fix` mode to `strict` ([#8889](stylelint/stylelint#8889)) ([@jeddy3](https://github.com/jeddy3)).
- Changed: `report` to be consistent and predictable in how it handles the provided position arguments ([#8217](stylelint/stylelint#8217)) ([@romainmenke](https://github.com/romainmenke)).
- Changed: `selector-max-*` syntax rules for standard CSS nesting and modern functional pseudo-classes ([#8913](stylelint/stylelint#8913)) ([@jeddy3](https://github.com/jeddy3)).
- Changed: `*-specificity` semantic rules for standard CSS nesting ([#8913](stylelint/stylelint#8913)) ([@jeddy3](https://github.com/jeddy3)).
- Changed: `no-duplicate-selectors` and `selector-no-qualifying-type` for standard CSS nesting ([#8913](stylelint/stylelint#8913)) ([@jeddy3](https://github.com/jeddy3)).
- Changed: `*-list` rules to have consistent behaviour for vendor prefixes and case ([#8912](stylelint/stylelint#8912)) ([@jeddy3](https://github.com/jeddy3)).
- Changed: `*-no-vendor-prefix` rules to have consistent behaviour for their `ignore*: []` secondary options ([#8924](stylelint/stylelint#8924)) ([@jeddy3](https://github.com/jeddy3)).
- Changed: `declaration-property-max-values` rule to have consistent behaviour for vendor prefixes ([#8926](stylelint/stylelint#8926)) ([@jeddy3](https://github.com/jeddy3)).
- Added: `except: ["after-block"]` to `custom-property-empty-line-before` ([#8921](stylelint/stylelint#8921)) ([@kovsu](https://github.com/kovsu)).
- Added: `except: ["after-block"]` to `declaration-empty-line-before` ([#8910](stylelint/stylelint#8910)) ([@kovsu](https://github.com/kovsu)).
- Added: `ignoreSelectors: []` to `no-duplicate-selectors` ([#8883](stylelint/stylelint#8883)) ([@kovsu](https://github.com/kovsu)).
- Fixed: Windows drive letter casing inconsistencies when matching patterns against file paths ([#8941](stylelint/stylelint#8941)) ([@adalinesimonian](https://github.com/adalinesimonian)).
- Fixed: CLI help to include TypeScript config files ([#8908](stylelint/stylelint#8908)) ([@kovsu](https://github.com/kovsu)).
- Fixed: `at-rule-descriptor-no-unknown` false positives for declarations within feature-value-blocks ([#8868](stylelint/stylelint#8868)) ([@kovsu](https://github.com/kovsu)).
- Fixed: `declaration-block-no-redundant-longhand-properties` false negatives for short and long combinations ([#8892](stylelint/stylelint#8892)) ([@nathannewyen](https://github.com/nathannewyen)).
- Fixed: `media-feature-name-no-unknown` false positives for namespaced dollar variables and range context queries ([#8890](stylelint/stylelint#8890)) ([@kovsu](https://github.com/kovsu)).
- Fixed: `nesting-selector-no-missing-scoping-root` false positives for CSS-in-JS ([#8905](stylelint/stylelint#8905)) ([@kovsu](https://github.com/kovsu)).
- Fixed: `no-invalid-position-declaration` false negatives for embedded blocks ([#8907](stylelint/stylelint#8907)) ([@kovsu](https://github.com/kovsu)).
- Fixed: `selector-no-qualifying-type` false negatives for `:is/where()` ([#8940](stylelint/stylelint#8940)) ([@romainmenke](https://github.com/romainmenke)).
- Fixed: `selector-type-no-unknown` false positives for MathML 4 tags ([#8874](stylelint/stylelint#8874)) ([@jeddy3](https://github.com/jeddy3)).
renovate Bot added a commit to andrei-picus-tink/auto-renovate that referenced this pull request Jan 17, 2026
| datasource | package   | from    | to     |
| ---------- | --------- | ------- | ------ |
| npm        | stylelint | 16.26.1 | 17.0.0 |


## [v17.0.0](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#1700---2026-01-15)

It contains 14 breaking changes, which we've detailed in the [migrating to `17.0.0` guide](docs/migration-guide/to-17.md). Additionally, it adds 3 options to the rules and fixes 9 bugs. We've also released compatible versions of our [shared config](https://www.npmjs.com/package/stylelint-config-standard), [Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=stylelint.vscode-stylelint), [Node.js Rule Tester](https://www.npmjs.com/package/stylelint-test-rule-node) and [Jest preset](https://www.npmjs.com/package/jest-preset-stylelint).

- Removed: CommonJS Node.js API ([#8859](stylelint/stylelint#8859)) ([@jeddy3](https://github.com/jeddy3)).
- Removed: `output` property in the Node.js API returned resolved object ([#8878](stylelint/stylelint#8878)) ([@jeddy3](https://github.com/jeddy3)).
- Removed: support for Node.js less than 20.19.0 ([#8867](stylelint/stylelint#8867)) ([@jeddy3](https://github.com/jeddy3)).
- Removed: GitHub formatter ([#8888](stylelint/stylelint#8888)) ([@jeddy3](https://github.com/jeddy3)).
- Removed: `resolveNestedSelectors` option from `selector-class-pattern` ([#8931](stylelint/stylelint#8931)) ([@jeddy3](https://github.com/jeddy3)).
- Removed: `checkContextFunctionalPseudoClasses` option from `selector-max-id` ([#8913](stylelint/stylelint#8913)) ([@jeddy3](https://github.com/jeddy3)).
- Changed: default `fix` mode to `strict` ([#8889](stylelint/stylelint#8889)) ([@jeddy3](https://github.com/jeddy3)).
- Changed: `report` to be consistent and predictable in how it handles the provided position arguments ([#8217](stylelint/stylelint#8217)) ([@romainmenke](https://github.com/romainmenke)).
- Changed: `selector-max-*` syntax rules for standard CSS nesting and modern functional pseudo-classes ([#8913](stylelint/stylelint#8913)) ([@jeddy3](https://github.com/jeddy3)).
- Changed: `*-specificity` semantic rules for standard CSS nesting ([#8913](stylelint/stylelint#8913)) ([@jeddy3](https://github.com/jeddy3)).
- Changed: `no-duplicate-selectors` and `selector-no-qualifying-type` for standard CSS nesting ([#8913](stylelint/stylelint#8913)) ([@jeddy3](https://github.com/jeddy3)).
- Changed: `*-list` rules to have consistent behaviour for vendor prefixes and case ([#8912](stylelint/stylelint#8912)) ([@jeddy3](https://github.com/jeddy3)).
- Changed: `*-no-vendor-prefix` rules to have consistent behaviour for their `ignore*: []` secondary options ([#8924](stylelint/stylelint#8924)) ([@jeddy3](https://github.com/jeddy3)).
- Changed: `declaration-property-max-values` rule to have consistent behaviour for vendor prefixes ([#8926](stylelint/stylelint#8926)) ([@jeddy3](https://github.com/jeddy3)).
- Added: `except: ["after-block"]` to `custom-property-empty-line-before` ([#8921](stylelint/stylelint#8921)) ([@kovsu](https://github.com/kovsu)).
- Added: `except: ["after-block"]` to `declaration-empty-line-before` ([#8910](stylelint/stylelint#8910)) ([@kovsu](https://github.com/kovsu)).
- Added: `ignoreSelectors: []` to `no-duplicate-selectors` ([#8883](stylelint/stylelint#8883)) ([@kovsu](https://github.com/kovsu)).
- Fixed: Windows drive letter casing inconsistencies when matching patterns against file paths ([#8941](stylelint/stylelint#8941)) ([@adalinesimonian](https://github.com/adalinesimonian)).
- Fixed: CLI help to include TypeScript config files ([#8908](stylelint/stylelint#8908)) ([@kovsu](https://github.com/kovsu)).
- Fixed: `at-rule-descriptor-no-unknown` false positives for declarations within feature-value-blocks ([#8868](stylelint/stylelint#8868)) ([@kovsu](https://github.com/kovsu)).
- Fixed: `declaration-block-no-redundant-longhand-properties` false negatives for short and long combinations ([#8892](stylelint/stylelint#8892)) ([@nathannewyen](https://github.com/nathannewyen)).
- Fixed: `media-feature-name-no-unknown` false positives for namespaced dollar variables and range context queries ([#8890](stylelint/stylelint#8890)) ([@kovsu](https://github.com/kovsu)).
- Fixed: `nesting-selector-no-missing-scoping-root` false positives for CSS-in-JS ([#8905](stylelint/stylelint#8905)) ([@kovsu](https://github.com/kovsu)).
- Fixed: `no-invalid-position-declaration` false negatives for embedded blocks ([#8907](stylelint/stylelint#8907)) ([@kovsu](https://github.com/kovsu)).
- Fixed: `selector-no-qualifying-type` false negatives for `:is/where()` ([#8940](stylelint/stylelint#8940)) ([@romainmenke](https://github.com/romainmenke)).
- Fixed: `selector-type-no-unknown` false positives for MathML 4 tags ([#8874](stylelint/stylelint#8874)) ([@jeddy3](https://github.com/jeddy3)).
robbevp pushed a commit to robbevp/website-robbevanpetegem that referenced this pull request Jan 20, 2026
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [stylelint](https://stylelint.io) ([source](https://github.com/stylelint/stylelint)) | devDependencies | major | [`^16.23.1` -> `^17.0.0`](https://renovatebot.com/diffs/npm/stylelint/16.26.1/17.0.0) |

---

### Release Notes

<details>
<summary>stylelint/stylelint (stylelint)</summary>

### [`v17.0.0`](https://github.com/stylelint/stylelint/blob/HEAD/CHANGELOG.md#1700---2026-01-15)

[Compare Source](stylelint/stylelint@16.26.1...17.0.0)

It contains 14 breaking changes, which we've detailed in the [migrating to `17.0.0` guide](docs/migration-guide/to-17.md). Additionally, it adds 3 options to the rules and fixes 9 bugs. We've also released compatible versions of our [shared config](https://www.npmjs.com/package/stylelint-config-standard), [Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=stylelint.vscode-stylelint), [Node.js Rule Tester](https://www.npmjs.com/package/stylelint-test-rule-node) and [Jest preset](https://www.npmjs.com/package/jest-preset-stylelint).

- Removed: CommonJS Node.js API ([#&#8203;8859](stylelint/stylelint#8859)) ([@&#8203;jeddy3](https://github.com/jeddy3)).
- Removed: `output` property in the Node.js API returned resolved object ([#&#8203;8878](stylelint/stylelint#8878)) ([@&#8203;jeddy3](https://github.com/jeddy3)).
- Removed: support for Node.js less than 20.19.0 ([#&#8203;8867](stylelint/stylelint#8867)) ([@&#8203;jeddy3](https://github.com/jeddy3)).
- Removed: GitHub formatter ([#&#8203;8888](stylelint/stylelint#8888)) ([@&#8203;jeddy3](https://github.com/jeddy3)).
- Removed: `resolveNestedSelectors` option from `selector-class-pattern` ([#&#8203;8931](stylelint/stylelint#8931)) ([@&#8203;jeddy3](https://github.com/jeddy3)).
- Removed: `checkContextFunctionalPseudoClasses` option from `selector-max-id` ([#&#8203;8913](stylelint/stylelint#8913)) ([@&#8203;jeddy3](https://github.com/jeddy3)).
- Changed: default `fix` mode to `strict` ([#&#8203;8889](stylelint/stylelint#8889)) ([@&#8203;jeddy3](https://github.com/jeddy3)).
- Changed: `report` to be consistent and predictable in how it handles the provided position arguments ([#&#8203;8217](stylelint/stylelint#8217)) ([@&#8203;romainmenke](https://github.com/romainmenke)).
- Changed: `selector-max-*` syntax rules for standard CSS nesting and modern functional pseudo-classes ([#&#8203;8913](stylelint/stylelint#8913)) ([@&#8203;jeddy3](https://github.com/jeddy3)).
- Changed: `*-specificity` semantic rules for standard CSS nesting ([#&#8203;8913](stylelint/stylelint#8913)) ([@&#8203;jeddy3](https://github.com/jeddy3)).
- Changed: `no-duplicate-selectors` and `selector-no-qualifying-type` for standard CSS nesting ([#&#8203;8913](stylelint/stylelint#8913)) ([@&#8203;jeddy3](https://github.com/jeddy3)).
- Changed: `*-list` rules to have consistent behaviour for vendor prefixes and case ([#&#8203;8912](stylelint/stylelint#8912)) ([@&#8203;jeddy3](https://github.com/jeddy3)).
- Changed: `*-no-vendor-prefix` rules to have consistent behaviour for their `ignore*: []` secondary options ([#&#8203;8924](stylelint/stylelint#8924)) ([@&#8203;jeddy3](https://github.com/jeddy3)).
- Changed: `declaration-property-max-values` rule to have consistent behaviour for vendor prefixes ([#&#8203;8926](stylelint/stylelint#8926)) ([@&#8203;jeddy3](https://github.com/jeddy3)).
- Added: `except: ["after-block"]` to `custom-property-empty-line-before` ([#&#8203;8921](stylelint/stylelint#8921)) ([@&#8203;kovsu](https://github.com/kovsu)).
- Added: `except: ["after-block"]` to `declaration-empty-line-before` ([#&#8203;8910](stylelint/stylelint#8910)) ([@&#8203;kovsu](https://github.com/kovsu)).
- Added: `ignoreSelectors: []` to `no-duplicate-selectors` ([#&#8203;8883](stylelint/stylelint#8883)) ([@&#8203;kovsu](https://github.com/kovsu)).
- Fixed: Windows drive letter casing inconsistencies when matching patterns against file paths ([#&#8203;8941](stylelint/stylelint#8941)) ([@&#8203;adalinesimonian](https://github.com/adalinesimonian)).
- Fixed: CLI help to include TypeScript config files ([#&#8203;8908](stylelint/stylelint#8908)) ([@&#8203;kovsu](https://github.com/kovsu)).
- Fixed: `at-rule-descriptor-no-unknown` false positives for declarations within feature-value-blocks ([#&#8203;8868](stylelint/stylelint#8868)) ([@&#8203;kovsu](https://github.com/kovsu)).
- Fixed: `declaration-block-no-redundant-longhand-properties` false negatives for short and long combinations ([#&#8203;8892](stylelint/stylelint#8892)) ([@&#8203;nathannewyen](https://github.com/nathannewyen)).
- Fixed: `media-feature-name-no-unknown` false positives for namespaced dollar variables and range context queries ([#&#8203;8890](stylelint/stylelint#8890)) ([@&#8203;kovsu](https://github.com/kovsu)).
- Fixed: `nesting-selector-no-missing-scoping-root` false positives for CSS-in-JS ([#&#8203;8905](stylelint/stylelint#8905)) ([@&#8203;kovsu](https://github.com/kovsu)).
- Fixed: `no-invalid-position-declaration` false negatives for embedded blocks ([#&#8203;8907](stylelint/stylelint#8907)) ([@&#8203;kovsu](https://github.com/kovsu)).
- Fixed: `selector-no-qualifying-type` false negatives for `:is/where()` ([#&#8203;8940](stylelint/stylelint#8940)) ([@&#8203;romainmenke](https://github.com/romainmenke)).
- Fixed: `selector-type-no-unknown` false positives for MathML 4 tags ([#&#8203;8874](stylelint/stylelint#8874)) ([@&#8203;jeddy3](https://github.com/jeddy3)).

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS42MS4wIiwidXBkYXRlZEluVmVyIjoiNDEuNjEuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Reviewed-on: https://git.robbevp.be/robbevp/website-robbevanpetegem/pulls/504
Co-authored-by: Renovate Bot <renovate@robbevp.be>
Co-committed-by: Renovate Bot <renovate@robbevp.be>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

Add ignoreSelectors: [] to no-duplicate-selectors

3 participants