Skip to content

Commit 3caf514

Browse files
feat: no-regex-spaces support v flag (#17407)
* feat: `no-regex-spaces` support `v` flag * fix: to ignore from check if flag cannot be determined * Apply suggestions from code review Co-authored-by: Milos Djermanovic <[email protected]> --------- Co-authored-by: Milos Djermanovic <[email protected]>
1 parent b7fad2b commit 3caf514

2 files changed

Lines changed: 55 additions & 4 deletions

File tree

lib/rules/no-regex-spaces.js

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ module.exports = {
7777
let regExpAST;
7878

7979
try {
80-
regExpAST = regExpParser.parsePattern(pattern, 0, pattern.length, flags.includes("u"));
80+
regExpAST = regExpParser.parsePattern(pattern, 0, pattern.length, { unicode: flags.includes("u"), unicodeSets: flags.includes("v") });
8181
} catch {
8282

8383
// Ignore regular expressions with syntax errors
@@ -155,13 +155,28 @@ module.exports = {
155155
const regExpVar = astUtils.getVariableByName(scope, "RegExp");
156156
const shadowed = regExpVar && regExpVar.defs.length > 0;
157157
const patternNode = node.arguments[0];
158-
const flagsNode = node.arguments[1];
159158

160159
if (node.callee.type === "Identifier" && node.callee.name === "RegExp" && isString(patternNode) && !shadowed) {
161160
const pattern = patternNode.value;
162161
const rawPattern = patternNode.raw.slice(1, -1);
163162
const rawPatternStartRange = patternNode.range[0] + 1;
164-
const flags = isString(flagsNode) ? flagsNode.value : "";
163+
let flags;
164+
165+
if (node.arguments.length < 2) {
166+
167+
// It has no flags.
168+
flags = "";
169+
} else {
170+
const flagsNode = node.arguments[1];
171+
172+
if (isString(flagsNode)) {
173+
flags = flagsNode.value;
174+
} else {
175+
176+
// The flags cannot be determined.
177+
return;
178+
}
179+
}
165180

166181
checkRegex(
167182
node,

tests/lib/rules/no-regex-spaces.js

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,18 @@ ruleTester.run("no-regex-spaces", rule, {
6262
"var foo = new RegExp(' \\[ ');",
6363
"var foo = new RegExp(' \\[ \\] ');",
6464

65+
// ES2024
66+
{ code: "var foo = / {2}/v;", parserOptions: { ecmaVersion: 2024 } },
67+
{ code: "var foo = /[\\q{ }]/v;", parserOptions: { ecmaVersion: 2024 } },
68+
6569
// don't report invalid regex
6670
"var foo = new RegExp('[ ');",
67-
"var foo = new RegExp('{ ', 'u');"
71+
"var foo = new RegExp('{ ', 'u');",
72+
73+
// don't report if flags cannot be determined
74+
"new RegExp(' ', flags)",
75+
"new RegExp('[[abc] ]', flags + 'v')",
76+
"new RegExp('[[abc]\\\\q{ }]', flags + 'v')"
6877
],
6978

7079
invalid: [
@@ -371,6 +380,33 @@ ruleTester.run("no-regex-spaces", rule, {
371380
type: "NewExpression"
372381
}
373382
]
383+
},
384+
385+
// ES2024
386+
{
387+
code: "var foo = /[[ ] ] /v;",
388+
output: "var foo = /[[ ] ] {4}/v;",
389+
parserOptions: {
390+
ecmaVersion: 2024
391+
},
392+
errors: [
393+
{
394+
messageId: "multipleSpaces",
395+
data: { length: "4" },
396+
type: "Literal"
397+
}
398+
]
399+
},
400+
{
401+
code: "var foo = new RegExp('[[ ] ] ', 'v');",
402+
output: "var foo = new RegExp('[[ ] ] {4}', 'v');",
403+
errors: [
404+
{
405+
messageId: "multipleSpaces",
406+
data: { length: "4" },
407+
type: "NewExpression"
408+
}
409+
]
374410
}
375411
]
376412
});

0 commit comments

Comments
 (0)