Repository: ota-meshi/eslint-plugin-regexp
Pull request #599 (2023-09-13 17:43:14)

Update refa and RAA
Changes:
- I added a lot of functionality to `UnicodeSet`. We should now have an easier time adding support for the `v` flag, since `UnicodeSet` is a lot more similar to `CharSet` now. Also, bug fixes.
- Some minor bug fixes in RAA.

changeset-bot[bot]: ###  ⚠️  No Changeset found

Latest commit: 38f1d082fbe73e3e7527e2cc4ea170f95d94cd74

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. **If these changes should result in a version bump, you need to add a changeset.**

<details><summary>This PR includes no changesets</summary>

  When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

</details>

[Click here to learn what changesets are, and how to add one](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md).

[Click here if you're a maintainer who wants to add a changeset to this PR](https://github.com/ota-meshi/eslint-plugin-regexp/new/update-refa-and-raa?filename=.changeset/popular-socks-beg.md&value=---%0A%22eslint-plugin-regexp%22%3A%20patch%0A---%0A%0AUpdate%20refa%20and%20RAA%0A)



Patch:
diff --git a/.changeset/brown-dragons-dance.md b/.changeset/brown-dragons-dance.md
new file mode 100644
index 0000000..7191629
--- /dev/null
+++ b/.changeset/brown-dragons-dance.md
@@ -0,0 +1,5 @@
+---
+"eslint-plugin-regexp": minor
+---
+
+Add support for v flag to `regexp/no-non-standard-flag` rule
diff --git a/.changeset/clever-jobs-clap.md b/.changeset/clever-jobs-clap.md
new file mode 100644
index 0000000..add5f21
--- /dev/null
+++ b/.changeset/clever-jobs-clap.md
@@ -0,0 +1,5 @@
+---
+"eslint-plugin-regexp": minor
+---
+
+Improve `regexp/strict` rule to ignore patterns with v flag
diff --git a/.eslintrc.js b/.eslintrc.js
index 46673c0..9772c75 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -17,7 +17,7 @@ module.exports = {
         "plugin:regexp/recommended",
     ],
     rules: {
-        "require-jsdoc": "error",
+        "require-jsdoc": "off",
         "no-warning-comments": "warn",
         "no-lonely-if": "off",
         complexity: "off",
diff --git a/lib/rules/confusing-quantifier.ts b/lib/rules/confusing-quantifier.ts
index ce108e7..6af8a1b 100644
--- a/lib/rules/confusing-quantifier.ts
+++ b/lib/rules/confusing-quantifier.ts
@@ -24,9 +24,6 @@ export default createRule("confusing-quantifier", {
         type: "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             flags,
diff --git a/lib/rules/control-character-escape.ts b/lib/rules/control-character-escape.ts
index b324d10..c6f16f4 100644
--- a/lib/rules/control-character-escape.ts
+++ b/lib/rules/control-character-escape.ts
@@ -58,9 +58,6 @@ export default createRule("control-character-escape", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/hexadecimal-escape.ts b/lib/rules/hexadecimal-escape.ts
index 863d2cb..9908d03 100644
--- a/lib/rules/hexadecimal-escape.ts
+++ b/lib/rules/hexadecimal-escape.ts
@@ -32,9 +32,6 @@ export default createRule("hexadecimal-escape", {
     create(context) {
         const always = context.options[0] !== "never"
 
-        /**
-         * Verify for always
-         */
         function verifyForAlways(
             { node, getRegexpLocation, fixReplaceNode }: RegExpContext,
             kind: EscapeSequenceKind,
@@ -62,9 +59,6 @@ export default createRule("hexadecimal-escape", {
             })
         }
 
-        /**
-         * Verify for never
-         */
         function verifyForNever(
             { node, getRegexpLocation, fixReplaceNode }: RegExpContext,
             kind: EscapeSequenceKind,
@@ -86,9 +80,6 @@ export default createRule("hexadecimal-escape", {
 
         const verify = always ? verifyForAlways : verifyForNever
 
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/letter-case.ts b/lib/rules/letter-case.ts
index 87a8edb..67f1338 100644
--- a/lib/rules/letter-case.ts
+++ b/lib/rules/letter-case.ts
@@ -24,7 +24,6 @@ const DEFAULTS = {
     controlEscape: "uppercase" as const,
 }
 
-/** Parse option */
 function parseOptions(option?: {
     caseInsensitive?: Case
     unicodeEscape?: Case
@@ -89,9 +88,6 @@ export default createRule("letter-case", {
     create(context) {
         const options = parseOptions(context.options[0])
 
-        /**
-         * Report
-         */
         function report(
             { node, getRegexpLocation, fixReplaceNode }: RegExpContext,
             reportNode: CharacterClassRange | Character,
@@ -112,7 +108,6 @@ export default createRule("letter-case", {
             })
         }
 
-        /** Verify for Character in case insensitive */
         function verifyCharacterInCaseInsensitive(
             regexpContext: RegExpContext,
             cNode: Character,
@@ -135,7 +130,6 @@ export default createRule("letter-case", {
             )
         }
 
-        /** Verify for CharacterClassRange in case insensitive */
         function verifyCharacterClassRangeInCaseInsensitive(
             regexpContext: RegExpContext,
             ccrNode: CharacterClassRange,
@@ -166,7 +160,6 @@ export default createRule("letter-case", {
             )
         }
 
-        /** Verify for Character in unicode escape */
         function verifyCharacterInUnicodeEscape(
             regexpContext: RegExpContext,
             cNode: Character,
@@ -193,7 +186,6 @@ export default createRule("letter-case", {
             )
         }
 
-        /** Verify for Character in hexadecimal escape */
         function verifyCharacterInHexadecimalEscape(
             regexpContext: RegExpContext,
             cNode: Character,
@@ -217,7 +209,6 @@ export default createRule("letter-case", {
             )
         }
 
-        /** Verify for Character in control escape */
         function verifyCharacterInControl(
             regexpContext: RegExpContext,
             cNode: Character,
@@ -239,9 +230,6 @@ export default createRule("letter-case", {
             )
         }
 
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/match-any.ts b/lib/rules/match-any.ts
index a172552..6e694bd 100644
--- a/lib/rules/match-any.ts
+++ b/lib/rules/match-any.ts
@@ -129,9 +129,6 @@ export default createRule("match-any", {
             return range?.replace(fixer, preference) ?? null
         }
 
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/negation.ts b/lib/rules/negation.ts
index 7c3f7bb..2cd3aa5 100644
--- a/lib/rules/negation.ts
+++ b/lib/rules/negation.ts
@@ -23,9 +23,6 @@ export default createRule("negation", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             getRegexpLocation,
diff --git a/lib/rules/no-contradiction-with-assertion.ts b/lib/rules/no-contradiction-with-assertion.ts
index a65e282..8f71362 100644
--- a/lib/rules/no-contradiction-with-assertion.ts
+++ b/lib/rules/no-contradiction-with-assertion.ts
@@ -249,7 +249,6 @@ export default createRule("no-contradiction-with-assertion", {
         type: "problem",
     },
     create(context) {
-        /** Create visitor */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/no-control-character.ts b/lib/rules/no-control-character.ts
index ab4150b..6a5e68f 100644
--- a/lib/rules/no-control-character.ts
+++ b/lib/rules/no-control-character.ts
@@ -36,16 +36,12 @@ export default createRule("no-control-character", {
         hasSuggestions: true,
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
             const { node, patternSource, getRegexpLocation, fixReplaceNode } =
                 regexpContext
 
-            /** */
             function isBadEscapeRaw(raw: string, cp: number): boolean {
                 return (
                     raw.codePointAt(0)! === cp ||
@@ -54,7 +50,6 @@ export default createRule("no-control-character", {
                 )
             }
 
-            /** */
             function isAllowedEscapeRaw(raw: string): boolean {
                 return (
                     ALLOWED_CONTROL_CHARS.test(raw) ||
diff --git a/lib/rules/no-dupe-characters-character-class.ts b/lib/rules/no-dupe-characters-character-class.ts
index c0e8566..333af99 100644
--- a/lib/rules/no-dupe-characters-character-class.ts
+++ b/lib/rules/no-dupe-characters-character-class.ts
@@ -91,9 +91,6 @@ function groupElements(
         characterSets: [...characterSets.values()],
     }
 
-    /**
-     * Build key of range
-     */
     function buildRangeKey(rangeCharSet: CharSet) {
         return rangeCharSet.ranges
             .map((r) => String.fromCodePoint(r.min, r.max))
@@ -246,9 +243,6 @@ export default createRule("no-dupe-characters-character-class", {
             })
         }
 
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/no-dupe-disjunctions.ts b/lib/rules/no-dupe-disjunctions.ts
index 453051e..2c57809 100644
--- a/lib/rules/no-dupe-disjunctions.ts
+++ b/lib/rules/no-dupe-disjunctions.ts
@@ -281,9 +281,6 @@ function* iteratePartialAlternatives(
     }
 }
 
-/**
- * Unions all given NFAs
- */
 function unionAll(nfas: readonly ReadonlyNFA[]): ReadonlyNFA {
     if (nfas.length === 0) {
         throw new Error("Cannot union 0 NFAs.")
@@ -300,9 +297,6 @@ function unionAll(nfas: readonly ReadonlyNFA[]): ReadonlyNFA {
 
 const MAX_DFA_NODES = 100_000
 
-/**
- * Returns whether one NFA is a subset of another.
- */
 function isSubsetOf(
     superset: ReadonlyNFA,
     subset: ReadonlyNFA,
@@ -330,9 +324,6 @@ const enum SubsetRelation {
     unknown,
 }
 
-/**
- * Returns the subset relation
- */
 function getSubsetRelation(
     left: ReadonlyNFA,
     right: ReadonlyNFA,
@@ -832,14 +823,10 @@ function deduplicateResults(
     })
 }
 
-/**
- * Throws if called.
- */
 function assertNever(value: never): never {
     throw new Error(`Invalid value: ${value}`)
 }
 
-/** Mentions the given nested alternative. */
 function mentionNested(nested: NestedAlternative): string {
     if (nested.type === "Alternative") {
         return mention(nested)
@@ -963,9 +950,6 @@ export default createRule("no-dupe-disjunctions", {
 
         const allowedRanges = getAllowedCharRanges(undefined, context)
 
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
@@ -1135,7 +1119,6 @@ export default createRule("no-dupe-disjunctions", {
                 }
             }
 
-            /** Prints the given character. */
             function printChar(char: number): string {
                 if (inRange(allowedRanges, char)) {
                     return String.fromCodePoint(char)
@@ -1150,7 +1133,6 @@ export default createRule("no-dupe-disjunctions", {
                 return `\\u{${char.toString(16)}}`
             }
 
-            /** Returns suggestions for fixing the given report */
             function getSuggestions(
                 result: Result,
             ): Rule.SuggestionReportDescriptor[] {
@@ -1232,7 +1214,6 @@ export default createRule("no-dupe-disjunctions", {
                 ]
             }
 
-            /** Report the given result. */
             function reportResult(result: Result, { stared }: FilterInfo) {
                 let exp
                 if (stared === MaybeBool.true) {
diff --git a/lib/rules/no-empty-alternative.ts b/lib/rules/no-empty-alternative.ts
index a4441cf..008b56f 100644
--- a/lib/rules/no-empty-alternative.ts
+++ b/lib/rules/no-empty-alternative.ts
@@ -22,16 +22,10 @@ export default createRule("no-empty-alternative", {
         type: "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             getRegexpLocation,
         }: RegExpContext): RegExpVisitor.Handlers {
-            /**
-             * Verify alternatives
-             */
             function verifyAlternatives(
                 regexpNode: CapturingGroup | Group | Pattern,
             ) {
diff --git a/lib/rules/no-empty-capturing-group.ts b/lib/rules/no-empty-capturing-group.ts
index 8e1d8cc..92a565e 100644
--- a/lib/rules/no-empty-capturing-group.ts
+++ b/lib/rules/no-empty-capturing-group.ts
@@ -17,9 +17,6 @@ export default createRule("no-empty-capturing-group", {
         type: "suggestion",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             flags,
diff --git a/lib/rules/no-empty-character-class.ts b/lib/rules/no-empty-character-class.ts
index 1bbcf9c..4ecb959 100644
--- a/lib/rules/no-empty-character-class.ts
+++ b/lib/rules/no-empty-character-class.ts
@@ -18,9 +18,6 @@ export default createRule("no-empty-character-class", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/no-empty-group.ts b/lib/rules/no-empty-group.ts
index 4c34de1..29f33a4 100644
--- a/lib/rules/no-empty-group.ts
+++ b/lib/rules/no-empty-group.ts
@@ -17,9 +17,6 @@ export default createRule("no-empty-group", {
         type: "suggestion",
     },
     create(context) {
-        /**
-         * verify group node
-         */
         function verifyGroup(
             { node, getRegexpLocation }: RegExpContext,
             gNode: Group | CapturingGroup,
@@ -33,9 +30,6 @@ export default createRule("no-empty-group", {
             }
         }
 
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/no-empty-lookarounds-assertion.ts b/lib/rules/no-empty-lookarounds-assertion.ts
index 91305b7..aa92f32 100644
--- a/lib/rules/no-empty-lookarounds-assertion.ts
+++ b/lib/rules/no-empty-lookarounds-assertion.ts
@@ -19,9 +19,6 @@ export default createRule("no-empty-lookarounds-assertion", {
         type: "suggestion",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             flags,
diff --git a/lib/rules/no-escape-backspace.ts b/lib/rules/no-escape-backspace.ts
index 47dac01..88ed8a7 100644
--- a/lib/rules/no-escape-backspace.ts
+++ b/lib/rules/no-escape-backspace.ts
@@ -16,9 +16,6 @@ export default createRule("no-escape-backspace", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             getRegexpLocation,
diff --git a/lib/rules/no-extra-lookaround-assertions.ts b/lib/rules/no-extra-lookaround-assertions.ts
index 7eeaa24..e227929 100644
--- a/lib/rules/no-extra-lookaround-assertions.ts
+++ b/lib/rules/no-extra-lookaround-assertions.ts
@@ -21,9 +21,6 @@ export default createRule("no-extra-lookaround-assertions", {
         type: "suggestion",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
@@ -39,7 +36,6 @@ export default createRule("no-extra-lookaround-assertions", {
             }
         }
 
-        /** Verify for lookaround assertion */
         function verify(
             regexpContext: RegExpContext,
             assertion: LookaroundAssertion,
@@ -64,7 +60,6 @@ export default createRule("no-extra-lookaround-assertions", {
             }
         }
 
-        /** Report */
         function reportLookaroundAssertion(
             { node, getRegexpLocation, fixReplaceNode }: RegExpContext,
             assertion: LookaroundAssertion,
diff --git a/lib/rules/no-invalid-regexp.ts b/lib/rules/no-invalid-regexp.ts
index 58d6d8c..59099d3 100644
--- a/lib/rules/no-invalid-regexp.ts
+++ b/lib/rules/no-invalid-regexp.ts
@@ -28,7 +28,6 @@ export default createRule("no-invalid-regexp", {
         type: "problem",
     },
     create(context) {
-        /** Visit invalid regexes */
         function visitInvalid(regexpContext: RegExpContextForInvalid): void {
             const { node, error, patternSource } = regexpContext
 
diff --git a/lib/rules/no-invisible-character.ts b/lib/rules/no-invisible-character.ts
index 7617621..e556fe5 100644
--- a/lib/rules/no-invisible-character.ts
+++ b/lib/rules/no-invisible-character.ts
@@ -26,9 +26,6 @@ export default createRule("no-invisible-character", {
     create(context) {
         const sourceCode = context.getSourceCode()
 
-        /**
-         * Create visitor
-         */
         function createLiteralVisitor({
             node,
             flags,
diff --git a/lib/rules/no-lazy-ends.ts b/lib/rules/no-lazy-ends.ts
index fd8c929..2145ec2 100644
--- a/lib/rules/no-lazy-ends.ts
+++ b/lib/rules/no-lazy-ends.ts
@@ -4,9 +4,6 @@ import type { RegExpContext } from "../utils"
 import { createRule, defineRegexpVisitor } from "../utils"
 import { UsageOfPattern } from "../utils/get-usage-of-pattern"
 
-/**
- * Extract lazy end quantifiers
- */
 function* extractLazyEndQuantifiers(
     alternatives: Alternative[],
 ): IterableIterator<Quantifier> {
@@ -73,9 +70,6 @@ export default createRule("no-lazy-ends", {
     create(context) {
         const ignorePartial = context.options[0]?.ignorePartial ?? true
 
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             getRegexpLocation,
diff --git a/lib/rules/no-misleading-capturing-group.ts b/lib/rules/no-misleading-capturing-group.ts
index 99e8e65..340a531 100644
--- a/lib/rules/no-misleading-capturing-group.ts
+++ b/lib/rules/no-misleading-capturing-group.ts
@@ -27,9 +27,6 @@ import { joinEnglishList, mention } from "../utils/mention"
 import { getParser } from "../utils/regexp-ast"
 import { CharSet } from "refa"
 
-/**
- * Throws if called.
- */
 function assertNever(value: never): never {
     throw new Error(`Invalid value: ${value}`)
 }
@@ -109,9 +106,6 @@ function hasCapturingGroup(node: Node): boolean {
 type CharCache = WeakMap<Element | Alternative, CharSet>
 const caches = new WeakMap<ReadonlyFlags, CharCache>()
 
-/**
- * Returns a char cache for some given flags.
- */
 function getCache(flags: ReadonlyFlags): CharCache {
     let cache = caches.get(flags)
     if (cache === undefined) {
@@ -310,9 +304,6 @@ export default createRule("no-misleading-capturing-group", {
         const reportBacktrackingEnds =
             context.options[0]?.reportBacktrackingEnds ?? true
 
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/no-misleading-unicode-character.ts b/lib/rules/no-misleading-unicode-character.ts
index e85fbfc..136b659 100644
--- a/lib/rules/no-misleading-unicode-character.ts
+++ b/lib/rules/no-misleading-unicode-character.ts
@@ -203,7 +203,6 @@ export default createRule("no-misleading-unicode-character", {
     create(context) {
         const fixable = context.options[0]?.fixable ?? false
 
-        /** */
         function makeFix(
             fix: Rule.ReportFixer,
             messageId: string,
@@ -217,9 +216,6 @@ export default createRule("no-misleading-unicode-character", {
             }
         }
 
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/no-missing-g-flag.ts b/lib/rules/no-missing-g-flag.ts
index c2f506f..f25d8df 100644
--- a/lib/rules/no-missing-g-flag.ts
+++ b/lib/rules/no-missing-g-flag.ts
@@ -7,9 +7,6 @@ import {
 } from "../utils/ast-utils"
 import { createTypeTracker } from "../utils/type-tracker"
 
-/**
- * Parse option
- */
 function parseOption(
     userOption:
         | {
@@ -77,9 +74,6 @@ export default createRule("no-missing-g-flag", {
             }
         }
 
-        /**
-         * Verify RegExp reference
-         */
         function verifyExpressionReference(
             ref: ExpressionReference,
             {
@@ -121,7 +115,6 @@ export default createRule("no-missing-g-flag", {
                 fix: buildFixer(),
             })
 
-            /** Build fixer */
             function buildFixer() {
                 if (
                     node.arguments[0] !== regexpNode ||
diff --git a/lib/rules/no-non-standard-flag.ts b/lib/rules/no-non-standard-flag.ts
index 6db73a9..b353291 100644
--- a/lib/rules/no-non-standard-flag.ts
+++ b/lib/rules/no-non-standard-flag.ts
@@ -1,7 +1,7 @@
 import type { RegExpContext, UnparsableRegExpContext } from "../utils"
 import { createRule, defineRegexpVisitor } from "../utils"
 
-const STANDARD_FLAGS = "dgimsuy"
+const STANDARD_FLAGS = "dgimsuvy"
 
 export default createRule("no-non-standard-flag", {
     meta: {
diff --git a/lib/rules/no-obscure-range.ts b/lib/rules/no-obscure-range.ts
index 817c108..90ce6fd 100644
--- a/lib/rules/no-obscure-range.ts
+++ b/lib/rules/no-obscure-range.ts
@@ -43,9 +43,6 @@ export default createRule("no-obscure-range", {
             context,
         )
 
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             getRegexpLocation,
diff --git a/lib/rules/no-octal.ts b/lib/rules/no-octal.ts
index e2f1fd4..6f862bc 100644
--- a/lib/rules/no-octal.ts
+++ b/lib/rules/no-octal.ts
@@ -19,9 +19,6 @@ export default createRule("no-octal", {
         hasSuggestions: true,
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             fixReplaceNode,
diff --git a/lib/rules/no-optional-assertion.ts b/lib/rules/no-optional-assertion.ts
index 54ad3ec..d7636b4 100644
--- a/lib/rules/no-optional-assertion.ts
+++ b/lib/rules/no-optional-assertion.ts
@@ -87,9 +87,6 @@ export default createRule("no-optional-assertion", {
         type: "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             flags,
diff --git a/lib/rules/no-potentially-useless-backreference.ts b/lib/rules/no-potentially-useless-backreference.ts
index 2758bda..ed2f961 100644
--- a/lib/rules/no-potentially-useless-backreference.ts
+++ b/lib/rules/no-potentially-useless-backreference.ts
@@ -23,9 +23,6 @@ export default createRule("no-potentially-useless-backreference", {
         type: "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             flags,
diff --git a/lib/rules/no-standalone-backslash.ts b/lib/rules/no-standalone-backslash.ts
index 0fdbb09..b83588e 100644
--- a/lib/rules/no-standalone-backslash.ts
+++ b/lib/rules/no-standalone-backslash.ts
@@ -17,9 +17,6 @@ export default createRule("no-standalone-backslash", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             getRegexpLocation,
diff --git a/lib/rules/no-super-linear-backtracking.ts b/lib/rules/no-super-linear-backtracking.ts
index 3678976..2f60869 100644
--- a/lib/rules/no-super-linear-backtracking.ts
+++ b/lib/rules/no-super-linear-backtracking.ts
@@ -62,9 +62,6 @@ export default createRule("no-super-linear-backtracking", {
         const reportUncertain =
             (context.options[0]?.report ?? "certain") === "potential"
 
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/no-super-linear-move.ts b/lib/rules/no-super-linear-move.ts
index 9fb9181..bee3072 100644
--- a/lib/rules/no-super-linear-move.ts
+++ b/lib/rules/no-super-linear-move.ts
@@ -149,7 +149,6 @@ export default createRule("no-super-linear-move", {
         const ignoreSticky = context.options[0]?.ignoreSticky ?? false
         const ignorePartial = context.options[0]?.ignorePartial ?? true
 
-        /** Returns reports reported by scslre. */
         function getScslreReports(
             regexpContext: RegExpContext,
             assumeRejectingSuffix: boolean,
@@ -277,9 +276,6 @@ export default createRule("no-super-linear-move", {
             }
         }
 
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/no-trivially-nested-assertion.ts b/lib/rules/no-trivially-nested-assertion.ts
index 8b151a2..a9a9062 100644
--- a/lib/rules/no-trivially-nested-assertion.ts
+++ b/lib/rules/no-trivially-nested-assertion.ts
@@ -8,9 +8,6 @@ import type { RegExpContext } from "../utils"
 import { createRule, defineRegexpVisitor } from "../utils"
 import { hasSomeDescendant } from "regexp-ast-analysis"
 
-/**
- * Returns whether the given node is a lookaround.
- */
 function isLookaround(node: RegExpNode): node is LookaroundAssertion {
     return (
         node.type === "Assertion" &&
@@ -68,9 +65,6 @@ export default createRule("no-trivially-nested-assertion", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             fixReplaceNode,
diff --git a/lib/rules/no-trivially-nested-quantifier.ts b/lib/rules/no-trivially-nested-quantifier.ts
index ef924e2..b816b23 100644
--- a/lib/rules/no-trivially-nested-quantifier.ts
+++ b/lib/rules/no-trivially-nested-quantifier.ts
@@ -154,9 +154,6 @@ export default createRule("no-trivially-nested-quantifier", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             fixReplaceNode,
diff --git a/lib/rules/no-unused-capturing-group.ts b/lib/rules/no-unused-capturing-group.ts
index 231376e..1888b5c 100644
--- a/lib/rules/no-unused-capturing-group.ts
+++ b/lib/rules/no-unused-capturing-group.ts
@@ -46,9 +46,6 @@ export default createRule("no-unused-capturing-group", {
     create(context) {
         const fixable: boolean = context.options[0]?.fixable ?? false
 
-        /**
-         * Report for unused
-         */
         function reportUnused(
             unused: Set<CapturingGroup>,
             regexpContext: RegExpContext,
@@ -90,9 +87,6 @@ export default createRule("no-unused-capturing-group", {
             }
         }
 
-        /**
-         * Get all capturing group references
-         */
         function getCapturingGroupReferences(regexpContext: RegExpContext) {
             const capturingGroupReferences =
                 regexpContext.getCapturingGroupReferences()
@@ -148,9 +142,6 @@ export default createRule("no-unused-capturing-group", {
             }
         }
 
-        /**
-         * Create RegExp visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/no-useless-assertions.ts b/lib/rules/no-useless-assertions.ts
index b787784..1680c88 100644
--- a/lib/rules/no-useless-assertions.ts
+++ b/lib/rules/no-useless-assertions.ts
@@ -143,9 +143,6 @@ export default createRule("no-useless-assertions", {
         type: "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             flags,
@@ -153,7 +150,6 @@ export default createRule("no-useless-assertions", {
         }: RegExpContext): RegExpVisitor.Handlers {
             const reported = new Set<Assertion>()
 
-            /** Report */
             function report(
                 assertion: Assertion,
                 messageId: keyof typeof messages,
diff --git a/lib/rules/no-useless-backreference.ts b/lib/rules/no-useless-backreference.ts
index 0c7fe03..5d06039 100644
--- a/lib/rules/no-useless-backreference.ts
+++ b/lib/rules/no-useless-backreference.ts
@@ -107,9 +107,6 @@ export default createRule("no-useless-backreference", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             flags,
diff --git a/lib/rules/no-useless-character-class.ts b/lib/rules/no-useless-character-class.ts
index ae3da98..cdb23bb 100644
--- a/lib/rules/no-useless-character-class.ts
+++ b/lib/rules/no-useless-character-class.ts
@@ -35,9 +35,6 @@ export default createRule("no-useless-character-class", {
     create(context) {
         const ignores: string[] = context.options[0]?.ignores ?? ["="]
 
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             flags,
diff --git a/lib/rules/no-useless-dollar-replacements.ts b/lib/rules/no-useless-dollar-replacements.ts
index 72a5620..f9df4e8 100644
--- a/lib/rules/no-useless-dollar-replacements.ts
+++ b/lib/rules/no-useless-dollar-replacements.ts
@@ -44,7 +44,6 @@ export default createRule("no-useless-dollar-replacements", {
         const typeTracer = createTypeTracker(context)
         const sourceCode = context.getSourceCode()
 
-        /** Verify */
         function verify(
             patternNode: Pattern | RegExpLiteral,
             replacement: Literal,
diff --git a/lib/rules/no-useless-escape.ts b/lib/rules/no-useless-escape.ts
index 1045eee..779c99f 100644
--- a/lib/rules/no-useless-escape.ts
+++ b/lib/rules/no-useless-escape.ts
@@ -63,15 +63,11 @@ export default createRule("no-useless-escape", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             getRegexpLocation,
             fixReplaceNode,
         }: RegExpContext): RegExpVisitor.Handlers {
-            /** Report */
             function report(
                 cNode: Character,
                 offset: number,
diff --git a/lib/rules/no-useless-exactly-quantifier.ts b/lib/rules/no-useless-exactly-quantifier.ts
index 5d6487f..7a75378 100644
--- a/lib/rules/no-useless-exactly-quantifier.ts
+++ b/lib/rules/no-useless-exactly-quantifier.ts
@@ -18,9 +18,6 @@ export default createRule("no-useless-exactly-quantifier", {
         replacedBy: ["no-useless-quantifier", "no-zero-quantifier"],
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             getRegexpLocation,
diff --git a/lib/rules/no-useless-flag.ts b/lib/rules/no-useless-flag.ts
index 7c44d00..3441635 100644
--- a/lib/rules/no-useless-flag.ts
+++ b/lib/rules/no-useless-flag.ts
@@ -371,9 +371,6 @@ function createUselessGlobalFlagVisitor(
         return buildReportData(regExpReference)
     }
 
-    /**
-     * Build the report data.
-     */
     function buildReportData(regExpReference: RegExpReference) {
         const usedNodes = regExpReference.getUsedNodes()
         if (usedNodes.size === 1) {
@@ -464,9 +461,6 @@ function createUselessStickyFlagVisitor(
         return buildReportData(regExpReference)
     }
 
-    /**
-     * Build the report data.
-     */
     function buildReportData(regExpReference: RegExpReference) {
         const usedNodes = regExpReference.getUsedNodes()
         if (usedNodes.size === 1) {
@@ -765,9 +759,6 @@ function createOwnedRegExpFlagsVisitor(context: Rule.RuleContext) {
     })
 }
 
-/**
- * Parse option
- */
 function parseOption(
     userOption:
         | {
diff --git a/lib/rules/no-useless-lazy.ts b/lib/rules/no-useless-lazy.ts
index c42fe13..acf65d0 100644
--- a/lib/rules/no-useless-lazy.ts
+++ b/lib/rules/no-useless-lazy.ts
@@ -58,9 +58,6 @@ export default createRule("no-useless-lazy", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/no-useless-non-capturing-group.ts b/lib/rules/no-useless-non-capturing-group.ts
index f1a42de..ff7e5dc 100644
--- a/lib/rules/no-useless-non-capturing-group.ts
+++ b/lib/rules/no-useless-non-capturing-group.ts
@@ -61,9 +61,6 @@ export default createRule("no-useless-non-capturing-group", {
                 ? "never"
                 : context.options[0]?.allowTop ?? "partial"
 
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             getRegexpLocation,
diff --git a/lib/rules/no-useless-quantifier.ts b/lib/rules/no-useless-quantifier.ts
index b24f4f6..78060a8 100644
--- a/lib/rules/no-useless-quantifier.ts
+++ b/lib/rules/no-useless-quantifier.ts
@@ -29,9 +29,6 @@ export default createRule("no-useless-quantifier", {
         hasSuggestions: true,
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/no-useless-range.ts b/lib/rules/no-useless-range.ts
index a013272..8d959f9 100644
--- a/lib/rules/no-useless-range.ts
+++ b/lib/rules/no-useless-range.ts
@@ -18,9 +18,6 @@ export default createRule("no-useless-range", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             fixReplaceNode,
diff --git a/lib/rules/no-useless-two-nums-quantifier.ts b/lib/rules/no-useless-two-nums-quantifier.ts
index 0448dfc..09169fd 100644
--- a/lib/rules/no-useless-two-nums-quantifier.ts
+++ b/lib/rules/no-useless-two-nums-quantifier.ts
@@ -17,9 +17,6 @@ export default createRule("no-useless-two-nums-quantifier", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             getRegexpLocation,
diff --git a/lib/rules/no-zero-quantifier.ts b/lib/rules/no-zero-quantifier.ts
index 4a2a55f..c776dcc 100644
--- a/lib/rules/no-zero-quantifier.ts
+++ b/lib/rules/no-zero-quantifier.ts
@@ -25,9 +25,6 @@ export default createRule("no-zero-quantifier", {
         hasSuggestions: true,
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/optimal-lookaround-quantifier.ts b/lib/rules/optimal-lookaround-quantifier.ts
index ed26be4..cdb5ac8 100644
--- a/lib/rules/optimal-lookaround-quantifier.ts
+++ b/lib/rules/optimal-lookaround-quantifier.ts
@@ -74,9 +74,6 @@ export default createRule("optimal-lookaround-quantifier", {
         type: "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             getRegexpLocation,
diff --git a/lib/rules/optimal-quantifier-concatenation.ts b/lib/rules/optimal-quantifier-concatenation.ts
index 3e1edf4..4084a97 100644
--- a/lib/rules/optimal-quantifier-concatenation.ts
+++ b/lib/rules/optimal-quantifier-concatenation.ts
@@ -582,9 +582,6 @@ export default createRule("optimal-quantifier-concatenation", {
             context.options[0]?.capturingGroups ??
             CapturingGroupReporting.report
 
-        /**
-         * Creates a visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/prefer-character-class.ts b/lib/rules/prefer-character-class.ts
index 16bf94a..9a7c301 100644
--- a/lib/rules/prefer-character-class.ts
+++ b/lib/rules/prefer-character-class.ts
@@ -455,9 +455,6 @@ export default createRule("prefer-character-class", {
         const minCharacterAlternatives: number =
             context.options[0]?.minAlternatives ?? 3
 
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
@@ -492,7 +489,6 @@ export default createRule("prefer-character-class", {
                 return { start, end }
             }
 
-            // eslint-disable-next-line require-jsdoc -- X
             function process(n: NodeWithAlternatives): void {
                 if (n.alternatives.length < 2) {
                     // we need at least 2 alternatives with characters to make this work
diff --git a/lib/rules/prefer-d.ts b/lib/rules/prefer-d.ts
index 5e151c6..464e896 100644
--- a/lib/rules/prefer-d.ts
+++ b/lib/rules/prefer-d.ts
@@ -60,9 +60,6 @@ export default createRule("prefer-d", {
         const insideCharacterClass: "ignore" | "range" | "d" =
             context.options[0]?.insideCharacterClass ?? "d"
 
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             flags,
diff --git a/lib/rules/prefer-escape-replacement-dollar-char.ts b/lib/rules/prefer-escape-replacement-dollar-char.ts
index 4e1812c..1c92682 100644
--- a/lib/rules/prefer-escape-replacement-dollar-char.ts
+++ b/lib/rules/prefer-escape-replacement-dollar-char.ts
@@ -21,7 +21,6 @@ export default createRule("prefer-escape-replacement-dollar-char", {
         const typeTracer = createTypeTracker(context)
         const sourceCode = context.getSourceCode()
 
-        /** Verify */
         function verify(replacement: Literal) {
             for (const element of parseReplacements(context, replacement)) {
                 if (
diff --git a/lib/rules/prefer-lookaround.ts b/lib/rules/prefer-lookaround.ts
index 957df82..9fb75f8 100644
--- a/lib/rules/prefer-lookaround.ts
+++ b/lib/rules/prefer-lookaround.ts
@@ -224,9 +224,6 @@ type ParsedElements = {
     end: ParsedEndPattern | null
 }
 
-/**
- * Parse the elements of the pattern.
- */
 function parsePatternElements(
     node: Pattern,
     flags: ReadonlyFlags,
@@ -361,9 +358,6 @@ function leadingTrailingElementsToLookaroundAssertionPatternText(
     return leadingTrailingElements.map((e) => e.raw).join("")
 }
 
-/**
- * Parse option
- */
 function parseOption(
     userOption:
         | {
@@ -408,9 +402,6 @@ export default createRule("prefer-lookaround", {
         const { lookbehind, strictTypes } = parseOption(context.options[0])
         const typeTracer = createTypeTracker(context)
 
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
@@ -485,9 +476,6 @@ export default createRule("prefer-lookaround", {
             )
         }
 
-        /**
-         * Get the replace reference info from given call expression
-         */
         function getReplaceReferenceFromCallExpression(
             node: KnownMethodCall,
         ): ReplaceReferences | null {
@@ -511,9 +499,6 @@ export default createRule("prefer-lookaround", {
             )
         }
 
-        /**
-         * Get the replace reference info from given literal replacement argument
-         */
         function getReplaceReferenceFromLiteralReplacementArgument(
             node: Literal,
         ): ReplaceReferences | null {
@@ -545,9 +530,6 @@ export default createRule("prefer-lookaround", {
             }
         }
 
-        /**
-         * Get the replace reference info from given non-literal replacement argument
-         */
         function getReplaceReferenceFromNonLiteralReplacementArgument(
             node: Expression,
         ): ReplaceReferences | null {
@@ -587,9 +569,6 @@ export default createRule("prefer-lookaround", {
             }
         }
 
-        /**
-         * Create visitor for verify capturing groups
-         */
         function createVerifyVisitor(
             regexpContext: RegExpContext,
             parsedElements: ParsedElements,
@@ -624,7 +603,6 @@ export default createRule("prefer-lookaround", {
                         endRefState,
                     )
 
-                    /** Process state */
                     function processForState(
                         refName: string | number | undefined,
                         otherThanRefNames: Set<string | number>,
@@ -785,9 +763,6 @@ export default createRule("prefer-lookaround", {
             }
         }
 
-        /**
-         * Build fixer function
-         */
         function buildFixer(
             regexpContext: RegExpContext,
             replaceCapturingGroups: (ParsedStartPattern | ParsedEndPattern)[],
diff --git a/lib/rules/prefer-named-backreference.ts b/lib/rules/prefer-named-backreference.ts
index cb72b54..45661e1 100644
--- a/lib/rules/prefer-named-backreference.ts
+++ b/lib/rules/prefer-named-backreference.ts
@@ -17,9 +17,6 @@ export default createRule("prefer-named-backreference", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             fixReplaceNode,
diff --git a/lib/rules/prefer-named-capture-group.ts b/lib/rules/prefer-named-capture-group.ts
index da18426..ea29b4b 100644
--- a/lib/rules/prefer-named-capture-group.ts
+++ b/lib/rules/prefer-named-capture-group.ts
@@ -18,9 +18,6 @@ export default createRule("prefer-named-capture-group", {
         type: "suggestion",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/prefer-named-replacement.ts b/lib/rules/prefer-named-replacement.ts
index ce49589..aa51705 100644
--- a/lib/rules/prefer-named-replacement.ts
+++ b/lib/rules/prefer-named-replacement.ts
@@ -28,9 +28,6 @@ export default createRule("prefer-named-replacement", {
         const strictTypes = context.options[0]?.strictTypes ?? true
         const sourceCode = context.getSourceCode()
 
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/prefer-plus-quantifier.ts b/lib/rules/prefer-plus-quantifier.ts
index 85c44c3..2c6e655 100644
--- a/lib/rules/prefer-plus-quantifier.ts
+++ b/lib/rules/prefer-plus-quantifier.ts
@@ -17,9 +17,6 @@ export default createRule("prefer-plus-quantifier", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             getRegexpLocation,
diff --git a/lib/rules/prefer-predefined-assertion.ts b/lib/rules/prefer-predefined-assertion.ts
index f172d97..2c59de1 100644
--- a/lib/rules/prefer-predefined-assertion.ts
+++ b/lib/rules/prefer-predefined-assertion.ts
@@ -53,9 +53,6 @@ export default createRule("prefer-predefined-assertion", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/prefer-quantifier.ts b/lib/rules/prefer-quantifier.ts
index 6718e96..8ce5d59 100644
--- a/lib/rules/prefer-quantifier.ts
+++ b/lib/rules/prefer-quantifier.ts
@@ -113,9 +113,6 @@ export default createRule("prefer-quantifier", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             patternSource,
@@ -142,9 +139,6 @@ export default createRule("prefer-quantifier", {
 
                     validateBuffer(charBuffer)
 
-                    /**
-                     * Validate
-                     */
                     function validateBuffer(buffer: CharBuffer | null) {
                         if (!buffer || buffer.isValid()) {
                             return
diff --git a/lib/rules/prefer-question-quantifier.ts b/lib/rules/prefer-question-quantifier.ts
index 679d062..5ff6981 100644
--- a/lib/rules/prefer-question-quantifier.ts
+++ b/lib/rules/prefer-question-quantifier.ts
@@ -21,9 +21,6 @@ export default createRule("prefer-question-quantifier", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             getRegexpLocation,
diff --git a/lib/rules/prefer-range.ts b/lib/rules/prefer-range.ts
index d858216..ae045c4 100644
--- a/lib/rules/prefer-range.ts
+++ b/lib/rules/prefer-range.ts
@@ -49,9 +49,6 @@ export default createRule("prefer-range", {
             nodes: (Character | CharacterClassRange)[]
         }
 
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/prefer-result-array-groups.ts b/lib/rules/prefer-result-array-groups.ts
index 4f227ab..b90338a 100644
--- a/lib/rules/prefer-result-array-groups.ts
+++ b/lib/rules/prefer-result-array-groups.ts
@@ -39,9 +39,6 @@ export default createRule("prefer-result-array-groups", {
         const strictTypes = context.options[0]?.strictTypes ?? true
         const sourceCode = context.getSourceCode()
 
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/prefer-star-quantifier.ts b/lib/rules/prefer-star-quantifier.ts
index b854305..14d8d42 100644
--- a/lib/rules/prefer-star-quantifier.ts
+++ b/lib/rules/prefer-star-quantifier.ts
@@ -17,9 +17,6 @@ export default createRule("prefer-star-quantifier", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             getRegexpLocation,
diff --git a/lib/rules/prefer-t.ts b/lib/rules/prefer-t.ts
index c4cbbe7..2018522 100644
--- a/lib/rules/prefer-t.ts
+++ b/lib/rules/prefer-t.ts
@@ -20,9 +20,6 @@ export default createRule("prefer-t", {
         replacedBy: ["control-character-escape"],
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
             allows: string[],
diff --git a/lib/rules/prefer-unicode-codepoint-escapes.ts b/lib/rules/prefer-unicode-codepoint-escapes.ts
index bb6917c..c26f209 100644
--- a/lib/rules/prefer-unicode-codepoint-escapes.ts
+++ b/lib/rules/prefer-unicode-codepoint-escapes.ts
@@ -18,9 +18,6 @@ export default createRule("prefer-unicode-codepoint-escapes", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/prefer-w.ts b/lib/rules/prefer-w.ts
index 4f11b9e..6db0c70 100644
--- a/lib/rules/prefer-w.ts
+++ b/lib/rules/prefer-w.ts
@@ -19,10 +19,6 @@ import {
 import { Chars, toCharSet } from "regexp-ast-analysis"
 import { mention } from "../utils/mention"
 
-/**
- * Checks if small letter char class range
- * @param node The node to check
- */
 function isSmallLetterRange(node: CharacterClassElement) {
     return (
         node.type === "CharacterClassRange" &&
@@ -31,10 +27,6 @@ function isSmallLetterRange(node: CharacterClassElement) {
     )
 }
 
-/**
- * Checks if capital letter char class range
- * @param node The node to check
- */
 function isCapitalLetterRange(node: CharacterClassElement) {
     return (
         node.type === "CharacterClassRange" &&
@@ -43,10 +35,6 @@ function isCapitalLetterRange(node: CharacterClassElement) {
     )
 }
 
-/**
- * Checks if digit char class
- * @param node The node to check
- */
 function isDigitRangeOrSet(node: CharacterClassElement) {
     return (
         (node.type === "CharacterClassRange" &&
@@ -56,10 +44,6 @@ function isDigitRangeOrSet(node: CharacterClassElement) {
     )
 }
 
-/**
- * Checks if includes `_`
- * @param node The node to check
- */
 function isUnderscoreCharacter(node: CharacterClassElement) {
     return node.type === "Character" && node.value === CP_LOW_LINE
 }
@@ -80,9 +64,6 @@ export default createRule("prefer-w", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             flags,
diff --git a/lib/rules/require-unicode-regexp.ts b/lib/rules/require-unicode-regexp.ts
index 52a5ebd..5f7e7db 100644
--- a/lib/rules/require-unicode-regexp.ts
+++ b/lib/rules/require-unicode-regexp.ts
@@ -336,9 +336,6 @@ export default createRule("require-unicode-regexp", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/sort-alternatives.ts b/lib/rules/sort-alternatives.ts
index a67cd74..ec35b09 100644
--- a/lib/rules/sort-alternatives.ts
+++ b/lib/rules/sort-alternatives.ts
@@ -43,7 +43,6 @@ interface AllowedChars {
 }
 const cache = new Map<string, Readonly<AllowedChars>>()
 
-/** */
 function getAllowedChars(flags: ReadonlyFlags) {
     assertValidFlags(flags)
     const cacheKey = (flags.ignoreCase ? "i" : "") + (flags.unicode ? "u" : "")
@@ -536,9 +535,6 @@ export default createRule("sort-alternatives", {
     create(context) {
         const sliceMinLength = 3
 
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
@@ -639,7 +635,6 @@ export default createRule("sort-alternatives", {
                 })
             }
 
-            /** The handler for parents */
             function onParent(parent: Alternative["parent"]): void {
                 if (parent.alternatives.length < 2) {
                     return
diff --git a/lib/rules/sort-character-class-elements.ts b/lib/rules/sort-character-class-elements.ts
index 11b423f..ae2b515 100644
--- a/lib/rules/sort-character-class-elements.ts
+++ b/lib/rules/sort-character-class-elements.ts
@@ -82,9 +82,6 @@ export default createRule("sort-character-class-elements", {
             orderOption[o] = i + 1
         })
 
-        /**
-         * Create visitor
-         */
         function createVisitor({
             node,
             getRegexpLocation,
diff --git a/lib/rules/sort-flags.ts b/lib/rules/sort-flags.ts
index e565900..f704f39 100644
--- a/lib/rules/sort-flags.ts
+++ b/lib/rules/sort-flags.ts
@@ -17,16 +17,12 @@ export default createRule("sort-flags", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Sort regexp flags
-         */
         function sortFlags(flagsStr: string): string {
             return [...flagsStr]
                 .sort((a, b) => a.codePointAt(0)! - b.codePointAt(0)!)
                 .join("")
         }
 
-        /** The logic of this rule */
         function visit({
             regexpNode,
             flagsString,
diff --git a/lib/rules/strict.ts b/lib/rules/strict.ts
index c0cc161..0b742d5 100644
--- a/lib/rules/strict.ts
+++ b/lib/rules/strict.ts
@@ -79,16 +79,13 @@ export default createRule("strict", {
         hasSuggestions: true,
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
             const { node, flags, pattern, getRegexpLocation, fixReplaceNode } =
                 regexpContext
 
-            if (flags.unicode) {
+            if (flags.unicode || flags.unicodeSets) {
                 // the Unicode flag enables strict parsing mode automatically
                 return {}
             }
@@ -96,7 +93,6 @@ export default createRule("strict", {
             let reported = false
             let hasNamedBackreference = false
 
-            /** Report */
             function report(
                 messageId: string,
                 element: Element,
diff --git a/lib/rules/unicode-escape.ts b/lib/rules/unicode-escape.ts
index 9d98dab..adf8389 100644
--- a/lib/rules/unicode-escape.ts
+++ b/lib/rules/unicode-escape.ts
@@ -34,9 +34,6 @@ export default createRule("unicode-escape", {
         const preferUnicodeCodePointEscape =
             context.options[0] !== "unicodeEscape"
 
-        /**
-         * Verify for unicodeCodePointEscape
-         */
         function verifyForUnicodeCodePointEscape(
             { node, getRegexpLocation, fixReplaceNode }: RegExpContext,
             kind: EscapeSequenceKind,
@@ -60,9 +57,6 @@ export default createRule("unicode-escape", {
             })
         }
 
-        /**
-         * Verify for unicodeEscape
-         */
         function verifyForUnicodeEscape(
             { node, getRegexpLocation, fixReplaceNode }: RegExpContext,
             kind: EscapeSequenceKind,
@@ -90,9 +84,6 @@ export default createRule("unicode-escape", {
             ? verifyForUnicodeCodePointEscape
             : verifyForUnicodeEscape
 
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/rules/use-ignore-case.ts b/lib/rules/use-ignore-case.ts
index b6be84d..5375845 100644
--- a/lib/rules/use-ignore-case.ts
+++ b/lib/rules/use-ignore-case.ts
@@ -130,9 +130,6 @@ export default createRule("use-ignore-case", {
         type: "suggestion",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
         function createVisitor(
             regexpContext: RegExpContext,
         ): RegExpVisitor.Handlers {
diff --git a/lib/utils/ast-utils/extract-property-references.ts b/lib/utils/ast-utils/extract-property-references.ts
index a6d794f..4b00fc0 100644
--- a/lib/utils/ast-utils/extract-property-references.ts
+++ b/lib/utils/ast-utils/extract-property-references.ts
@@ -291,9 +291,6 @@ function* iteratePropertyReferencesForShallowCopy(
     }
 }
 
-/**
- * Get property from given node
- */
 function getProperty(
     node: MemberExpression | Property,
     context: Rule.RuleContext,
diff --git a/lib/utils/ast-utils/utils.ts b/lib/utils/ast-utils/utils.ts
index 3639015..b0f6036 100644
--- a/lib/utils/ast-utils/utils.ts
+++ b/lib/utils/ast-utils/utils.ts
@@ -179,9 +179,6 @@ export function getScope(
     return scopeManager.scopes[0]
 }
 
-/**
- * Find function node
- */
 export function findFunction(
     context: Rule.RuleContext,
     id: Identifier,
diff --git a/lib/utils/index.ts b/lib/utils/index.ts
index 1451190..a550d6c 100644
--- a/lib/utils/index.ts
+++ b/lib/utils/index.ts
@@ -296,7 +296,6 @@ export function defineRegexpVisitor(
     return visitor
 }
 
-/** Build RegExp visitor */
 function buildRegexpVisitor(
     context: Rule.RuleContext,
     rules: RegexpRule[],
diff --git a/lib/utils/partial-parser.ts b/lib/utils/partial-parser.ts
index ed1428a..a5e2531 100644
--- a/lib/utils/partial-parser.ts
+++ b/lib/utils/partial-parser.ts
@@ -10,9 +10,6 @@ import type { AST } from "@eslint-community/regexpp"
 
 export type NestedAlternative = AST.Alternative | AST.CharacterClassElement
 
-/**
- * Throws if called.
- */
 function assertNever(value: never): never {
     throw new Error(`Invalid value: ${value}`)
 }
diff --git a/lib/utils/regexp-ast/is-covered.ts b/lib/utils/regexp-ast/is-covered.ts
index 0ed7838..b5eee73 100644
--- a/lib/utils/regexp-ast/is-covered.ts
+++ b/lib/utils/regexp-ast/is-covered.ts
@@ -410,7 +410,6 @@ function isCoveredForNormalizedNode(
 
 const cacheNormalizeNode = new WeakMap<Node, NormalizedNode>()
 
-/** Normalize node */
 function normalizeNode(node: Node, options: Options): NormalizedNode {
     let n = cacheNormalizeNode.get(node)
     if (n) {
@@ -422,7 +421,6 @@ function normalizeNode(node: Node, options: Options): NormalizedNode {
     return n
 }
 
-/** Normalize node without cache */
 function normalizeNodeWithoutCache(
     node: Node,
     options: Options,
diff --git a/lib/utils/regexp-ast/simplify-quantifier.ts b/lib/utils/regexp-ast/simplify-quantifier.ts
index 73dd59f..6650075 100644
--- a/lib/utils/regexp-ast/simplify-quantifier.ts
+++ b/lib/utils/regexp-ast/simplify-quantifier.ts
@@ -339,9 +339,6 @@ function removeTargetQuantifier(
     return result
 }
 
-/**
- * Throws if called.
- */
 function assertNever(value: never): never {
     throw new Error(`Invalid value: ${value}`)
 }
diff --git a/lib/utils/replacements-utils.ts b/lib/utils/replacements-utils.ts
index e18a226..2f66340 100644
--- a/lib/utils/replacements-utils.ts
+++ b/lib/utils/replacements-utils.ts
@@ -17,9 +17,6 @@ type BaseReferenceElement<T> = {
     refText: string
 } & T
 
-/**
- * Parse replacements string
- */
 export function parseReplacementsForString(
     text: string,
 ): BaseReplacementElement<{
@@ -36,9 +33,6 @@ export function parseReplacementsForString(
     )
 }
 
-/**
- * Parse replacements base
- */
 export function baseParseReplacements<T, E extends { value: string }>(
     chars: E[],
     getData: (start: E, end: E) => T,
@@ -81,7 +75,6 @@ export function baseParseReplacements<T, E extends { value: string }>(
 
     return elements
 
-    /** Parse number reference */
     function parseNumberRef(dollarToken: E, startToken: E): boolean {
         if (!/^\d$/u.test(startToken.value)) {
             return false
@@ -114,7 +107,6 @@ export function baseParseReplacements<T, E extends { value: string }>(
         return true
     }
 
-    /** Parse named reference */
     function parseNamedRef(dollarToken: E, startToken: E): boolean {
         if (startToken.value !== "<") {
             return false
diff --git a/lib/utils/string-literal-parser/parser.ts b/lib/utils/string-literal-parser/parser.ts
index de1085c..5d0273f 100644
--- a/lib/utils/string-literal-parser/parser.ts
+++ b/lib/utils/string-literal-parser/parser.ts
@@ -24,7 +24,6 @@ export type EcmaVersion =
     | 12
     | 2021
 
-/** Parse for string literal */
 export function parseStringLiteral(
     source: string,
     option?: {
@@ -54,7 +53,6 @@ export function parseStringLiteral(
     }
 }
 
-/** Parse for string tokens */
 export function* parseStringTokens(
     source: string,
     option?: {
diff --git a/lib/utils/type-tracker/type-data/common.ts b/lib/utils/type-tracker/type-data/common.ts
index 5ee1e32..3ef2ac7 100644
--- a/lib/utils/type-tracker/type-data/common.ts
+++ b/lib/utils/type-tracker/type-data/common.ts
@@ -44,7 +44,6 @@ export function hasType(
     return result.has(type)
 }
 
-/** Create object */
 export function createObject<T>(t: T): T {
     return Object.assign(Object.create(null), t)
 }
diff --git a/lib/utils/unicode.ts b/lib/utils/unicode.ts
index ee1773e..9ba1443 100644
--- a/lib/utils/unicode.ts
+++ b/lib/utils/unicode.ts
@@ -73,40 +73,30 @@ function isCodePointInRange(
 
 /**
  * Checks if the given code point is digit.
- * @param codePoint The code point to check
- * @returns `true` if the given code point is digit.
  */
 export function isDigit(codePoint: number): boolean {
     return Chars.digit({}).has(codePoint)
 }
 /**
  * Checks if the given code point is lowercase.
- * @param codePoint The code point to check
- * @returns `true` if the given code point is lowercase.
  */
 export function isLowercaseLetter(codePoint: number): boolean {
     return isCodePointInRange(codePoint, CP_RANGE_SMALL_LETTER)
 }
 /**
  * Checks if the given code point is uppercase.
- * @param codePoint The code point to check
- * @returns `true` if the given code point is uppercase.
  */
 export function isUppercaseLetter(codePoint: number): boolean {
     return isCodePointInRange(codePoint, CP_RANGE_CAPITAL_LETTER)
 }
 /**
  * Checks if the given code point is letter.
- * @param codePoint The code point to check
- * @returns `true` if the given code point is letter.
  */
 export function isLetter(codePoint: number): boolean {
     return isLowercaseLetter(codePoint) || isUppercaseLetter(codePoint)
 }
 /**
  * Convert the given character to lowercase.
- * @param codePoint The code point to convert.
- * @returns Converted code point.
  */
 export function toLowerCodePoint(codePoint: number): number {
     if (isUppercaseLetter(codePoint)) {
@@ -116,8 +106,6 @@ export function toLowerCodePoint(codePoint: number): number {
 }
 /**
  * Convert the given character to uppercase.
- * @param codePoint The code point to convert.
- * @returns Converted code point.
  */
 export function toUpperCodePoint(codePoint: number): number {
     if (isLowercaseLetter(codePoint)) {
@@ -127,8 +115,6 @@ export function toUpperCodePoint(codePoint: number): number {
 }
 /**
  * Checks if the given code point is symbol.
- * @param codePoint The code point to check
- * @returns `true` if the given code point is symbol.
  */
 export function isSymbol(codePoint: number): boolean {
     return (
@@ -141,8 +127,6 @@ export function isSymbol(codePoint: number): boolean {
 
 /**
  * Checks if the given code point is space.
- * @param codePoint The code point to check
- * @returns `true` if the given code point is space.
  */
 export function isSpace(codePoint: number): boolean {
     return Chars.space({}).has(codePoint)
@@ -150,8 +134,6 @@ export function isSpace(codePoint: number): boolean {
 
 /**
  * Checks if the given code point is word.
- * @param codePoint The code point to check
- * @returns `true` if the given code point is word.
  */
 export function isWord(codePoint: number): boolean {
     return Chars.word({}).has(codePoint)
@@ -159,8 +141,6 @@ export function isWord(codePoint: number): boolean {
 
 /**
  * Checks if the given code point is invisible character.
- * @param codePoint The code point to check
- * @returns `true` if the given code point is invisible character.
  */
 export function isInvisible(codePoint: number): boolean {
     if (isSpace(codePoint)) {
diff --git a/package-lock.json b/package-lock.json
index 7bf4257..9d7eda5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "eslint-plugin-regexp",
-    "version": "2.0.0-next.0",
+    "version": "2.0.0-next.3",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "eslint-plugin-regexp",
-            "version": "2.0.0-next.0",
+            "version": "2.0.0-next.3",
             "license": "MIT",
             "dependencies": {
                 "@eslint-community/eslint-utils": "^4.2.0",
@@ -14,8 +14,8 @@
                 "comment-parser": "^1.4.0",
                 "grapheme-splitter": "^1.0.4",
                 "jsdoctypeparser": "^9.0.0",
-                "refa": "^0.12.0",
-                "regexp-ast-analysis": "^0.7.0",
+                "refa": "^0.12.1",
+                "regexp-ast-analysis": "^0.7.1",
                 "scslre": "^0.3.0"
             },
             "devDependencies": {
@@ -9370,9 +9370,9 @@
             }
         },
         "node_modules/refa": {
-            "version": "0.12.0",
-            "resolved": "https://registry.npmjs.org/refa/-/refa-0.12.0.tgz",
-            "integrity": "sha512-3yCTEBzW93NF2uNsmXCuwmrnu0VcNldYSeFi8t43maVi/J8/M3QOf61XhfcyZiI+SPCQbAucVRhv1Iv7WU0B9Q==",
+            "version": "0.12.1",
+            "resolved": "https://registry.npmjs.org/refa/-/refa-0.12.1.tgz",
+            "integrity": "sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==",
             "dependencies": {
                 "@eslint-community/regexpp": "^4.8.0"
             },
@@ -9387,12 +9387,12 @@
             "dev": true
         },
         "node_modules/regexp-ast-analysis": {
-            "version": "0.7.0",
-            "resolved": "https://registry.npmjs.org/regexp-ast-analysis/-/regexp-ast-analysis-0.7.0.tgz",
-            "integrity": "sha512-Y7L2aE4KOKkatMh6YzzwSeTcUWDUHyo6G7nZReIXtB50KzDZT+HCPnBmgeHKSaCwbiEviRBeI8JS7m4KF2pzjw==",
+            "version": "0.7.1",
+            "resolved": "https://registry.npmjs.org/regexp-ast-analysis/-/regexp-ast-analysis-0.7.1.tgz",
+            "integrity": "sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==",
             "dependencies": {
                 "@eslint-community/regexpp": "^4.8.0",
-                "refa": "^0.12.0"
+                "refa": "^0.12.1"
             },
             "engines": {
                 "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
@@ -18199,9 +18199,9 @@
             }
         },
         "refa": {
-            "version": "0.12.0",
-            "resolved": "https://registry.npmjs.org/refa/-/refa-0.12.0.tgz",
-            "integrity": "sha512-3yCTEBzW93NF2uNsmXCuwmrnu0VcNldYSeFi8t43maVi/J8/M3QOf61XhfcyZiI+SPCQbAucVRhv1Iv7WU0B9Q==",
+            "version": "0.12.1",
+            "resolved": "https://registry.npmjs.org/refa/-/refa-0.12.1.tgz",
+            "integrity": "sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==",
             "requires": {
                 "@eslint-community/regexpp": "^4.8.0"
             }
@@ -18213,12 +18213,12 @@
             "dev": true
         },
         "regexp-ast-analysis": {
-            "version": "0.7.0",
-            "resolved": "https://registry.npmjs.org/regexp-ast-analysis/-/regexp-ast-analysis-0.7.0.tgz",
-            "integrity": "sha512-Y7L2aE4KOKkatMh6YzzwSeTcUWDUHyo6G7nZReIXtB50KzDZT+HCPnBmgeHKSaCwbiEviRBeI8JS7m4KF2pzjw==",
+            "version": "0.7.1",
+            "resolved": "https://registry.npmjs.org/regexp-ast-analysis/-/regexp-ast-analysis-0.7.1.tgz",
+            "integrity": "sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==",
             "requires": {
                 "@eslint-community/regexpp": "^4.8.0",
-                "refa": "^0.12.0"
+                "refa": "^0.12.1"
             }
         },
         "regexp.prototype.flags": {
diff --git a/package.json b/package.json
index af53a84..2e7cb42 100644
--- a/package.json
+++ b/package.json
@@ -107,8 +107,8 @@
         "comment-parser": "^1.4.0",
         "grapheme-splitter": "^1.0.4",
         "jsdoctypeparser": "^9.0.0",
-        "refa": "^0.12.0",
-        "regexp-ast-analysis": "^0.7.0",
+        "refa": "^0.12.1",
+        "regexp-ast-analysis": "^0.7.1",
         "scslre": "^0.3.0"
     },
     "publishConfig": {
diff --git a/tools/new-rule.ts b/tools/new-rule.ts
index 3083273..da8ab77 100644
--- a/tools/new-rule.ts
+++ b/tools/new-rule.ts
@@ -42,9 +42,7 @@ export default createRule("${ruleId}", {
         type: "suggestion", // "problem",
     },
     create(context) {
-        /**
-         * Create visitor
-         */
+
         function createVisitor(regexpContext: RegExpContext): RegExpVisitor.Handlers {
             const { node, flags, getRegexpLocation } = regexpContext
         }
diff --git a/tools/update-docs.ts b/tools/update-docs.ts
index 04aaedf..db78776 100644
--- a/tools/update-docs.ts
+++ b/tools/update-docs.ts
@@ -4,7 +4,6 @@ import { rules } from "../lib/utils/rules"
 import type { RuleModule } from "../lib/types"
 import { getNewVersion } from "./lib/changesets-util"
 
-//eslint-disable-next-line require-jsdoc -- tools
 function yamlValue(val: unknown) {
     if (typeof val === "string") {
         return `"${val.replace(/\\/gu, "\\\\").replace(/"/gu, '\\"')}"`
@@ -14,7 +13,6 @@ function yamlValue(val: unknown) {
 
 const ROOT = path.resolve(__dirname, "../docs/rules")
 
-//eslint-disable-next-line require-jsdoc -- tools
 function pickSince(content: string): string | null | Promise<string> {
     const fileIntro = /^---\n(?<content>.*\n)+---\n*/u.exec(content)
     if (fileIntro) {


Test patch:
diff --git a/tests/lib/rules/no-non-standard-flag.ts b/tests/lib/rules/no-non-standard-flag.ts
index 5488168..56eeed8 100644
--- a/tests/lib/rules/no-non-standard-flag.ts
+++ b/tests/lib/rules/no-non-standard-flag.ts
@@ -3,14 +3,14 @@ import rule from "../../../lib/rules/no-non-standard-flag"
 
 const tester = new RuleTester({
     parserOptions: {
-        ecmaVersion: 2020,
+        ecmaVersion: "latest",
         sourceType: "module",
     },
     parser: require.resolve("@typescript-eslint/parser"),
 })
 
 tester.run("no-non-standard-flag", rule as any, {
-    valid: [`/foo/gimsuy`],
+    valid: [`/foo/gimsuy`, `/foo/v`],
     invalid: [
         {
             code: `/fo*o*/l`,
diff --git a/tests/lib/rules/strict.ts b/tests/lib/rules/strict.ts
index 75ba15e..90fce64 100644
--- a/tests/lib/rules/strict.ts
+++ b/tests/lib/rules/strict.ts
@@ -3,7 +3,7 @@ import rule from "../../../lib/rules/strict"
 
 const tester = new RuleTester({
     parserOptions: {
-        ecmaVersion: 2020,
+        ecmaVersion: "latest",
         sourceType: "module",
     },
 })
@@ -22,6 +22,7 @@ tester.run("strict", rule as any, {
         String.raw`/[\( \) \[ \] \{ \} \| \* \+ \? \^ \$ \\ \/ \. \-]/`,
         "/\\u000f/",
         "/\\x000f/",
+        String.raw`/[A--B]/v`,
     ],
     invalid: [
         // source characters