|
7 | 7 | const glob = require('glob')
|
8 | 8 | const { resolve, dirname, extname } = require('path')
|
9 | 9 | const { FileLocaleMessage, BlockLocaleMessage, LocaleMessages } = require('./locale-messages')
|
| 10 | +const CacheLoader = require('./cache-loader') |
| 11 | +const defineCacheFunction = require('./cache-function') |
10 | 12 |
|
11 | 13 | /**
|
12 | 14 | * @typedef {import('vue-eslint-parser').AST.ESLintProgram} Program
|
@@ -57,19 +59,15 @@ function defineTemplateBodyVisitor (context, templateBodyVisitor, scriptVisitor)
|
57 | 59 | }
|
58 | 60 |
|
59 | 61 | /**
|
60 |
| - * @param {SettingsVueI18nLocaleDir} localeDir |
| 62 | + * @param {string[]} files |
| 63 | + * @param {LocaleKeyType} localeKey |
61 | 64 | * @returns {LocaleMessage[]}
|
62 | 65 | */
|
63 |
| -function loadLocaleMessages (localeDir) { |
64 |
| - if (typeof localeDir === 'string') { |
65 |
| - return loadLocaleMessages({ pattern: localeDir, localeKey: 'file' }) |
66 |
| - } else { |
67 |
| - const files = glob.sync(localeDir.pattern) |
68 |
| - return files.map(file => { |
69 |
| - const fullpath = resolve(process.cwd(), file) |
70 |
| - return new FileLocaleMessage({ fullpath, localeKey: localeDir.localeKey || 'file' }) |
71 |
| - }) |
72 |
| - } |
| 66 | +function loadLocaleMessages (files, localeKey) { |
| 67 | + return files.map(file => { |
| 68 | + const fullpath = resolve(process.cwd(), file) |
| 69 | + return new FileLocaleMessage({ fullpath, localeKey }) |
| 70 | + }) |
73 | 71 | }
|
74 | 72 |
|
75 | 73 | /** @type {Set<RuleContext>} */
|
@@ -99,30 +97,42 @@ function getLocaleMessages (context) {
|
99 | 97 |
|
100 | 98 | return new LocaleMessages([
|
101 | 99 | ...(getLocaleMessagesFromI18nBlocks(context, i18nBlocks) || []),
|
102 |
| - ...(localeDir && getLocaleMessagesFromLocaleDir(localeDir) || []) |
| 100 | + ...(localeDir && localeDirLocaleMessagesCache.getLocaleMessagesFromLocaleDir(localeDir) || []) |
103 | 101 | ])
|
104 | 102 | }
|
105 | 103 |
|
106 |
| -/** @type {LocaleMessage[] | null} */ |
107 |
| -let localeDirLocaleMessages = null // locale messages |
108 |
| -let localeDir = null // locale dir |
109 |
| -/** @type {Map<Program, LocaleMessage[]>} */ |
110 |
| -const i18nBlockLocaleMessages = new WeakMap() |
| 104 | +class LocaleDirLocaleMessagesCache { |
| 105 | + constructor () { |
| 106 | + this._targetFilesLoader = new CacheLoader((pattern) => glob.sync(pattern)) |
111 | 107 |
|
112 |
| -/** |
113 |
| - * @param {SettingsVueI18nLocaleDir} localeDirectory |
114 |
| - * @returns {LocaleMessage[]} |
115 |
| - */ |
116 |
| -function getLocaleMessagesFromLocaleDir (localeDirectory) { |
117 |
| - if (localeDir !== localeDirectory) { |
118 |
| - localeDir = localeDirectory |
119 |
| - localeDirLocaleMessages = loadLocaleMessages(localeDir) |
120 |
| - } else { |
121 |
| - localeDirLocaleMessages = localeDirLocaleMessages || loadLocaleMessages(localeDir) |
| 108 | + this._loadLocaleMessages = defineCacheFunction((files, localeKey) => { |
| 109 | + return loadLocaleMessages(files, localeKey) |
| 110 | + }) |
| 111 | + } |
| 112 | + /** |
| 113 | + * @param {SettingsVueI18nLocaleDir} localeDir |
| 114 | + * @returns {LocaleMessage[]} |
| 115 | + */ |
| 116 | + getLocaleMessagesFromLocaleDir (localeDir) { |
| 117 | + const targetFilesLoader = this._targetFilesLoader |
| 118 | + let files |
| 119 | + let localeKey |
| 120 | + if (typeof localeDir === 'string') { |
| 121 | + files = targetFilesLoader.get(localeDir) |
| 122 | + localeKey = 'file' |
| 123 | + } else { |
| 124 | + files = targetFilesLoader.get(localeDir.pattern) |
| 125 | + localeKey = `${localeDir.localeKey || 'file'}` |
| 126 | + } |
| 127 | + return this._loadLocaleMessages(files, localeKey) |
122 | 128 | }
|
123 |
| - return localeDirLocaleMessages |
124 | 129 | }
|
125 | 130 |
|
| 131 | +const localeDirLocaleMessagesCache = new LocaleDirLocaleMessagesCache() |
| 132 | + |
| 133 | +/** @type {Map<Program, LocaleMessage[]>} */ |
| 134 | +const i18nBlockLocaleMessages = new WeakMap() |
| 135 | + |
126 | 136 | /**
|
127 | 137 | * @param {RuleContext} context
|
128 | 138 | * @param {VElement[]} i18nBlocks
|
|
0 commit comments