Skip to content

Commit d4012bf

Browse files
committed
refactor
1 parent 29bea77 commit d4012bf

File tree

4 files changed

+134
-171
lines changed

4 files changed

+134
-171
lines changed

lib/rules/no-deprecated-modulo-syntax.ts

+18-87
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,26 @@
33
*/
44
import type { AST as JSONAST } from 'jsonc-eslint-parser'
55
import type { AST as YAMLAST } from 'yaml-eslint-parser'
6+
import type { RuleContext, RuleListener } from '../types'
7+
import type { GetReportOffset } from '../utils/rule'
8+
import type { CustomBlockVisitorFactory } from '../types/vue-parser-services'
69
import { extname } from 'node:path'
7-
import { defineCustomBlocksVisitor, getLocaleMessages } from '../utils/index'
810
import debugBuilder from 'debug'
9-
import type { RuleContext, RuleListener } from '../types'
11+
import { defineCustomBlocksVisitor, getLocaleMessages } from '../utils/index'
1012
import {
1113
getMessageSyntaxVersions,
12-
getReportIndex,
1314
NodeTypes
1415
} from '../utils/message-compiler/utils'
1516
import { parse } from '../utils/message-compiler/parser'
1617
import { traverseNode } from '../utils/message-compiler/traverser'
17-
import { createRule } from '../utils/rule'
18+
import {
19+
createRule,
20+
defineCreateVisitorForJson,
21+
defineCreateVisitorForYaml
22+
} from '../utils/rule'
1823
import { getFilename, getSourceCode } from '../utils/compat'
19-
const debug = debugBuilder('eslint-plugin-vue-i18n:no-deprecated-modulo-syntax')
2024

21-
type GetReportOffset = (offset: number) => number | null
25+
const debug = debugBuilder('eslint-plugin-vue-i18n:no-deprecated-modulo-syntax')
2226

