Skip to content

Commit 4119a38

Browse files
committed
👕 refactor: locale messages menagements
1 parent a0ec43e commit 4119a38

File tree

5 files changed

+74
-104
lines changed

5 files changed

+74
-104
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ Details changes for each release are documented in the [CHANGELOG.md](https://gi
2929
- [ ] valid-message-syntax
3030
- [ ] no-raw-text
3131
- [ ] keys-order
32-
- [ ] locale messages caching
32+
- [x] locale messages caching
3333
- [ ] replace documentation example with `eslint-playground` component
3434

3535
## :copyright: License

lib/rules/no-html-messages.js

Lines changed: 8 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,50 +4,16 @@
44
'use strict'
55

66
const { extname } = require('path')
7-
const jsonAstParse = require('json-to-ast')
87
const parse5 = require('parse5')
9-
const { UNEXPETECD_ERROR_LOCATION, loadLocaleMessages } = require('../utils/index')
8+
const {
9+
UNEXPETECD_ERROR_LOCATION,
10+
findExistLocaleMessage,
11+
getLocaleMessages,
12+
extractJsonInfo,
13+
generateJsonAst
14+
} = require('../utils/index')
1015
const debug = require('debug')('eslint-plugin-vue-i18n:no-html-messages')
1116

12-
let localeMessages = null // used locale messages
13-
let localeDir = null
14-
15-
function findExistLocaleMessage (fullpath, localeMessages) {
16-
return localeMessages.find(message => message.fullpath === fullpath)
17-
}
18-
19-
function extractJsonInfo (context, node) {
20-
try {
21-
const [str, filename] = node.comments
22-
return [
23-
Buffer.from(str.value, 'base64').toString(),
24-
Buffer.from(filename.value, 'base64').toString()
25-
]
26-
} catch (e) {
27-
context.report({
28-
loc: UNEXPETECD_ERROR_LOCATION,
29-
message: e.message
30-
})
31-
return []
32-
}
33-
}
34-
35-
function generateJsonAst (context, json, filename) {
36-
let ast = null
37-
38-
try {
39-
ast = jsonAstParse(json, { loc: true, source: filename })
40-
} catch (e) {
41-
const { message, line, column } = e
42-
context.report({
43-
message,
44-
loc: { line, column }
45-
})
46-
}
47-
48-
return ast
49-
}
50-
5117
function traverseNode (node, fn) {
5218
if (node.type === 'Object' && node.children.length > 0) {
5319
node.children.forEach(child => {
@@ -88,14 +54,7 @@ function create (context) {
8854
return {}
8955
}
9056

91-
if (localeDir !== settings['vue-i18n'].localeDir) {
92-
debug(`change localeDir: ${localeDir} -> ${settings['vue-i18n'].localeDir}`)
93-
localeDir = settings['vue-i18n'].localeDir
94-
localeMessages = loadLocaleMessages(localeDir)
95-
} else {
96-
localeMessages = localeMessages || loadLocaleMessages(settings['vue-i18n'].localeDir)
97-
}
98-
57+
const localeMessages = getLocaleMessages(settings['vue-i18n'].localeDir)
9958
const targetLocaleMessage = findExistLocaleMessage(filename, localeMessages)
10059
if (!targetLocaleMessage) {
10160
debug(`ignore ${filename} in no-html-messages`)

lib/rules/no-missing-keys.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,10 @@
66
const {
77
UNEXPETECD_ERROR_LOCATION,
88
defineTemplateBodyVisitor,
9-
loadLocaleMessages,
9+
getLocaleMessages,
1010
findMissingsFromLocaleMessages
1111
} = require('../utils/index')
1212

13-
let localeMessages = null // cache
14-
1513
function create (context) {
1614
const { settings } = context
1715
if (!settings['vue-i18n'] || !settings['vue-i18n'].localeDir) {
@@ -23,7 +21,7 @@ function create (context) {
2321
}
2422

2523
const localeDir = settings['vue-i18n'].localeDir
26-
localeMessages = localeMessages || loadLocaleMessages(localeDir)
24+
const localeMessages = getLocaleMessages(localeDir)
2725

2826
return defineTemplateBodyVisitor(context, {
2927
"VAttribute[directive=true][key.name='t']" (node) {

lib/rules/no-unused-keys.js

Lines changed: 8 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4,52 +4,19 @@
44
'use strict'
55

66
const { extname } = require('path')
7-
const jsonAstParse = require('json-to-ast')
87
const jsonDiffPatch = require('jsondiffpatch').create({})
98
const flatten = require('flat')
109
const collectKeys = require('../utils/collect-keys')
11-
const { UNEXPETECD_ERROR_LOCATION, loadLocaleMessages } = require('../utils/index')
10+
const {
11+
UNEXPETECD_ERROR_LOCATION,
12+
findExistLocaleMessage,
13+
getLocaleMessages,
14+
extractJsonInfo,
15+
generateJsonAst
16+
} = require('../utils/index')
1217
const debug = require('debug')('eslint-plugin-vue-i18n:no-unused-keys')
1318

1419
let usedLocaleMessageKeys = null // used locale message keys
15-
let localeMessages = null // used locale messages
16-
let localeDir = null
17-
18-
function findExistLocaleMessage (fullpath, localeMessages) {
19-
return localeMessages.find(message => message.fullpath === fullpath)
20-
}
21-
22-
function extractJsonInfo (context, node) {
23-
try {
24-
const [str, filename] = node.comments
25-
return [
26-
Buffer.from(str.value, 'base64').toString(),
27-
Buffer.from(filename.value, 'base64').toString()
28-
]
29-
} catch (e) {
30-
context.report({
31-
loc: UNEXPETECD_ERROR_LOCATION,
32-
message: e.message
33-
})
34-
return []
35-
}
36-
}
37-
38-
function generateJsonAst (context, json, filename) {
39-
let ast = null
40-
41-
try {
42-
ast = jsonAstParse(json, { loc: true, source: filename })
43-
} catch (e) {
44-
const { message, line, column } = e
45-
context.report({
46-
message,
47-
loc: { line, column }
48-
})
49-
}
50-
51-
return ast
52-
}
5320

5421
function getUnusedKeys (context, json, usedkeys) {
5522
let unusedKeys = []
@@ -121,14 +88,7 @@ function create (context) {
12188
return {}
12289
}
12390

124-
if (localeDir !== settings['vue-i18n'].localeDir) {
125-
debug(`change localeDir: ${localeDir} -> ${settings['vue-i18n'].localeDir}`)
126-
localeDir = settings['vue-i18n'].localeDir
127-
localeMessages = loadLocaleMessages(localeDir)
128-
} else {
129-
localeMessages = localeMessages || loadLocaleMessages(settings['vue-i18n'].localeDir)
130-
}
131-
91+
const localeMessages = getLocaleMessages(settings['vue-i18n'].localeDir)
13292
const targetLocaleMessage = findExistLocaleMessage(filename, localeMessages)
13393
if (!targetLocaleMessage) {
13494
debug(`ignore ${filename} in no-unused-keys`)

lib/utils/index.js

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
const glob = require('glob')
88
const { resolve } = require('path')
9+
const jsonAstParse = require('json-to-ast')
910

1011
const UNEXPETECD_ERROR_LOCATION = { line: 1, column: 0 }
1112

@@ -25,6 +26,10 @@ function defineTemplateBodyVisitor (context, templateBodyVisitor, scriptVisitor)
2526
return context.parserServices.defineTemplateBodyVisitor(templateBodyVisitor, scriptVisitor)
2627
}
2728

29+
function findExistLocaleMessage (fullpath, localeMessages) {
30+
return localeMessages.find(message => message.fullpath === fullpath)
31+
}
32+
2833
function loadLocaleMessages (pattern) {
2934
const files = glob.sync(pattern)
3035
return files.map(file => {
@@ -35,6 +40,19 @@ function loadLocaleMessages (pattern) {
3540
})
3641
}
3742

43+
let localeMessages = null // locale messages
44+
let localeDir = null // locale dir
45+
46+
function getLocaleMessages (localeDirectory) {
47+
if (localeDir !== localeDirectory) {
48+
localeDir = localeDirectory
49+
localeMessages = loadLocaleMessages(localeDir)
50+
} else {
51+
localeMessages = localeMessages || loadLocaleMessages(localeDir)
52+
}
53+
return localeMessages
54+
}
55+
3856
function findMissingsFromLocaleMessages (localeMessages, key) {
3957
const missings = []
4058
const paths = key.split('.')
@@ -56,9 +74,44 @@ function findMissingsFromLocaleMessages (localeMessages, key) {
5674
return missings
5775
}
5876

77+
function extractJsonInfo (context, node) {
78+
try {
79+
const [str, filename] = node.comments
80+
return [
81+
Buffer.from(str.value, 'base64').toString(),
82+
Buffer.from(filename.value, 'base64').toString()
83+
]
84+
} catch (e) {
85+
context.report({
86+
loc: UNEXPETECD_ERROR_LOCATION,
87+
message: e.message
88+
})
89+
return []
90+
}
91+
}
92+
93+
function generateJsonAst (context, json, filename) {
94+
let ast = null
95+
96+
try {
97+
ast = jsonAstParse(json, { loc: true, source: filename })
98+
} catch (e) {
99+
const { message, line, column } = e
100+
context.report({
101+
message,
102+
loc: { line, column }
103+
})
104+
}
105+
106+
return ast
107+
}
108+
59109
module.exports = {
60110
UNEXPETECD_ERROR_LOCATION,
61111
defineTemplateBodyVisitor,
62-
loadLocaleMessages,
63-
findMissingsFromLocaleMessages
112+
getLocaleMessages,
113+
findMissingsFromLocaleMessages,
114+
findExistLocaleMessage,
115+
extractJsonInfo,
116+
generateJsonAst
64117
}

0 commit comments

Comments
 (0)