Skip to content

Commit 60d13b8

Browse files
Refactor utils (#710)
1 parent 31026e1 commit 60d13b8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

77 files changed

+1679
-1699
lines changed

Diff for: docs/.vitepress/config.mts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { defineConfig } from "vitepress"
33
import { BUNDLED_LANGUAGES } from "shiki"
44
import path from "path"
55
import { fileURLToPath } from "url"
6-
import { rules } from "../../lib/utils/rules.js"
6+
import { rules } from "../../lib/all-rules.js"
77
import type { RuleModule } from "../../lib/types.js"
88

99
// Pre-build cjs packages that cannot be bundled well.

Diff for: docs/.vitepress/theme/components/components/EslintPluginEditor.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<script>
1919
import EslintEditor from "@ota-meshi/site-kit-eslint-editor-vue"
2020
import { Linter } from "eslint"
21-
import { rules } from "../../../../../lib/utils/rules"
21+
import { rules } from "../../../../../lib/all-rules"
2222
2323
export default {
2424
name: "EslintPluginEditor",

Diff for: docs/.vitepress/theme/components/rules/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Linter } from "eslint"
2-
import { rules } from "../../../../../lib/utils/rules.ts"
2+
import { rules } from "../../../../../lib/all-rules.ts"
33
import { rules as recommendedRules } from "../../../../../lib/configs/recommended.ts"
44

55
const coreRules = Object.fromEntries(new Linter().getRules())

Diff for: lib/all-rules.ts

+166
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
import type { RuleModule } from "./types"
2+
import confusingQuantifier from "./rules/confusing-quantifier"
3+
import controlCharacterEscape from "./rules/control-character-escape"
4+
import graphemeStringLiteral from "./rules/grapheme-string-literal"
5+
import hexadecimalEscape from "./rules/hexadecimal-escape"
6+
import letterCase from "./rules/letter-case"
7+
import matchAny from "./rules/match-any"
8+
import negation from "./rules/negation"
9+
import noContradictionWithAssertion from "./rules/no-contradiction-with-assertion"
10+
import noControlCharacter from "./rules/no-control-character"
11+
import noDupeCharactersCharacterClass from "./rules/no-dupe-characters-character-class"
12+
import noDupeDisjunctions from "./rules/no-dupe-disjunctions"
13+
import noEmptyAlternative from "./rules/no-empty-alternative"
14+
import noEmptyCapturingGroup from "./rules/no-empty-capturing-group"
15+
import noEmptyCharacterClass from "./rules/no-empty-character-class"
16+
import noEmptyGroup from "./rules/no-empty-group"
17+
import noEmptyLookaroundsAssertion from "./rules/no-empty-lookarounds-assertion"
18+
import noEmptyStringLiteral from "./rules/no-empty-string-literal"
19+
import noEscapeBackspace from "./rules/no-escape-backspace"
20+
import noExtraLookaroundAssertions from "./rules/no-extra-lookaround-assertions"
21+
import noInvalidRegexp from "./rules/no-invalid-regexp"
22+
import noInvisibleCharacter from "./rules/no-invisible-character"
23+
import noLazyEnds from "./rules/no-lazy-ends"
24+
import noLegacyFeatures from "./rules/no-legacy-features"
25+
import noMisleadingCapturingGroup from "./rules/no-misleading-capturing-group"
26+
import noMisleadingUnicodeCharacter from "./rules/no-misleading-unicode-character"
27+
import noMissingGFlag from "./rules/no-missing-g-flag"
28+
import noNonStandardFlag from "./rules/no-non-standard-flag"
29+
import noObscureRange from "./rules/no-obscure-range"
30+
import noOctal from "./rules/no-octal"
31+
import noOptionalAssertion from "./rules/no-optional-assertion"
32+
import noPotentiallyUselessBackreference from "./rules/no-potentially-useless-backreference"
33+
import noStandaloneBackslash from "./rules/no-standalone-backslash"
34+
import noSuperLinearBacktracking from "./rules/no-super-linear-backtracking"
35+
import noSuperLinearMove from "./rules/no-super-linear-move"
36+
import noTriviallyNestedAssertion from "./rules/no-trivially-nested-assertion"
37+
import noTriviallyNestedQuantifier from "./rules/no-trivially-nested-quantifier"
38+
import noUnusedCapturingGroup from "./rules/no-unused-capturing-group"
39+
import noUselessAssertions from "./rules/no-useless-assertions"
40+
import noUselessBackreference from "./rules/no-useless-backreference"
41+
import noUselessCharacterClass from "./rules/no-useless-character-class"
42+
import noUselessDollarReplacements from "./rules/no-useless-dollar-replacements"
43+
import noUselessEscape from "./rules/no-useless-escape"
44+
import noUselessFlag from "./rules/no-useless-flag"
45+
import noUselessLazy from "./rules/no-useless-lazy"
46+
import noUselessNonCapturingGroup from "./rules/no-useless-non-capturing-group"
47+
import noUselessQuantifier from "./rules/no-useless-quantifier"
48+
import noUselessRange from "./rules/no-useless-range"
49+
import noUselessSetOperand from "./rules/no-useless-set-operand"
50+
import noUselessStringLiteral from "./rules/no-useless-string-literal"
51+
import noUselessTwoNumsQuantifier from "./rules/no-useless-two-nums-quantifier"
52+
import noZeroQuantifier from "./rules/no-zero-quantifier"
53+
import optimalLookaroundQuantifier from "./rules/optimal-lookaround-quantifier"
54+
import optimalQuantifierConcatenation from "./rules/optimal-quantifier-concatenation"
55+
import preferCharacterClass from "./rules/prefer-character-class"
56+
import preferD from "./rules/prefer-d"
57+
import preferEscapeReplacementDollarChar from "./rules/prefer-escape-replacement-dollar-char"
58+
import preferLookaround from "./rules/prefer-lookaround"
59+
import preferNamedBackreference from "./rules/prefer-named-backreference"
60+
import preferNamedCaptureGroup from "./rules/prefer-named-capture-group"
61+
import preferNamedReplacement from "./rules/prefer-named-replacement"
62+
import preferPlusQuantifier from "./rules/prefer-plus-quantifier"
63+
import preferPredefinedAssertion from "./rules/prefer-predefined-assertion"
64+
import preferQuantifier from "./rules/prefer-quantifier"
65+
import preferQuestionQuantifier from "./rules/prefer-question-quantifier"
66+
import preferRange from "./rules/prefer-range"
67+
import preferRegexpExec from "./rules/prefer-regexp-exec"
68+
import preferRegexpTest from "./rules/prefer-regexp-test"
69+
import preferResultArrayGroups from "./rules/prefer-result-array-groups"
70+
import preferSetOperation from "./rules/prefer-set-operation"
71+
import preferStarQuantifier from "./rules/prefer-star-quantifier"
72+
import preferUnicodeCodepointEscapes from "./rules/prefer-unicode-codepoint-escapes"
73+
import preferW from "./rules/prefer-w"
74+
import requireUnicodeRegexp from "./rules/require-unicode-regexp"
75+
import requireUnicodeSetsRegexp from "./rules/require-unicode-sets-regexp"
76+
import simplifySetOperations from "./rules/simplify-set-operations"
77+
import sortAlternatives from "./rules/sort-alternatives"
78+
import sortCharacterClassElements from "./rules/sort-character-class-elements"
79+
import sortFlags from "./rules/sort-flags"
80+
import strict from "./rules/strict"
81+
import unicodeEscape from "./rules/unicode-escape"
82+
import useIgnoreCase from "./rules/use-ignore-case"
83+
84+
export const rules: RuleModule[] = [
85+
confusingQuantifier,
86+
controlCharacterEscape,
87+
graphemeStringLiteral,
88+
hexadecimalEscape,
89+
letterCase,
90+
matchAny,
91+
negation,
92+
noContradictionWithAssertion,
93+
noControlCharacter,
94+
noDupeCharactersCharacterClass,
95+
noDupeDisjunctions,
96+
noEmptyAlternative,
97+
noEmptyCapturingGroup,
98+
noEmptyCharacterClass,
99+
noEmptyGroup,
100+
noEmptyLookaroundsAssertion,
101+
noEmptyStringLiteral,
102+
noEscapeBackspace,
103+
noExtraLookaroundAssertions,
104+
noInvalidRegexp,
105+
noInvisibleCharacter,
106+
noLazyEnds,
107+
noLegacyFeatures,
108+
noMisleadingCapturingGroup,
109+
noMisleadingUnicodeCharacter,
110+
noMissingGFlag,
111+
noNonStandardFlag,
112+
noObscureRange,
113+
noOctal,
114+
noOptionalAssertion,
115+
noPotentiallyUselessBackreference,
116+
noStandaloneBackslash,
117+
noSuperLinearBacktracking,
118+
noSuperLinearMove,
119+
noTriviallyNestedAssertion,
120+
noTriviallyNestedQuantifier,
121+
noUnusedCapturingGroup,
122+
noUselessAssertions,
123+
noUselessBackreference,
124+
noUselessCharacterClass,
125+
noUselessDollarReplacements,
126+
noUselessEscape,
127+
noUselessFlag,
128+
noUselessLazy,
129+
noUselessNonCapturingGroup,
130+
noUselessQuantifier,
131+
noUselessRange,
132+
noUselessSetOperand,
133+
noUselessStringLiteral,
134+
noUselessTwoNumsQuantifier,
135+
noZeroQuantifier,
136+
optimalLookaroundQuantifier,
137+
optimalQuantifierConcatenation,
138+
preferCharacterClass,
139+
preferD,
140+
preferEscapeReplacementDollarChar,
141+
preferLookaround,
142+
preferNamedBackreference,
143+
preferNamedCaptureGroup,
144+
preferNamedReplacement,
145+
preferPlusQuantifier,
146+
preferPredefinedAssertion,
147+
preferQuantifier,
148+
preferQuestionQuantifier,
149+
preferRange,
150+
preferRegexpExec,
151+
preferRegexpTest,
152+
preferResultArrayGroups,
153+
preferSetOperation,
154+
preferStarQuantifier,
155+
preferUnicodeCodepointEscapes,
156+
preferW,
157+
requireUnicodeRegexp,
158+
requireUnicodeSetsRegexp,
159+
simplifySetOperations,
160+
sortAlternatives,
161+
sortCharacterClassElements,
162+
sortFlags,
163+
strict,
164+
unicodeEscape,
165+
useIgnoreCase,
166+
]

Diff for: lib/configs/rules/all.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { rules as recommendedRules } from "./recommended"
2-
import { rules as ruleLint } from "../../utils/rules"
2+
import { rules as ruleLint } from "../../all-rules"
33

44
const all: Record<string, string> = {}
55
for (const rule of ruleLint) {

Diff for: lib/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { RuleModule } from "./types"
2-
import { rules as ruleList } from "./utils/rules"
2+
import { rules as ruleList } from "./all-rules"
33
import * as recommended from "./configs/recommended"
44
import * as all from "./configs/all"
55
import * as flatRecommended from "./configs/flat/recommended"

Diff for: lib/rules/confusing-quantifier.ts

+2-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
import type { RegExpVisitor } from "@eslint-community/regexpp/visitor"
22
import type { RegExpContext } from "../utils"
3-
import {
4-
createRule,
5-
defineRegexpVisitor,
6-
getQuantifierOffsets,
7-
quantToString,
8-
} from "../utils"
3+
import { createRule, defineRegexpVisitor } from "../utils"
94
import { isPotentiallyEmpty } from "regexp-ast-analysis"
5+
import { quantToString, getQuantifierOffsets } from "../utils/regexp-ast"
106

117
export default createRule("confusing-quantifier", {
128
meta: {

Diff for: lib/rules/hexadecimal-escape.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import type { RegExpVisitor } from "@eslint-community/regexpp/visitor"
22
import type { Character } from "@eslint-community/regexpp/ast"
33
import type { RegExpContext } from "../utils"
4+
import { defineRegexpVisitor, createRule } from "../utils"
45
import {
5-
defineRegexpVisitor,
6-
createRule,
76
getEscapeSequenceKind,
87
EscapeSequenceKind,
9-
} from "../utils"
8+
} from "../utils/regex-syntax"
109

1110
export default createRule("hexadecimal-escape", {
1211
meta: {

Diff for: lib/rules/letter-case.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@ import {
1010
isLetter,
1111
isLowercaseLetter,
1212
isUppercaseLetter,
13+
} from "../utils"
14+
import {
1315
EscapeSequenceKind,
1416
getEscapeSequenceKind,
15-
} from "../utils"
17+
} from "../utils/regex-syntax"
1618

1719
const CASE_SCHEMA = ["lowercase", "uppercase", "ignore"] as const
1820
type Case = (typeof CASE_SCHEMA)[number]

Diff for: lib/rules/no-contradiction-with-assertion.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import type {
66
Quantifier,
77
} from "@eslint-community/regexpp/ast"
88
import type { RegExpContext } from "../utils"
9-
import { quantToString, createRule, defineRegexpVisitor } from "../utils"
9+
import { createRule, defineRegexpVisitor } from "../utils"
1010
import type {
1111
FirstLookChar,
1212
MatchingDirection,
@@ -21,6 +21,7 @@ import {
2121
isZeroLength,
2222
FirstConsumedChars,
2323
} from "regexp-ast-analysis"
24+
import { quantToString } from "../utils/regexp-ast"
2425
import { mention } from "../utils/mention"
2526

2627
/**

Diff for: lib/rules/no-dupe-characters-character-class.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,9 @@ import type { RegExpContext } from "../utils"
1616
import {
1717
createRule,
1818
defineRegexpVisitor,
19-
toCharSetSource,
2019
fixRemoveCharacterClassElement,
21-
assertValidFlags,
2220
} from "../utils"
21+
import { toCharSetSource, assertValidFlags } from "../utils/refa"
2322
import type { CharRange, CharSet } from "refa"
2423
import { JS } from "refa"
2524
import type { ReadonlyFlags } from "regexp-ast-analysis"

Diff for: lib/rules/no-dupe-disjunctions.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,9 @@ import {
1515
defineRegexpVisitor,
1616
fixRemoveCharacterClassElement,
1717
fixRemoveAlternative,
18-
assertValidFlags,
1918
fixRemoveStringAlternative,
2019
} from "../utils"
21-
import { getParser, isCoveredNode, isEqualNodes } from "../utils/regexp-ast"
20+
import { isCoveredNode, isEqualNodes } from "../utils/regexp-ast"
2221
import type { Expression, FiniteAutomaton, NoParent, ReadonlyNFA } from "refa"
2322
import {
2423
Transformers,
@@ -44,6 +43,7 @@ import { PartialParser } from "../utils/partial-parser"
4443
import type { Rule } from "eslint"
4544
import { getAllowedCharRanges, inRange } from "../utils/char-ranges"
4645
import { assertNever } from "../utils/util"
46+
import { getParser, assertValidFlags } from "../utils/refa"
4747

4848
type ParentNode = Group | CapturingGroup | Pattern | LookaroundAssertion
4949

Diff for: lib/rules/no-invisible-character.ts

+2-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
import type { RegExpVisitor } from "@eslint-community/regexpp/visitor"
22
import type { AST } from "eslint"
33
import type { RegExpContextForLiteral, RegExpContextForSource } from "../utils"
4-
import {
5-
createRule,
6-
defineRegexpVisitor,
7-
isInvisible,
8-
toCharSetSource,
9-
} from "../utils"
4+
import { createRule, defineRegexpVisitor, isInvisible } from "../utils"
5+
import { toCharSetSource } from "../utils/refa"
106

117
export default createRule("no-invisible-character", {
128
meta: {

Diff for: lib/rules/no-misleading-capturing-group.ts

+6-33
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ import type {
55
Alternative,
66
CapturingGroup,
77
Element,
8-
Node,
98
Quantifier,
109
} from "@eslint-community/regexpp/ast"
1110
import type { RegExpContext } from "../utils"
12-
import { createRule, defineRegexpVisitor, toCharSetSource } from "../utils"
11+
import { createRule, defineRegexpVisitor } from "../utils"
1312
import type { MatchingDirection, ReadonlyFlags } from "regexp-ast-analysis"
1413
import {
1514
isPotentiallyZeroLength,
@@ -21,23 +20,13 @@ import {
2120
followPaths,
2221
toUnicodeSet,
2322
} from "regexp-ast-analysis"
24-
import { canSimplifyQuantifier } from "../utils/regexp-ast/simplify-quantifier"
23+
import { canSimplifyQuantifier, hasCapturingGroup } from "../utils/regexp-ast"
2524
import { fixSimplifyQuantifier } from "../utils/fix-simplify-quantifier"
2625
import { joinEnglishList, mention } from "../utils/mention"
27-
import { getParser } from "../utils/regexp-ast"
28-
import { assertNever } from "../utils/util"
26+
import { getParser, toCharSetSource } from "../utils/refa"
27+
import { assertNever, cachedFn, reversed } from "../utils/util"
2928
import { CharSet } from "refa"
3029

31-
/**
32-
* Returns an iterator that goes through all elements in the given array in
33-
* reverse order.
34-
*/
35-
function* iterReverse<T>(array: readonly T[]): Iterable<T> {
36-
for (let i = array.length - 1; i >= 0; i--) {
37-
yield array[i]
38-
}
39-
}
40-
4130
/**
4231
* Returns all quantifiers that are always at the start of the given element.
4332
*/
@@ -67,7 +56,7 @@ function* getStartQuantifiers(
6756
break
6857
case "Alternative": {
6958
const elements =
70-
direction === "ltr" ? root.elements : iterReverse(root.elements)
59+
direction === "ltr" ? root.elements : reversed(root.elements)
7160
for (const e of elements) {
7261
if (isEmpty(e, flags)) continue
7362
yield* getStartQuantifiers(e, direction, flags)
@@ -93,24 +82,8 @@ function* getStartQuantifiers(
9382
}
9483
}
9584

96-
/**
97-
* Returns whether the given node is or contains a capturing group.
98-
*/
99-
function hasCapturingGroup(node: Node): boolean {
100-
return hasSomeDescendant(node, (d) => d.type === "CapturingGroup")
101-
}
102-
10385
type CharCache = WeakMap<Element | Alternative, CharSet>
104-
const caches = new WeakMap<ReadonlyFlags, CharCache>()
105-
106-
function getCache(flags: ReadonlyFlags): CharCache {
107-
let cache = caches.get(flags)
108-
if (cache === undefined) {
109-
cache = new WeakMap()
110-
caches.set(flags, cache)
111-
}
112-
return cache
113-
}
86+
const getCache = cachedFn((_flags: ReadonlyFlags): CharCache => new WeakMap())
11487

11588
/**
11689
* Returns the largest character set such that `L(chars) ⊆ L(element)`.

Diff for: lib/rules/no-misleading-unicode-character.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import type { RegExpVisitor } from "@eslint-community/regexpp/visitor"
22
import type { RegExpContext } from "../utils"
3-
import { isEscapeSequence, createRule, defineRegexpVisitor } from "../utils"
3+
import { createRule, defineRegexpVisitor } from "../utils"
44
import type { ReadonlyFlags } from "regexp-ast-analysis"
55
import { mention, mentionChar } from "../utils/mention"
6+
import { isEscapeSequence } from "../utils/regex-syntax"
67
import type {
78
CharacterClass,
89
CharacterClassElement,

0 commit comments

Comments
 (0)