2327
function create(context: RuleContext): RuleListener {
2428
const filename = getFilename(context)
@@ -69,92 +73,15 @@ function create(context: RuleContext): RuleListener {
6973
if (messageSyntaxVersions.reportIfMissingSetting()) {
7074
return
7175
}
72-
if (messageSyntaxVersions.v9 && messageSyntaxVersions.v8) {
73-
// This rule cannot support two versions in the same project.
74-
return
75-
}
76-
7776
if (messageSyntaxVersions.v9) {
7877
verifyForV9(message, reportNode, getReportOffset)
7978
} else if (messageSyntaxVersions.v8) {
8079
return
8180
}
8281
}
8382

84-
/**
85-
* Create node visitor for JSON
86-
*/
87-
function createVisitorForJson(): RuleListener {
88-
function verifyExpression(node: JSONAST.JSONExpression) {
89-
if (node.type !== 'JSONLiteral' || typeof node.value !== 'string') {
90-
return
91-
}
92-
verifyMessage(node.value, node as JSONAST.JSONStringLiteral, offset =>
93-
getReportIndex(node, offset)
94-
)
95-
}
96-
return {
97-
JSONProperty(node: JSONAST.JSONProperty) {
98-
verifyExpression(node.value)
99-
},
100-
JSONArrayExpression(node: JSONAST.JSONArrayExpression) {
101-
for (const element of node.elements) {
102-
if (element) verifyExpression(element)
103-
}
104-
}
105-
}
106-
}
107-
108-
/**
109-
* Create node visitor for YAML
110-
*/
111-
function createVisitorForYaml(): RuleListener {
112-
const yamlKeyNodes = new Set<YAMLAST.YAMLContent | YAMLAST.YAMLWithMeta>()
113-
function withinKey(node: YAMLAST.YAMLNode) {
114-
for (const keyNode of yamlKeyNodes) {
115-
if (
116-
keyNode.range[0] <= node.range[0] &&
117-
node.range[0] < keyNode.range[1]
118-
) {
119-
return true
120-
}
121-
}
122-
return false
123-
}
124-
function verifyContent(node: YAMLAST.YAMLContent | YAMLAST.YAMLWithMeta) {
125-
const valueNode = node.type === 'YAMLWithMeta' ? node.value : node
126-
if (
127-
!valueNode ||
128-
valueNode.type !== 'YAMLScalar' ||
129-
typeof valueNode.value !== 'string'
130-
) {
131-
return
132-
}
133-
verifyMessage(valueNode.value, valueNode, offset =>
134-
getReportIndex(valueNode, offset)
135-
)
136-
}
137-
return {
138-
YAMLPair(node: YAMLAST.YAMLPair) {
139-
if (withinKey(node)) {
140-
return
141-
}
142-
if (node.key != null) {
143-
yamlKeyNodes.add(node.key)
144-
}
145-
146-
if (node.value) verifyContent(node.value)
147-
},
148-
YAMLSequence(node: YAMLAST.YAMLSequence) {
149-
if (withinKey(node)) {
150-
return
151-
}
152-
for (const entry of node.entries) {
153-
if (entry) verifyContent(entry)
154-
}
155-
}
156-
}
157-
}
83+
const createVisitorForJson = defineCreateVisitorForJson(verifyMessage)
84+
const createVisitorForYaml = defineCreateVisitorForYaml(verifyMessage)
15885

15986
if (extname(filename) === '.vue') {
16087
return defineCustomBlocksVisitor(
@@ -174,9 +101,13 @@ function create(context: RuleContext): RuleListener {
174101
}
175102

176103
if (sourceCode.parserServices.isJSON) {
177-
return createVisitorForJson()
104+
return createVisitorForJson(
105+
context as Parameters<CustomBlockVisitorFactory>[0]
106+
)
178107
} else if (sourceCode.parserServices.isYAML) {
179-
return createVisitorForYaml()
108+
return createVisitorForYaml(
109+
context as Parameters<CustomBlockVisitorFactory>[0]
110+
)
180111
}
181112
return {}
182113
} else {

lib/rules/prefer-linked-key-with-paren.ts

+19-82
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,26 @@
33
*/
44
import type { AST as JSONAST } from 'jsonc-eslint-parser'
55
import type { AST as YAMLAST } from 'yaml-eslint-parser'
6-
import { extname } from 'path'
7-
import { defineCustomBlocksVisitor, getLocaleMessages } from '../utils/index'
8-
import debugBuilder from 'debug'
96
import type { RuleContext, RuleListener } from '../types'
7+
import type { GetReportOffset } from '../utils/rule'
8+
import type { CustomBlockVisitorFactory } from '../types/vue-parser-services'
9+
import { extname } from 'node:path'
10+
import debugBuilder from 'debug'
11+
import {
12+
createRule,
13+
defineCreateVisitorForJson,
14+
defineCreateVisitorForYaml
15+
} from '../utils/rule'
16+
import { defineCustomBlocksVisitor, getLocaleMessages } from '../utils/index'
1017
import {
1118
getMessageSyntaxVersions,
12-
getReportIndex,
1319
NodeTypes
1420
} from '../utils/message-compiler/utils'
1521
import { parse } from '../utils/message-compiler/parser'
1622
import { parse as parseForV8 } from '../utils/message-compiler/parser-v8'
1723
import { traverseNode } from '../utils/message-compiler/traverser'
18-
import { createRule } from '../utils/rule'
1924
import { getFilename, getSourceCode } from '../utils/compat'
25+
2026
const debug = debugBuilder(
2127
'eslint-plugin-vue-i18n:prefer-linked-key-with-paren'
2228
)
@@ -31,8 +37,6 @@ function getSingleQuote(node: JSONAST.JSONStringLiteral | YAMLAST.YAMLScalar) {
3137
return "'"
3238
}
3339

34-
type GetReportOffset = (offset: number) => number | null
35-
3640
function create(context: RuleContext): RuleListener {
3741
const filename = getFilename(context)
3842
const sourceCode = getSourceCode(context)
@@ -141,80 +145,9 @@ function create(context: RuleContext): RuleListener {
141145
verifyForV8(message, reportNode, getReportOffset)
142146
}
143147
}
144-
/**
145-
* Create node visitor for JSON
146-
*/
147-
function createVisitorForJson(): RuleListener {
148-
function verifyExpression(node: JSONAST.JSONExpression) {
149-
if (node.type !== 'JSONLiteral' || typeof node.value !== 'string') {
150-
return
151-
}
152-
verifyMessage(node.value, node as JSONAST.JSONStringLiteral, offset =>
153-
getReportIndex(node, offset)
154-
)
155-
}
156-
return {
157-
JSONProperty(node: JSONAST.JSONProperty) {
158-
verifyExpression(node.value)
159-
},
160-
JSONArrayExpression(node: JSONAST.JSONArrayExpression) {
161-
for (const element of node.elements) {
162-
if (element) verifyExpression(element)
163-
}
164-
}
165-
}
166-
}
167-
168-
/**
169-
* Create node visitor for YAML
170-
*/
171-
function createVisitorForYaml(): RuleListener {
172-
const yamlKeyNodes = new Set<YAMLAST.YAMLContent | YAMLAST.YAMLWithMeta>()
173-
function withinKey(node: YAMLAST.YAMLNode) {
174-
for (const keyNode of yamlKeyNodes) {
175-
if (
176-
keyNode.range[0] <= node.range[0] &&
177-
node.range[0] < keyNode.range[1]
178-
) {
179-
return true
180-
}
181-
}
182-
return false
183-
}
184-
function verifyContent(node: YAMLAST.YAMLContent | YAMLAST.YAMLWithMeta) {
185-
const valueNode = node.type === 'YAMLWithMeta' ? node.value : node
186-
if (
187-
!valueNode ||
188-
valueNode.type !== 'YAMLScalar' ||
189-
typeof valueNode.value !== 'string'
190-
) {
191-
return
192-
}
193-
verifyMessage(valueNode.value, valueNode, offset =>
194-
getReportIndex(valueNode, offset)
195-
)
196-
}
197-
return {
198-
YAMLPair(node: YAMLAST.YAMLPair) {
199-
if (withinKey(node)) {
200-
return
201-
}
202-
if (node.key != null) {
203-
yamlKeyNodes.add(node.key)
204-
}
205148

206-
if (node.value) verifyContent(node.value)
207-
},
208-
YAMLSequence(node: YAMLAST.YAMLSequence) {
209-
if (withinKey(node)) {
210-
return
211-
}
212-
for (const entry of node.entries) {
213-
if (entry) verifyContent(entry)
214-
}
215-
}
216-
}
217-
}
149+
const createVisitorForJson = defineCreateVisitorForJson(verifyMessage)
150+
const createVisitorForYaml = defineCreateVisitorForYaml(verifyMessage)
218151

219152
if (extname(filename) === '.vue') {
220153
return defineCustomBlocksVisitor(
@@ -234,9 +167,13 @@ function create(context: RuleContext): RuleListener {
234167
}
235168

236169
if (sourceCode.parserServices.isJSON) {
237-
return createVisitorForJson()
170+
return createVisitorForJson(
171+
context as Parameters<CustomBlockVisitorFactory>[0]
172+
)
238173
} else if (sourceCode.parserServices.isYAML) {
239-
return createVisitorForYaml()
174+
return createVisitorForYaml(
175+
context as Parameters<CustomBlockVisitorFactory>[0]
176+
)
240177
}
241178
return {}
242179
} else {

lib/types/vue-parser-services.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,4 @@ export type CustomBlockVisitorFactory = (
5555
context: RuleContext & {
5656
parserServices: SourceCode['parserServices'] & { customBlock: VElement }
5757
}
58-
) => RuleListener | null
58+
) => RuleListener

lib/utils/rule.ts

+96-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,99 @@
1-
import type { RuleModule } from '../types'
1+
import type { RuleModule, RuleListener } from '../types'
2+
import type { AST as JSONAST } from 'jsonc-eslint-parser'
3+
import type { AST as YAMLAST } from 'yaml-eslint-parser'
4+
import type { CustomBlockVisitorFactory } from '../types/vue-parser-services'
5+
import { getReportIndex } from '../utils/message-compiler/utils'
6+
7+
export type GetReportOffset = (offset: number) => number | null
8+
export type VerifyMessage = (
9+
message: string,
10+
reportNode: JSONAST.JSONStringLiteral | YAMLAST.YAMLScalar,
11+
getReportOffset: GetReportOffset
12+
) => void
13+
214
export function createRule(module: RuleModule) {
315
return module
416
}
17+
18+
/**
19+
* Define create node visitor for JSON
20+
*/
21+
export function defineCreateVisitorForJson(
22+
verifyMessage: VerifyMessage
23+
): CustomBlockVisitorFactory {
24+
return function (): RuleListener {
25+
function verifyExpression(node: JSONAST.JSONExpression) {
26+
if (node.type !== 'JSONLiteral' || typeof node.value !== 'string') {
27+
return
28+
}
29+
verifyMessage(node.value, node as JSONAST.JSONStringLiteral, offset =>
30+
getReportIndex(node, offset)
31+
)
32+
}
33+
return {
34+
JSONProperty(node: JSONAST.JSONProperty) {
35+
verifyExpression(node.value)
36+
},
37+
JSONArrayExpression(node: JSONAST.JSONArrayExpression) {
38+
for (const element of node.elements) {
39+
if (element) verifyExpression(element)
40+
}
41+
}
42+
}
43+
}
44+
}
45+
46+
/**
47+
* Define Create node visitor for YAML
48+
*/
49+
export function defineCreateVisitorForYaml(
50+
verifyMessage: VerifyMessage
51+
): CustomBlockVisitorFactory {
52+
return function (): RuleListener {
53+
const yamlKeyNodes = new Set<YAMLAST.YAMLContent | YAMLAST.YAMLWithMeta>()
54+
function withinKey(node: YAMLAST.YAMLNode) {
55+
for (const keyNode of yamlKeyNodes) {
56+
if (
57+
keyNode.range[0] <= node.range[0] &&
58+
node.range[0] < keyNode.range[1]
59+
) {
60+
return true
61+
}
62+
}
63+
return false
64+
}
65+
function verifyContent(node: YAMLAST.YAMLContent | YAMLAST.YAMLWithMeta) {
66+
const valueNode = node.type === 'YAMLWithMeta' ? node.value : node
67+
if (
68+
!valueNode ||
69+
valueNode.type !== 'YAMLScalar' ||
70+
typeof valueNode.value !== 'string'
71+
) {
72+
return
73+
}
74+
verifyMessage(valueNode.value, valueNode, offset =>
75+
getReportIndex(valueNode, offset)
76+
)
77+
}
78+
return {
79+
YAMLPair(node: YAMLAST.YAMLPair) {
80+
if (withinKey(node)) {
81+
return
82+
}
83+
if (node.key != null) {
84+
yamlKeyNodes.add(node.key)
85+
}
86+
87+
if (node.value) verifyContent(node.value)
88+
},
89+
YAMLSequence(node: YAMLAST.YAMLSequence) {
90+
if (withinKey(node)) {
91+
return
92+
}
93+
for (const entry of node.entries) {
94+
if (entry) verifyContent(entry)
95+
}
96+
}
97+
}
98+
}
99+
}

0 commit comments

Comments
 (0)