Skip to content

Commit 509f753

Browse files
authored
feat: no-misleading-character-class support v flag (#17406)
* feat: `no-misleading-character-class` support `v` flag * fix: lib/rules/utils/regular-expressions.js * fix: iterateCharacterSequence
1 parent 3caf514 commit 509f753

File tree

4 files changed

+29
-4
lines changed

4 files changed

+29
-4
lines changed

docs/src/rules/no-misleading-character-class.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ Examples of **correct** code for this rule:
7979

8080
/^[abc]$/
8181
/^[👍]$/u
82+
/^[\q{👶🏻}]$/v
8283
```
8384

8485
:::

lib/rules/no-misleading-character-class.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const { isValidWithUnicodeFlag } = require("./utils/regular-expressions");
1818
*
1919
* CharacterClassRange syntax can steal a part of character sequence,
2020
* so this function reverts CharacterClassRange syntax and restore the sequence.
21-
* @param {regexpp.AST.CharacterClassElement[]} nodes The node list to iterate character sequences.
21+
* @param {import('@eslint-community/regexpp').AST.CharacterClassElement[]} nodes The node list to iterate character sequences.
2222
* @returns {IterableIterator<number[]>} The list of character sequences.
2323
*/
2424
function *iterateCharacterSequence(nodes) {
@@ -37,6 +37,9 @@ function *iterateCharacterSequence(nodes) {
3737
break;
3838

3939
case "CharacterSet":
40+
case "CharacterClass": // [[]] nesting character class
41+
case "ClassStringDisjunction": // \q{...}
42+
case "ExpressionCharacterClass": // [A--B]
4043
if (seq.length > 0) {
4144
yield seq;
4245
seq = [];
@@ -144,7 +147,10 @@ module.exports = {
144147
pattern,
145148
0,
146149
pattern.length,
147-
flags.includes("u")
150+
{
151+
unicode: flags.includes("u"),
152+
unicodeSets: flags.includes("v")
153+
}
148154
);
149155
} catch {
150156

lib/rules/utils/regular-expressions.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ function isValidWithUnicodeFlag(ecmaVersion, pattern) {
2828
});
2929

3030
try {
31-
validator.validatePattern(pattern, void 0, void 0, /* uFlag = */ true);
31+
validator.validatePattern(pattern, void 0, void 0, { unicode: /* uFlag = */ true });
3232
} catch {
3333
return false;
3434
}

tests/lib/rules/no-misleading-character-class.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,14 @@ ruleTester.run("no-misleading-character-class", rule, {
7070
"var r = new RegExp('[Á] [ ');",
7171
"var r = RegExp('{ [Á]', 'u');",
7272
{ code: "var r = new globalThis.RegExp('[Á] [ ');", env: { es2020: true } },
73-
{ code: "var r = globalThis.RegExp('{ [Á]', 'u');", env: { es2020: true } }
73+
{ code: "var r = globalThis.RegExp('{ [Á]', 'u');", env: { es2020: true } },
74+
75+
// ES2024
76+
{ code: "var r = /[👍]/v", parserOptions: { ecmaVersion: 2024 } },
77+
{ code: String.raw`var r = /^[\q{👶🏻}]$/v`, parserOptions: { ecmaVersion: 2024 } },
78+
{ code: String.raw`var r = /[🇯\q{abc}🇵]/v`, parserOptions: { ecmaVersion: 2024 } },
79+
{ code: "var r = /[🇯[A]🇵]/v", parserOptions: { ecmaVersion: 2024 } },
80+
{ code: "var r = /[🇯[A--B]🇵]/v", parserOptions: { ecmaVersion: 2024 } }
7481
],
7582
invalid: [
7683

@@ -620,6 +627,17 @@ ruleTester.run("no-misleading-character-class", rule, {
620627
messageId: "zwj",
621628
suggestions: null
622629
}]
630+
},
631+
632+
633+
// ES2024
634+
{
635+
code: "var r = /[[👶🏻]]/v",
636+
parserOptions: { ecmaVersion: 2024 },
637+
errors: [{
638+
messageId: "emojiModifier",
639+
suggestions: null
640+
}]
623641
}
624642
]
625643
});

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy