diff --git a/.changeset/tasty-penguins-cheat.md b/.changeset/tasty-penguins-cheat.md new file mode 100644 index 000000000..cc52915e9 --- /dev/null +++ b/.changeset/tasty-penguins-cheat.md @@ -0,0 +1,5 @@ +--- +"eslint-plugin-regexp": minor +--- + +`prefer-w`: Add support for `v` flag diff --git a/lib/rules/prefer-w.ts b/lib/rules/prefer-w.ts index 6db0c7046..61097e369 100644 --- a/lib/rules/prefer-w.ts +++ b/lib/rules/prefer-w.ts @@ -16,7 +16,7 @@ import { CP_DIGIT_NINE, CP_LOW_LINE, } from "../utils" -import { Chars, toCharSet } from "regexp-ast-analysis" +import { Chars, toUnicodeSet } from "regexp-ast-analysis" import { mention } from "../utils/mention" function isSmallLetterRange(node: CharacterClassElement) { @@ -40,7 +40,7 @@ function isDigitRangeOrSet(node: CharacterClassElement) { (node.type === "CharacterClassRange" && node.min.value === CP_DIGIT_ZERO && node.max.value === CP_DIGIT_NINE) || - (node.type === "CharacterSet" && node.kind === "digit") + (node.type === "CharacterSet" && node.kind === "digit" && !node.negate) ) } @@ -73,14 +73,13 @@ export default createRule("prefer-w", { }: RegExpContext): RegExpVisitor.Handlers { return { onCharacterClassEnter(ccNode: CharacterClass) { - // FIXME: TS Error - // @ts-expect-error -- FIXME - const charSet = toCharSet(ccNode, flags) + const charSet = toUnicodeSet(ccNode, flags) let predefined: string | undefined = undefined - if (charSet.equals(Chars.word(flags))) { + const word = Chars.word(flags) + if (charSet.equals(word)) { predefined = "\\w" - } else if (charSet.equals(Chars.word(flags).negate())) { + } else if (charSet.equals(word.negate())) { predefined = "\\W" } diff --git a/tests/lib/rules/prefer-w.ts b/tests/lib/rules/prefer-w.ts index d7d03cf89..873ddd58f 100644 --- a/tests/lib/rules/prefer-w.ts +++ b/tests/lib/rules/prefer-w.ts @@ -3,13 +3,13 @@ import rule from "../../../lib/rules/prefer-w" const tester = new RuleTester({ parserOptions: { - ecmaVersion: 2020, + ecmaVersion: "latest", sourceType: "module", }, }) tester.run("prefer-w", rule as any, { - valid: ["/\\w/"], + valid: ["/\\w/", "/[\\Da-zA-Z_#]/", "/\\w/v", "/[\\Da-zA-Z_#]/v"], invalid: [ { code: "/[0-9a-zA-Z_]/", @@ -35,6 +35,20 @@ tester.run("prefer-w", rule as any, { }, ], }, + { + code: "/[\\da-zA-Z_#]/", + output: "/[\\w#]/", + errors: [ + "Unexpected character class ranges '[\\da-zA-Z_]'. Use '\\w' instead.", + ], + }, + { + code: "/[0-9a-z_[\\s&&\\p{ASCII}]]/iv", + output: "/[\\w[\\s&&\\p{ASCII}]]/iv", + errors: [ + "Unexpected character class ranges '[0-9a-z_]'. Use '\\w' instead.", + ], + }, { code: "/[0-9a-z_]/i", output: "/\\w/i",