UNPKG

@shferreira/vue-i18n-extract

Version:

Manage vue-i18n localization with static analysis

1 lines 33.7 kB
{"version":3,"file":"vue-i18n-extract.modern.mjs","sources":["../src/config-file/vue-i18n-extract.config.ts","../src/config-file/index.ts","../src/types.ts","../src/create-report/vue-files.ts","../src/create-report/language-files.ts","../src/create-report/report.ts","../src/create-report/index.ts","../src/index.ts"],"sourcesContent":["export default {\n // Options documented in vue-i18n-extract readme.\n vueFiles: './src/**/*.?(js|vue)',\n languageFiles: './lang/**/*.?(json|yaml|yml|js)',\n exclude: [],\n output: false,\n add: false,\n remove: false,\n ci: false,\n separator: '.',\n noEmptyTranslation: ''\n};\n","import cac from 'cac';\nimport fs from 'fs';\nimport path from 'path';\nimport defaultConfig from './vue-i18n-extract.config';\n\nexport function initCommand(): void {\n fs.writeFileSync(\n path.resolve(process.cwd(), './vue-i18n-extract.config.js'),\n `module.exports = ${JSON.stringify(defaultConfig, null, 2)}`,\n );\n}\n\nexport function resolveConfig (): Record<string, string> {\n const argvOptions = cac().parse(process.argv, { run: false }).options;\n\n let options;\n\n try {\n const pathToConfigFile = path.resolve(process.cwd(), './vue-i18n-extract.config.js');\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const configOptions = require(pathToConfigFile);\n\n console.info(`\\nUsing config file found at ${pathToConfigFile}`);\n\n options = {\n ...configOptions,\n ...argvOptions\n };\n } catch {\n options = argvOptions;\n }\n\n options.exclude = Array.isArray(options.exclude) ? options.exclude : [options.exclude];\n\n return options;\n}\n","export type ReportOptions = {\n vueFiles: string;\n languageFiles: string;\n output?: string;\n exclude?: string[];\n add?: boolean;\n remove?: boolean;\n ci?: boolean;\n separator?: string;\n noEmptyTranslation?: string;\n detect?: DetectionType[];\n}\n\nexport enum DetectionType {\n Missing = \"missing\",\n Unused = \"unused\",\n Dynamic = \"dynamic\"\n}\n\nexport type SimpleFile = {\n fileName: string;\n path: string;\n content: string;\n}\n\nexport type I18NItem = {\n line?: number;\n path: string;\n file?: string;\n language?: string;\n}\n\nexport type I18NItemWithBounding = I18NItem & {\n previousCharacter: string;\n nextCharacter: string;\n}\n\nexport type I18NLanguage = {\n [language: string]: I18NItem[];\n}\n\nexport type I18NReport = {\n missingKeys: I18NItem[];\n unusedKeys: I18NItem[];\n maybeDynamicKeys: I18NItem[];\n}\n","import { SimpleFile, I18NItemWithBounding } from '../types';\nimport isValidGlob from 'is-valid-glob';\nimport glob from 'glob';\nimport fs from 'fs';\n\nexport function readVueFiles (src: string): SimpleFile[] {\n // Replace backslash path segments to make the path work with the glob package.\n // https://github.com/Spittal/vue-i18n-extract/issues/159\n const normalizedSrc = src.replace(/\\\\/g, '/');\n if (!isValidGlob(normalizedSrc)) {\n throw new Error(`vueFiles isn't a valid glob pattern.`);\n }\n\n const targetFiles = glob.sync(normalizedSrc);\n\n if (targetFiles.length === 0) {\n throw new Error('vueFiles glob has no files.');\n }\n\n return targetFiles.map((f) => {\n const fileName = f.replace(process.cwd(), '.');\n return { fileName, path: f, content: fs.readFileSync(f, 'utf8') };\n });\n}\n\nfunction* getMatches (file: SimpleFile, regExp: RegExp, captureGroup = 1): IterableIterator<I18NItemWithBounding> {\n while (true) {\n const match = regExp.exec(file.content);\n if (match === null) {\n break;\n }\n const path = match[captureGroup];\n\n const pathAtIndex = file.content.indexOf(path);\n const previousCharacter = file.content.charAt(pathAtIndex - 1);\n const nextCharacter = file.content.charAt(pathAtIndex + path.length);\n\n const line = (file.content.substring(0, match.index).match(/\\n/g) || []).length + 1;\n yield {\n path,\n previousCharacter,\n nextCharacter,\n file: file.fileName,\n line,\n };\n }\n}\n\n/**\n * Extracts translation keys from methods such as `$t` and `$tc`.\n *\n * - **regexp pattern**: (?:[$\\s.:\"'`+\\(\\[\\{]t[cm]?)\\(\n *\n * **description**: Matches the sequence t(, tc( or tm(, optionally with either “$”, SPACE, “.”, “:”, “\"”, “'”,\n * “`”, \"+\", \"(\", \"[\" or \"{\" in front of it.\n *\n * - **regexp pattern**: ([\"'`])\n *\n * **description**: 1. capturing group. Matches either “\"”, “'”, or “`”.\n *\n * - **regexp pattern**: ((?:[^\\\\]|\\\\.)*?)\n *\n * **description**: 2. capturing group. Matches anything except a backslash\n * *or* matches any backslash followed by any character (e.g. “\\\"”, “\\`”, “\\t”, etc.)\n *\n * - **regexp pattern**: \\1\n *\n * **description**: matches whatever was matched by capturing group 1 (e.g. the starting string character)\n *\n * @param file a file object\n * @returns a list of translation keys found in `file`.\n */\n function extractMethodMatches (file: SimpleFile): I18NItemWithBounding[] {\n const methodRegExp = /(?:[$\\s.:\"'`+\\(\\[\\{]t[cm]?)\\(\\s*?([\"'`])((?:[^\\\\]|\\\\.)*?)\\1/g;\n return [ ...getMatches(file, methodRegExp, 2) ];\n}\n\nfunction extractComponentMatches (file: SimpleFile): I18NItemWithBounding[] {\n const componentRegExp = /(?:(?:<|h\\()(?:i18n|Translation))(?:.|\\n)*?(?:\\s(?:(?:key)?)path(?:=|: )(\"|'))((?:[^\\\\]|\\\\.)*?)\\1/gi;\n return [ ...getMatches(file, componentRegExp, 2) ];\n}\n\nfunction extractDirectiveMatches (file: SimpleFile): I18NItemWithBounding[] {\n const directiveRegExp = /\\bv-t(?:\\.[\\w-]+)?=\"'((?:[^\\\\]|\\\\.)*?)'\"/g;\n return [ ...getMatches(file, directiveRegExp) ];\n}\n\nexport function extractI18NItemsFromVueFiles (sourceFiles: SimpleFile[]): I18NItemWithBounding[] {\n return sourceFiles.reduce((accumulator, file) => {\n const methodMatches = extractMethodMatches(file);\n const componentMatches = extractComponentMatches(file);\n const directiveMatches = extractDirectiveMatches(file);\n return [\n ...accumulator,\n ...methodMatches,\n ...componentMatches,\n ...directiveMatches,\n ];\n }, [] as I18NItemWithBounding[]);\n}\n\n// This is a convenience function for users implementing in their own projects, and isn't used internally\nexport function parseVueFiles (vueFiles: string): I18NItemWithBounding[] {\n return extractI18NItemsFromVueFiles(readVueFiles(vueFiles));\n}\n","import path from 'path';\nimport fs from 'fs';\nimport glob from 'glob';\nimport Dot from 'dot-object';\nimport yaml from 'js-yaml';\nimport isValidGlob from 'is-valid-glob';\nimport { SimpleFile, I18NLanguage, I18NItem } from '../types';\n\nexport function readLanguageFiles (src: string): SimpleFile[] {\n // Replace backslash path segments to make the path work with the glob package.\n // https://github.com/Spittal/vue-i18n-extract/issues/159\n const normalizedSrc = src.replace(/\\\\/g, '/');\n if (!isValidGlob(normalizedSrc)) {\n throw new Error(`languageFiles isn't a valid glob pattern.`);\n }\n\n const targetFiles = glob.sync(normalizedSrc);\n\n if (targetFiles.length === 0) {\n throw new Error('languageFiles glob has no files.');\n }\n\n return targetFiles.map(f => {\n const langPath = path.resolve(process.cwd(), f);\n\n const extension = langPath.substring(langPath.lastIndexOf('.')).toLowerCase();\n const isJSON = extension === '.json';\n const isYAML = extension === '.yaml' || extension === '.yml';\n\n let langObj;\n if (isJSON) {\n langObj = JSON.parse(fs.readFileSync(langPath, 'utf8'));\n } else if (isYAML) {\n langObj = yaml.load(fs.readFileSync(langPath, 'utf8'));\n } else {\n langObj = eval(fs.readFileSync(langPath, 'utf8'));\n }\n\n const fileName = f.replace(process.cwd(), '.');\n\n return { path: f, fileName, content: JSON.stringify(langObj) };\n });\n}\n\nexport function extractI18NLanguageFromLanguageFiles (languageFiles: SimpleFile[], dot: DotObject.Dot = Dot): I18NLanguage {\n return languageFiles.reduce((accumulator, file) => {\n const language = file.fileName.substring(file.fileName.lastIndexOf('/') + 1, file.fileName.lastIndexOf('.'));\n\n if (!accumulator[language]) {\n accumulator[language] = [];\n }\n\n const flattenedObject = dot.dot(JSON.parse(file.content));\n Object.keys(flattenedObject).forEach((key) => {\n accumulator[language].push({\n path: key,\n file: file.fileName,\n });\n });\n\n return accumulator;\n }, {});\n}\n\nexport function writeMissingToLanguageFiles (parsedLanguageFiles: SimpleFile[], missingKeys: I18NItem[], dot: DotObject.Dot = Dot, noEmptyTranslation = ''): void {\n parsedLanguageFiles.forEach(languageFile => {\n const languageFileContent = JSON.parse(languageFile.content);\n\n missingKeys.forEach(item => {\n if (item.language && languageFile.fileName.includes(item.language) || !item.language) {\n const addDefaultTranslation = (noEmptyTranslation) && ((noEmptyTranslation === '*') || (noEmptyTranslation === item.language));\n dot.str(item.path, addDefaultTranslation ? item.path : '', languageFileContent);\n }\n });\n\n writeLanguageFile(languageFile, languageFileContent);\n });\n}\n\nexport function removeUnusedFromLanguageFiles (parsedLanguageFiles: SimpleFile[], unusedKeys: I18NItem[], dot: DotObject.Dot = Dot): void {\n parsedLanguageFiles.forEach(languageFile => {\n const languageFileContent = JSON.parse(languageFile.content);\n\n unusedKeys.forEach(item => {\n if (item.language && languageFile.fileName.includes(item.language)) {\n dot.delete(item.path, languageFileContent);\n }\n });\n\n writeLanguageFile(languageFile, languageFileContent);\n });\n}\n\nfunction writeLanguageFile (languageFile: SimpleFile, newLanguageFileContent: unknown) {\n const fileExtension = languageFile.fileName.substring(languageFile.fileName.lastIndexOf('.') + 1);\n const filePath = languageFile.path;\n const stringifiedContent = JSON.stringify(newLanguageFileContent, null, 2);\n\n if (fileExtension === 'json') {\n fs.writeFileSync(filePath, stringifiedContent);\n } else if (fileExtension === 'js') {\n const jsFile = `module.exports = ${stringifiedContent}; \\n`;\n fs.writeFileSync(filePath, jsFile);\n } else if (fileExtension === 'yaml' || fileExtension === 'yml') {\n const yamlFile = yaml.dump(newLanguageFileContent);\n fs.writeFileSync(filePath, yamlFile);\n } else {\n throw new Error(`Language filetype of ${fileExtension} not supported.`)\n }\n}\n\n// This is a convenience function for users implementing in their own projects, and isn't used internally\nexport function parselanguageFiles (languageFiles: string, dot: DotObject.Dot = Dot): I18NLanguage {\n return extractI18NLanguageFromLanguageFiles(readLanguageFiles(languageFiles), dot);\n}\n","import fs from 'fs';\nimport { DetectionType, I18NItem, I18NItemWithBounding, I18NLanguage, I18NReport } from '../types';\n\nfunction stripBounding (item: I18NItemWithBounding): I18NItem {\n return {\n path: item.path,\n file: item.file,\n line: item.line,\n }\n}\n\nfunction mightBeDynamic (item: I18NItemWithBounding): boolean {\n return item.path.includes('${') && !!item.previousCharacter.match(/`/g) && !!item.nextCharacter.match(/`/g);\n}\n\n// Looping through the arays multiple times might not be the most effecient, but it's the easiest to read and debug. Which at this scale is an accepted trade-off.\nexport function extractI18NReport (vueItems: I18NItemWithBounding[], languageFiles: I18NLanguage, detect: DetectionType[]): I18NReport {\n const missingKeys: I18NItem[] = [];\n const unusedKeys: I18NItem[] = [];\n const maybeDynamicKeys: I18NItem[] = [];\n\n if (detect.includes(DetectionType.Dynamic)) {\n maybeDynamicKeys. push( ...vueItems\n .filter(vueItem => mightBeDynamic(vueItem))\n .map(vueItem => stripBounding(vueItem)));\n }\n\n Object.keys(languageFiles).forEach(language => {\n const languageItems = languageFiles[language];\n\n if (detect.includes(DetectionType.Missing)) {\n const missingKeysInLanguage = vueItems\n .filter(vueItem => !mightBeDynamic(vueItem))\n .filter(vueItem => !languageItems.some(languageItem => vueItem.path === languageItem.path))\n .map(vueItem => ({ ...stripBounding(vueItem), language }));\n\n missingKeys.push(...missingKeysInLanguage);\n }\n\n if (detect.includes(DetectionType.Unused)) {\n const unusedKeysInLanguage = languageItems\n .filter(languageItem => !vueItems.some(vueItem => languageItem.path === vueItem.path || languageItem.path.startsWith(vueItem.path + '.')))\n .filter(item => !maybeDynamicKeys.some(dynKey => new RegExp(dynKey.path.replace(/\\$\\{[^}]+\\}/g, `\\\\w+`), 'i').test(item.path)))\n .map(languageItem => ({ ...languageItem, language }))\n\n unusedKeys.push(...unusedKeysInLanguage);\n }\n });\n\n return {\n missingKeys,\n unusedKeys,\n maybeDynamicKeys,\n };\n}\n\nexport async function writeReportToFile (report: I18NReport, writePath: string): Promise<NodeJS.ErrnoException | void> {\n const reportString = JSON.stringify(report);\n return new Promise((resolve, reject) => {\n fs.writeFile(\n writePath,\n reportString,\n (err) => {\n if (err) {\n reject(err);\n return;\n }\n resolve();\n },\n );\n });\n}\n\n","import path from 'path';\nimport { ReportOptions, I18NReport, DetectionType } from '../types';\nimport { readVueFiles, extractI18NItemsFromVueFiles } from './vue-files';\nimport { readLanguageFiles, extractI18NLanguageFromLanguageFiles, removeUnusedFromLanguageFiles, writeMissingToLanguageFiles } from './language-files';\nimport { extractI18NReport, writeReportToFile } from './report';\nimport Dot from 'dot-object';\n\nexport async function createI18NReport (options: ReportOptions): Promise<I18NReport> {\n const {\n vueFiles: vueFilesGlob,\n languageFiles: languageFilesGlob,\n output,\n add,\n remove,\n exclude = [],\n ci,\n separator,\n noEmptyTranslation = '',\n detect = [DetectionType.Missing, DetectionType.Unused, DetectionType.Dynamic]\n } = options;\n\n if (!vueFilesGlob) throw new Error('Required configuration vueFiles is missing.');\n if (!languageFilesGlob) throw new Error('Required configuration languageFiles is missing.');\n \n let issuesToDetect = Array.isArray(detect) ? detect : [detect];\n const invalidDetectOptions = issuesToDetect.filter(item => !Object.values(DetectionType).includes(item));\n if (invalidDetectOptions.length) {\n throw new Error(`Invalid 'detect' value(s): ${invalidDetectOptions}`);\n }\n\n const dot = typeof separator === 'string' ? new Dot(separator) : Dot;\n const vueFiles = readVueFiles(path.resolve(process.cwd(), vueFilesGlob));\n const languageFiles = readLanguageFiles(path.resolve(process.cwd(), languageFilesGlob));\n\n const I18NItems = extractI18NItemsFromVueFiles(vueFiles);\n const I18NLanguage = extractI18NLanguageFromLanguageFiles(languageFiles, dot);\n\n const report = extractI18NReport(I18NItems, I18NLanguage, issuesToDetect);\n\n report.unusedKeys = report.unusedKeys.filter(key =>\n !exclude.filter(excluded => key.path.startsWith(excluded)).length)\n\n if (report.missingKeys.length) console.info('\\nMissing Keys'), console.table(report.missingKeys);\n if (report.unusedKeys.length) console.info('\\nUnused Keys'), console.table(report.unusedKeys);\n 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);\n\n if (output) {\n await writeReportToFile(report, path.resolve(process.cwd(), output));\n console.info(`\\nThe report has been has been saved to ${output}`);\n }\n\n if (remove && report.unusedKeys.length) {\n removeUnusedFromLanguageFiles(languageFiles, report.unusedKeys, dot);\n console.info('\\nThe unused keys have been removed from your language files.');\n }\n\n if (add && report.missingKeys.length) {\n writeMissingToLanguageFiles(languageFiles, report.missingKeys, dot, noEmptyTranslation);\n console.info('\\nThe missing keys have been added to your language files.');\n }\n\n if (ci && report.missingKeys.length) {\n throw new Error(`${report.missingKeys.length} missing keys found.`);\n }\n\n if (ci && report.unusedKeys.length) {\n throw new Error(`${report.unusedKeys.length} unused keys found.`);\n }\n\n return report;\n}\n\nexport * from './vue-files';\nexport * from './language-files';\nexport * from './report';\n","export * from './config-file';\nexport * from './create-report';\nexport * from './types';\n\nprocess.on('uncaughtException', (err) => {\n console.error('[vue-i18n-extract]', err);\n process.exit(1);\n});\n\nprocess.on('unhandledRejection', (err) => {\n console.error('[vue-i18n-extract]', err);\n process.exit(1);\n});\n"],"names":["vueFiles","languageFiles","exclude","output","add","remove","ci","separator","noEmptyTranslation","initCommand","fs","writeFileSync","path","resolve","process","cwd","JSON","stringify","defaultConfig","resolveConfig","argvOptions","cac","parse","argv","run","options","pathToConfigFile","configOptions","require","console","info","_extends","_unused","Array","isArray","DetectionType","readVueFiles","src","normalizedSrc","replace","isValidGlob","Error","targetFiles","glob","sync","length","map","f","fileName","content","readFileSync","getMatches","file","regExp","captureGroup","match","exec","pathAtIndex","indexOf","previousCharacter","charAt","nextCharacter","line","substring","index","extractMethodMatches","methodRegExp","extractComponentMatches","componentRegExp","extractDirectiveMatches","directiveRegExp","extractI18NItemsFromVueFiles","sourceFiles","reduce","accumulator","methodMatches","componentMatches","directiveMatches","parseVueFiles","readLanguageFiles","langPath","extension","lastIndexOf","toLowerCase","isJSON","isYAML","langObj","yaml","load","eval","extractI18NLanguageFromLanguageFiles","dot","Dot","language","flattenedObject","Object","keys","forEach","key","push","writeMissingToLanguageFiles","parsedLanguageFiles","missingKeys","languageFile","languageFileContent","item","includes","addDefaultTranslation","str","writeLanguageFile","removeUnusedFromLanguageFiles","unusedKeys","delete","newLanguageFileContent","fileExtension","filePath","stringifiedContent","jsFile","yamlFile","dump","parselanguageFiles","stripBounding","mightBeDynamic","extractI18NReport","vueItems","detect","maybeDynamicKeys","Dynamic","filter","vueItem","languageItems","Missing","missingKeysInLanguage","some","languageItem","Unused","unusedKeysInLanguage","startsWith","dynKey","RegExp","test","writeReportToFile","report","writePath","reportString","Promise","reject","writeFile","err","createI18NReport","vueFilesGlob","languageFilesGlob","issuesToDetect","invalidDetectOptions","values","I18NItems","I18NLanguage","excluded","table","warn","on","error","exit"],"mappings":"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"}