|
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