Skip to content

Commit 041bd66

Browse files
prefer-w: Add support for v flag (#578)
* `prefer-w`: Add support for `v` flag * Use new `UnicodeSet` API * Create tasty-penguins-cheat.md --------- Co-authored-by: Yosuke Ota <[email protected]>
1 parent fb75351 commit 041bd66

File tree

3 files changed

+27
-9
lines changed

3 files changed

+27
-9
lines changed

.changeset/tasty-penguins-cheat.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"eslint-plugin-regexp": minor
3+
---
4+
5+
`prefer-w`: Add support for `v` flag

lib/rules/prefer-w.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
CP_DIGIT_NINE,
1717
CP_LOW_LINE,
1818
} from "../utils"
19-
import { Chars, toCharSet } from "regexp-ast-analysis"
19+
import { Chars, toUnicodeSet } from "regexp-ast-analysis"
2020
import { mention } from "../utils/mention"
2121

2222
function isSmallLetterRange(node: CharacterClassElement) {
@@ -40,7 +40,7 @@ function isDigitRangeOrSet(node: CharacterClassElement) {
4040
(node.type === "CharacterClassRange" &&
4141
node.min.value === CP_DIGIT_ZERO &&
4242
node.max.value === CP_DIGIT_NINE) ||
43-
(node.type === "CharacterSet" && node.kind === "digit")
43+
(node.type === "CharacterSet" && node.kind === "digit" && !node.negate)
4444
)
4545
}
4646

@@ -73,14 +73,13 @@ export default createRule("prefer-w", {
7373
}: RegExpContext): RegExpVisitor.Handlers {
7474
return {
7575
onCharacterClassEnter(ccNode: CharacterClass) {
76-
// FIXME: TS Error
77-
// @ts-expect-error -- FIXME
78-
const charSet = toCharSet(ccNode, flags)
76+
const charSet = toUnicodeSet(ccNode, flags)
7977

8078
let predefined: string | undefined = undefined
81-
if (charSet.equals(Chars.word(flags))) {
79+
const word = Chars.word(flags)
80+
if (charSet.equals(word)) {
8281
predefined = "\\w"
83-
} else if (charSet.equals(Chars.word(flags).negate())) {
82+
} else if (charSet.equals(word.negate())) {
8483
predefined = "\\W"
8584
}
8685

tests/lib/rules/prefer-w.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ import rule from "../../../lib/rules/prefer-w"
33

44
const tester = new RuleTester({
55
parserOptions: {
6-
ecmaVersion: 2020,
6+
ecmaVersion: "latest",
77
sourceType: "module",
88
},
99
})
1010

1111
tester.run("prefer-w", rule as any, {
12-
valid: ["/\\w/"],
12+
valid: ["/\\w/", "/[\\Da-zA-Z_#]/", "/\\w/v", "/[\\Da-zA-Z_#]/v"],
1313
invalid: [
1414
{
1515
code: "/[0-9a-zA-Z_]/",
@@ -35,6 +35,20 @@ tester.run("prefer-w", rule as any, {
3535
},
3636
],
3737
},
38+
{
39+
code: "/[\\da-zA-Z_#]/",
40+
output: "/[\\w#]/",
41+
errors: [
42+
"Unexpected character class ranges '[\\da-zA-Z_]'. Use '\\w' instead.",
43+
],
44+
},
45+
{
46+
code: "/[0-9a-z_[\\s&&\\p{ASCII}]]/iv",
47+
output: "/[\\w[\\s&&\\p{ASCII}]]/iv",
48+
errors: [
49+
"Unexpected character class ranges '[0-9a-z_]'. Use '\\w' instead.",
50+
],
51+
},
3852
{
3953
code: "/[0-9a-z_]/i",
4054
output: "/\\w/i",

0 commit comments

Comments
 (0)