Skip to content

Commit 2a35f3e

Browse files
feat: prefer-named-capture-group support v flag (#17409)
* feat: `prefer-named-capture-group` support `v` flag * chore: add comment * Update lib/rules/prefer-named-capture-group.js Co-authored-by: Milos Djermanovic <[email protected]> --------- Co-authored-by: Milos Djermanovic <[email protected]>
1 parent 8ca8b50 commit 2a35f3e

2 files changed

Lines changed: 40 additions & 6 deletions

File tree

lib/rules/prefer-named-capture-group.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,14 +112,17 @@ module.exports = {
112112
* @param {string} pattern The regular expression pattern to be checked.
113113
* @param {ASTNode} node AST node which contains the regular expression or a call/new expression.
114114
* @param {ASTNode} regexNode AST node which contains the regular expression.
115-
* @param {boolean} uFlag Flag indicates whether unicode mode is enabled or not.
115+
* @param {string|null} flags The regular expression flags to be checked.
116116
* @returns {void}
117117
*/
118-
function checkRegex(pattern, node, regexNode, uFlag) {
118+
function checkRegex(pattern, node, regexNode, flags) {
119119
let ast;
120120

121121
try {
122-
ast = parser.parsePattern(pattern, 0, pattern.length, uFlag);
122+
ast = parser.parsePattern(pattern, 0, pattern.length, {
123+
unicode: Boolean(flags && flags.includes("u")),
124+
unicodeSets: Boolean(flags && flags.includes("v"))
125+
});
123126
} catch {
124127

125128
// ignore regex syntax errors
@@ -148,7 +151,7 @@ module.exports = {
148151
return {
149152
Literal(node) {
150153
if (node.regex) {
151-
checkRegex(node.regex.pattern, node, node, node.regex.flags.includes("u"));
154+
checkRegex(node.regex.pattern, node, node, node.regex.flags);
152155
}
153156
},
154157
Program(node) {
@@ -166,7 +169,7 @@ module.exports = {
166169
const flags = getStringIfConstant(refNode.arguments[1]);
167170

168171
if (regex) {
169-
checkRegex(regex, refNode, refNode.arguments[0], flags && flags.includes("u"));
172+
checkRegex(regex, refNode, refNode.arguments[0], flags);
170173
}
171174
}
172175
}

tests/lib/rules/prefer-named-capture-group.js

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,17 @@ ruleTester.run("prefer-named-capture-group", rule, {
7070
}
7171
`,
7272
env: { es2020: true }
73-
}
73+
},
74+
75+
// ES2024
76+
"new RegExp('(?<c>[[A--B]])', 'v')",
77+
78+
/*
79+
* This testcase checks if the rule understands the v flag correctly.
80+
* Without the v flag, `([\q])` is considered a valid regex and the rule reports,
81+
* but if the v flag is understood correctly the rule does not because of a syntax error.
82+
*/
83+
String.raw`new RegExp('([\\q])', 'v')` // SyntaxError
7484
],
7585

7686
invalid: [
@@ -591,6 +601,27 @@ ruleTester.run("prefer-named-capture-group", rule, {
591601
}
592602
]
593603
}]
604+
},
605+
606+
// ES2024
607+
{
608+
code: "new RegExp('([[A--B]])', 'v')",
609+
errors: [{
610+
messageId: "required",
611+
type: "NewExpression",
612+
data: { group: "([[A--B]])" },
613+
line: 1,
614+
column: 1,
615+
suggestions: [
616+
{
617+
messageId: "addGroupName",
618+
output: "new RegExp('(?<temp1>[[A--B]])', 'v')"
619+
},
620+
{
621+
messageId: "addNonCapture",
622+
output: "new RegExp('(?:[[A--B]])', 'v')"
623+
}]
624+
}]
594625
}
595626
]
596627
});

0 commit comments

Comments
 (0)