From 1c6976e7c4c8f22180d2a6874704faf5afd68243 Mon Sep 17 00:00:00 2001 From: Romain Menke Date: Fri, 16 Jun 2023 18:44:47 +0200 Subject: [PATCH 1/3] Fix `selector-anb-no-unmatchable` performance --- .../selector-anb-no-unmatchable/index.js | 3 +++ lib/utils/hasANPlusBNotationPseudoClasses.js | 24 +++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 lib/utils/hasANPlusBNotationPseudoClasses.js diff --git a/lib/rules/selector-anb-no-unmatchable/index.js b/lib/rules/selector-anb-no-unmatchable/index.js index 8299c91813..0a78998b4f 100644 --- a/lib/rules/selector-anb-no-unmatchable/index.js +++ b/lib/rules/selector-anb-no-unmatchable/index.js @@ -10,6 +10,7 @@ const isStandardSyntaxRule = require('../../utils/isStandardSyntaxRule'); const report = require('../../utils/report'); const ruleMessages = require('../../utils/ruleMessages'); const validateOptions = require('../../utils/validateOptions'); +const hasANPlusBNotationPseudoClasses = require('../../utils/hasANPlusBNotationPseudoClasses'); const ruleName = 'selector-anb-no-unmatchable'; @@ -50,6 +51,8 @@ const rule = (primary) => { } ruleNode.selectors.forEach((selector) => { + if (!hasANPlusBNotationPseudoClasses(selector)) return; + let cssTreeSelector; try { diff --git a/lib/utils/hasANPlusBNotationPseudoClasses.js b/lib/utils/hasANPlusBNotationPseudoClasses.js new file mode 100644 index 0000000000..d3a5c7a29e --- /dev/null +++ b/lib/utils/hasANPlusBNotationPseudoClasses.js @@ -0,0 +1,24 @@ +'use strict'; + +const { + aNPlusBNotationPseudoClasses, + aNPlusBOfSNotationPseudoClasses, +} = require('../reference/selectors'); + +const HAS_A_N_PLUS_B_NOTATION_PSEUDO_CLASSES = new RegExp( + `\\b:(?:${[ + ...aNPlusBNotationPseudoClasses.values(), + ...aNPlusBOfSNotationPseudoClasses.values(), + ].join('|')})\\(`, + 'i', +); + +/** + * Check if a selector contains any pseudo class function that might contain an An+B notation + * + * @param {string} selector + * @returns {boolean} + */ +module.exports = function hasANPlusBNotationPseudoClasses(selector) { + return HAS_A_N_PLUS_B_NOTATION_PSEUDO_CLASSES.test(selector); +}; From 4d75a73e5fb854285f133aca6916968af25d90ab Mon Sep 17 00:00:00 2001 From: Romain Menke <11521496+romainmenke@users.noreply.github.com> Date: Sat, 17 Jun 2023 09:56:06 +0200 Subject: [PATCH 2/3] Update lib/utils/hasANPlusBNotationPseudoClasses.js Co-authored-by: Masafumi Koba <473530+ybiquitous@users.noreply.github.com> --- lib/utils/hasANPlusBNotationPseudoClasses.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/lib/utils/hasANPlusBNotationPseudoClasses.js b/lib/utils/hasANPlusBNotationPseudoClasses.js index d3a5c7a29e..41a367a59d 100644 --- a/lib/utils/hasANPlusBNotationPseudoClasses.js +++ b/lib/utils/hasANPlusBNotationPseudoClasses.js @@ -5,13 +5,11 @@ const { aNPlusBOfSNotationPseudoClasses, } = require('../reference/selectors'); -const HAS_A_N_PLUS_B_NOTATION_PSEUDO_CLASSES = new RegExp( - `\\b:(?:${[ - ...aNPlusBNotationPseudoClasses.values(), - ...aNPlusBOfSNotationPseudoClasses.values(), - ].join('|')})\\(`, - 'i', -); +const classes = [ + ...aNPlusBNotationPseudoClasses.values(), + ...aNPlusBOfSNotationPseudoClasses.values(), +].join('|'); +const HAS_A_N_PLUS_B_NOTATION_PSEUDO_CLASSES = new RegExp(`\\b:(?:${classes})\\(`, 'i'); /** * Check if a selector contains any pseudo class function that might contain an An+B notation From 81d4125d280adc2244d0cdc792c8420f557886e9 Mon Sep 17 00:00:00 2001 From: Romain Menke <11521496+romainmenke@users.noreply.github.com> Date: Sat, 17 Jun 2023 09:57:27 +0200 Subject: [PATCH 3/3] Create modern-numbers-impress.md --- .changeset/modern-numbers-impress.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/modern-numbers-impress.md diff --git a/.changeset/modern-numbers-impress.md b/.changeset/modern-numbers-impress.md new file mode 100644 index 0000000000..73de26dadb --- /dev/null +++ b/.changeset/modern-numbers-impress.md @@ -0,0 +1,5 @@ +--- +"stylelint": patch +--- + +Fixed: `selector-anb-no-unmatchable` performance