UNPKG

vue-i18n-extract

Version:

Manage vue-i18n localization with static analysis

69 lines (54 loc) 2.81 kB
import path from 'path'; import { ReportOptions, I18NReport } from '../types'; import { readVueFiles, extractI18NItemsFromVueFiles } from './vue-files'; import { readLanguageFiles, extractI18NLanguageFromLanguageFiles, removeUnusedFromLanguageFiles, writeMissingToLanguageFiles } from './language-files'; import { extractI18NReport, writeReportToFile } from './report'; import Dot from 'dot-object'; export async function createI18NReport (options: ReportOptions): Promise<I18NReport> { const { vueFiles: vueFilesGlob, languageFiles: languageFilesGlob, output, add, remove, exclude = [], ci, separator, noEmptyTranslation = '', } = options; if (!vueFilesGlob) throw new Error('Required configuration vueFiles is missing.'); if (!languageFilesGlob) throw new Error('Required configuration languageFiles is missing.'); const dot = typeof separator === 'string' ? new Dot(separator) : Dot; const vueFiles = readVueFiles(path.resolve(process.cwd(), vueFilesGlob)); const languageFiles = readLanguageFiles(path.resolve(process.cwd(), languageFilesGlob)); const I18NItems = extractI18NItemsFromVueFiles(vueFiles); const I18NLanguage = extractI18NLanguageFromLanguageFiles(languageFiles, dot); const report = extractI18NReport(I18NItems, I18NLanguage); report.unusedKeys = report.unusedKeys.filter(key => !exclude.filter(excluded => key.path.startsWith(excluded)).length) if (report.missingKeys.length) console.info('\nMissing Keys'), console.table(report.missingKeys); if (report.unusedKeys.length) console.info('\nUnused Keys'), console.table(report.unusedKeys); if (report.maybeDynamicKeys.length) console.warn('\nSuspected Dynamic Keys Found\nvue-i18n-extract does not compile Vue templates and therefore can not infer the correct key for the following keys.'), console.table(report.maybeDynamicKeys); if (output) { await writeReportToFile(report, path.resolve(process.cwd(), output)); console.info(`\nThe report has been has been saved to ${output}`); } if (remove && report.unusedKeys.length) { removeUnusedFromLanguageFiles(languageFiles, report.unusedKeys, dot); console.info('\nThe unused keys have been removed from your language files.'); } if (add && report.missingKeys.length) { writeMissingToLanguageFiles(languageFiles, report.missingKeys, dot, noEmptyTranslation); console.info('\nThe missing keys have been added to your language files.'); } if (ci && report.missingKeys.length) { throw new Error(`${report.missingKeys.length} missing keys found.`); } if (ci && report.unusedKeys.length) { throw new Error(`${report.unusedKeys.length} unused keys found.`); } return report; } export * from './vue-files'; export * from './language-files'; export * from './report';