diff --git a/dist/create-report/language-files.d.ts b/dist/create-report/language-files.d.ts index 606e8a88..5dba6b6d 100644 --- a/dist/create-report/language-files.d.ts +++ b/dist/create-report/language-files.d.ts @@ -1,6 +1,7 @@ /// -import { SimpleFile, I18NLanguage, I18NItem } from '../types'; +import { SimpleFile, I18NLanguage, I18NItem, I18NItemWithBounding } from '../types'; export declare function readLanguageFiles(src: string): SimpleFile[]; +export declare function extractI18NItemsFromLanguageFiles(languageFiles: SimpleFile[]): I18NItemWithBounding[]; export declare function extractI18NLanguageFromLanguageFiles(languageFiles: SimpleFile[], dot?: DotObject.Dot): I18NLanguage; export declare function writeMissingToLanguageFiles(parsedLanguageFiles: SimpleFile[], missingKeys: I18NItem[], dot?: DotObject.Dot, noEmptyTranslation?: string): void; export declare function removeUnusedFromLanguageFiles(parsedLanguageFiles: SimpleFile[], unusedKeys: I18NItem[], dot?: DotObject.Dot): void; diff --git a/dist/vue-i18n-extract.modern.mjs b/dist/vue-i18n-extract.modern.mjs index 670733ed..b9859f12 100644 --- a/dist/vue-i18n-extract.modern.mjs +++ b/dist/vue-i18n-extract.modern.mjs @@ -86,7 +86,7 @@ function readVueFiles(src) { }); } -function* getMatches(file, regExp, captureGroup = 1) { +function* getMatches$1(file, regExp, captureGroup = 1) { while (true) { const match = regExp.exec(file.content); @@ -136,17 +136,17 @@ function* getMatches(file, regExp, captureGroup = 1) { function extractMethodMatches(file) { const methodRegExp = /(?:[$\s.:"'`+\(\[\{]t[cm]?)\(\s*?(["'`])((?:[^\\]|\\.)*?)\1/g; - return [...getMatches(file, methodRegExp, 2)]; + return [...getMatches$1(file, methodRegExp, 2)]; } function extractComponentMatches(file) { const componentRegExp = /(?:(?:<|h\()(?:i18n|Translation))(?:.|\n)*?(?:[^:]path(?:=|: )("|'))((?:[^\\]|\\.)*?)\1/gi; - return [...getMatches(file, componentRegExp, 2)]; + return [...getMatches$1(file, componentRegExp, 2)]; } function extractDirectiveMatches(file) { const directiveRegExp = /\bv-t(?:\.[\w-]+)?="'((?:[^\\]|\\.)*?)'"/g; - return [...getMatches(file, directiveRegExp)]; + return [...getMatches$1(file, directiveRegExp)]; } function extractI18NItemsFromVueFiles(sourceFiles) { @@ -200,6 +200,41 @@ function readLanguageFiles(src) { }; }); } + +function* getMatches(file, regExp, captureGroup = 1) { + while (true) { + const match = regExp.exec(file.content); + + if (match === null) { + break; + } + + const path = match[captureGroup]; + const pathAtIndex = file.content.indexOf(path); + const previousCharacter = file.content.charAt(pathAtIndex - 1); + const nextCharacter = file.content.charAt(pathAtIndex + path.length); + const line = (file.content.substring(0, match.index).match(/\n/g) || []).length + 1; + yield { + path, + previousCharacter, + nextCharacter, + file: file.fileName, + line + }; + } +} + +function extractMessageLinkMatches(file) { + const messageLinkRegExp = /@:((?:[^\\]|\\.)*?)[\s"'`]/g; + return [...getMatches(file, messageLinkRegExp, 2)]; +} + +function extractI18NItemsFromLanguageFiles(languageFiles) { + return languageFiles.reduce((accumulator, file) => { + const messageLinkMatches = extractMessageLinkMatches(file); + return [...accumulator, ...messageLinkMatches]; + }, []); +} function extractI18NLanguageFromLanguageFiles(languageFiles, dot = Dot) { return languageFiles.reduce((accumulator, file) => { const language = file.fileName.substring(file.fileName.lastIndexOf('/') + 1, file.fileName.lastIndexOf('.')); @@ -330,7 +365,7 @@ async function createI18NReport(options) { 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 I18NItems = [...extractI18NItemsFromVueFiles(vueFiles), ...extractI18NItemsFromLanguageFiles(languageFiles)]; const I18NLanguage = extractI18NLanguageFromLanguageFiles(languageFiles, dot); const report = extractI18NReport(I18NItems, I18NLanguage); report.unusedKeys = report.unusedKeys.filter(key => !exclude.filter(excluded => key.path.startsWith(excluded)).length); @@ -373,5 +408,5 @@ process.on('unhandledRejection', err => { process.exit(1); }); -export { createI18NReport, extractI18NItemsFromVueFiles, extractI18NLanguageFromLanguageFiles, extractI18NReport, initCommand, parseVueFiles, parselanguageFiles, readLanguageFiles, readVueFiles, removeUnusedFromLanguageFiles, resolveConfig, writeMissingToLanguageFiles, writeReportToFile }; +export { createI18NReport, extractI18NItemsFromLanguageFiles, extractI18NItemsFromVueFiles, extractI18NLanguageFromLanguageFiles, extractI18NReport, initCommand, parseVueFiles, parselanguageFiles, readLanguageFiles, readVueFiles, removeUnusedFromLanguageFiles, resolveConfig, writeMissingToLanguageFiles, writeReportToFile }; //# sourceMappingURL=vue-i18n-extract.modern.mjs.map diff --git a/dist/vue-i18n-extract.modern.mjs.map b/dist/vue-i18n-extract.modern.mjs.map index bc36f8d0..5e338a7e 100644 --- a/dist/vue-i18n-extract.modern.mjs.map +++ b/dist/vue-i18n-extract.modern.mjs.map @@ -1 +1 @@ -{"version":3,"file":"vue-i18n-extract.modern.mjs","sources":["../src/config-file/vue-i18n-extract.config.ts","../src/config-file/index.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 {\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","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 {\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)*?(?:[^:]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 { 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): I18NReport {\n const missingKeys: I18NItem[] = [];\n const unusedKeys: I18NItem[] = [];\n\n const maybeDynamicKeys: I18NItem[] = vueItems\n .filter(vueItem => mightBeDynamic(vueItem))\n .map(vueItem => stripBounding(vueItem));\n\n Object.keys(languageFiles).forEach(language => {\n const languageItems = languageFiles[language];\n\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 const unusedKeysInLanguage = languageItems\n .filter(languageItem => !vueItems.some(vueItem => languageItem.path === vueItem.path || languageItem.path.startsWith(vueItem.path + '.')))\n .map(languageItem => ({ ...languageItem, language }));\n\n missingKeys.push(...missingKeysInLanguage);\n unusedKeys.push(...unusedKeysInLanguage);\n });\n\n return {\n missingKeys,\n unusedKeys,\n maybeDynamicKeys,\n };\n}\n\nexport async function writeReportToFile (report: I18NReport, writePath: string): Promise {\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 } 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 {\n const {\n vueFiles: vueFilesGlob,\n languageFiles: languageFilesGlob,\n output,\n add,\n remove,\n exclude = [],\n ci,\n separator,\n noEmptyTranslation = '',\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 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);\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","Array","isArray","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","maybeDynamicKeys","filter","vueItem","languageItems","missingKeysInLanguage","some","languageItem","unusedKeysInLanguage","startsWith","writeReportToFile","report","writePath","reportString","Promise","reject","writeFile","err","createI18NReport","vueFilesGlob","languageFilesGlob","I18NItems","I18NLanguage","excluded","table","warn","on","error","exit"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"vue-i18n-extract.modern.mjs","sources":["../src/config-file/vue-i18n-extract.config.ts","../src/config-file/index.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 {\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","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 {\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)*?(?:[^:]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, I18NItemWithBounding } 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\nfunction* getMatches (file: SimpleFile, regExp: RegExp, captureGroup = 1): IterableIterator {\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\nfunction extractMessageLinkMatches (file: SimpleFile): I18NItemWithBounding[] {\n const messageLinkRegExp = /@:((?:[^\\\\]|\\\\.)*?)[\\s\"'`]/g;\n return [ ...getMatches(file, messageLinkRegExp, 2) ];\n}\n\nexport function extractI18NItemsFromLanguageFiles (languageFiles: SimpleFile[]): I18NItemWithBounding[] {\n return languageFiles.reduce((accumulator, file) => {\n const messageLinkMatches = extractMessageLinkMatches(file);\n return [\n ...accumulator,\n ...messageLinkMatches,\n ];\n }, [] as I18NItemWithBounding[]);\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 { 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): I18NReport {\n const missingKeys: I18NItem[] = [];\n const unusedKeys: I18NItem[] = [];\n\n const maybeDynamicKeys: I18NItem[] = vueItems\n .filter(vueItem => mightBeDynamic(vueItem))\n .map(vueItem => stripBounding(vueItem));\n\n Object.keys(languageFiles).forEach(language => {\n const languageItems = languageFiles[language];\n\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 const unusedKeysInLanguage = languageItems\n .filter(languageItem => !vueItems.some(vueItem => languageItem.path === vueItem.path || languageItem.path.startsWith(vueItem.path + '.')))\n .map(languageItem => ({ ...languageItem, language }));\n\n missingKeys.push(...missingKeysInLanguage);\n unusedKeys.push(...unusedKeysInLanguage);\n });\n\n return {\n missingKeys,\n unusedKeys,\n maybeDynamicKeys,\n };\n}\n\nexport async function writeReportToFile (report: I18NReport, writePath: string): Promise {\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 } from '../types';\nimport { readVueFiles, extractI18NItemsFromVueFiles } from './vue-files';\nimport { readLanguageFiles, extractI18NItemsFromLanguageFiles, extractI18NLanguageFromLanguageFiles, removeUnusedFromLanguageFiles, writeMissingToLanguageFiles } from './language-files';\nimport { extractI18NReport, writeReportToFile } from './report';\nimport Dot from 'dot-object';\n\nexport async function createI18NReport (options: ReportOptions): Promise {\n const {\n vueFiles: vueFilesGlob,\n languageFiles: languageFilesGlob,\n output,\n add,\n remove,\n exclude = [],\n ci,\n separator,\n noEmptyTranslation = '',\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 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 = [\n ...extractI18NItemsFromVueFiles(vueFiles),\n ...extractI18NItemsFromLanguageFiles(languageFiles),\n ];\n const I18NLanguage = extractI18NLanguageFromLanguageFiles(languageFiles, dot);\n\n const report = extractI18NReport(I18NItems, I18NLanguage);\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","Array","isArray","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","extractMessageLinkMatches","messageLinkRegExp","extractI18NItemsFromLanguageFiles","messageLinkMatches","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","maybeDynamicKeys","filter","vueItem","languageItems","missingKeysInLanguage","some","languageItem","unusedKeysInLanguage","startsWith","writeReportToFile","report","writePath","reportString","Promise","reject","writeFile","err","createI18NReport","vueFilesGlob","languageFilesGlob","I18NItems","I18NLanguage","excluded","table","warn","on","error","exit"],"mappings":"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"} \ No newline at end of file diff --git a/dist/vue-i18n-extract.umd.js b/dist/vue-i18n-extract.umd.js index ca19c7a2..b94fd74f 100644 --- a/dist/vue-i18n-extract.umd.js +++ b/dist/vue-i18n-extract.umd.js @@ -93,7 +93,7 @@ }); } - function* getMatches(file, regExp, captureGroup = 1) { + function* getMatches$1(file, regExp, captureGroup = 1) { while (true) { const match = regExp.exec(file.content); @@ -143,17 +143,17 @@ function extractMethodMatches(file) { const methodRegExp = /(?:[$\s.:"'`+\(\[\{]t[cm]?)\(\s*?(["'`])((?:[^\\]|\\.)*?)\1/g; - return [...getMatches(file, methodRegExp, 2)]; + return [...getMatches$1(file, methodRegExp, 2)]; } function extractComponentMatches(file) { const componentRegExp = /(?:(?:<|h\()(?:i18n|Translation))(?:.|\n)*?(?:[^:]path(?:=|: )("|'))((?:[^\\]|\\.)*?)\1/gi; - return [...getMatches(file, componentRegExp, 2)]; + return [...getMatches$1(file, componentRegExp, 2)]; } function extractDirectiveMatches(file) { const directiveRegExp = /\bv-t(?:\.[\w-]+)?="'((?:[^\\]|\\.)*?)'"/g; - return [...getMatches(file, directiveRegExp)]; + return [...getMatches$1(file, directiveRegExp)]; } function extractI18NItemsFromVueFiles(sourceFiles) { @@ -207,6 +207,41 @@ }; }); } + + function* getMatches(file, regExp, captureGroup = 1) { + while (true) { + const match = regExp.exec(file.content); + + if (match === null) { + break; + } + + const path = match[captureGroup]; + const pathAtIndex = file.content.indexOf(path); + const previousCharacter = file.content.charAt(pathAtIndex - 1); + const nextCharacter = file.content.charAt(pathAtIndex + path.length); + const line = (file.content.substring(0, match.index).match(/\n/g) || []).length + 1; + yield { + path, + previousCharacter, + nextCharacter, + file: file.fileName, + line + }; + } + } + + function extractMessageLinkMatches(file) { + const messageLinkRegExp = /@:((?:[^\\]|\\.)*?)[\s"'`]/g; + return [...getMatches(file, messageLinkRegExp, 2)]; + } + + function extractI18NItemsFromLanguageFiles(languageFiles) { + return languageFiles.reduce((accumulator, file) => { + const messageLinkMatches = extractMessageLinkMatches(file); + return [...accumulator, ...messageLinkMatches]; + }, []); + } function extractI18NLanguageFromLanguageFiles(languageFiles, dot = Dot__default["default"]) { return languageFiles.reduce((accumulator, file) => { const language = file.fileName.substring(file.fileName.lastIndexOf('/') + 1, file.fileName.lastIndexOf('.')); @@ -337,7 +372,7 @@ const dot = typeof separator === 'string' ? new Dot__default["default"](separator) : Dot__default["default"]; const vueFiles = readVueFiles(path__default["default"].resolve(process.cwd(), vueFilesGlob)); const languageFiles = readLanguageFiles(path__default["default"].resolve(process.cwd(), languageFilesGlob)); - const I18NItems = extractI18NItemsFromVueFiles(vueFiles); + const I18NItems = [...extractI18NItemsFromVueFiles(vueFiles), ...extractI18NItemsFromLanguageFiles(languageFiles)]; const I18NLanguage = extractI18NLanguageFromLanguageFiles(languageFiles, dot); const report = extractI18NReport(I18NItems, I18NLanguage); report.unusedKeys = report.unusedKeys.filter(key => !exclude.filter(excluded => key.path.startsWith(excluded)).length); @@ -381,6 +416,7 @@ }); exports.createI18NReport = createI18NReport; + exports.extractI18NItemsFromLanguageFiles = extractI18NItemsFromLanguageFiles; exports.extractI18NItemsFromVueFiles = extractI18NItemsFromVueFiles; exports.extractI18NLanguageFromLanguageFiles = extractI18NLanguageFromLanguageFiles; exports.extractI18NReport = extractI18NReport; diff --git a/dist/vue-i18n-extract.umd.js.map b/dist/vue-i18n-extract.umd.js.map index 3c6bf1ea..6ac80ea0 100644 --- a/dist/vue-i18n-extract.umd.js.map +++ b/dist/vue-i18n-extract.umd.js.map @@ -1 +1 @@ -{"version":3,"file":"vue-i18n-extract.umd.js","sources":["../src/config-file/vue-i18n-extract.config.ts","../src/config-file/index.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 {\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","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 {\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)*?(?:[^:]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 { 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): I18NReport {\n const missingKeys: I18NItem[] = [];\n const unusedKeys: I18NItem[] = [];\n\n const maybeDynamicKeys: I18NItem[] = vueItems\n .filter(vueItem => mightBeDynamic(vueItem))\n .map(vueItem => stripBounding(vueItem));\n\n Object.keys(languageFiles).forEach(language => {\n const languageItems = languageFiles[language];\n\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 const unusedKeysInLanguage = languageItems\n .filter(languageItem => !vueItems.some(vueItem => languageItem.path === vueItem.path || languageItem.path.startsWith(vueItem.path + '.')))\n .map(languageItem => ({ ...languageItem, language }));\n\n missingKeys.push(...missingKeysInLanguage);\n unusedKeys.push(...unusedKeysInLanguage);\n });\n\n return {\n missingKeys,\n unusedKeys,\n maybeDynamicKeys,\n };\n}\n\nexport async function writeReportToFile (report: I18NReport, writePath: string): Promise {\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 } 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 {\n const {\n vueFiles: vueFilesGlob,\n languageFiles: languageFilesGlob,\n output,\n add,\n remove,\n exclude = [],\n ci,\n separator,\n noEmptyTranslation = '',\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 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);\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","Array","isArray","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","maybeDynamicKeys","filter","vueItem","languageItems","missingKeysInLanguage","some","languageItem","unusedKeysInLanguage","startsWith","writeReportToFile","report","writePath","reportString","Promise","reject","writeFile","err","createI18NReport","vueFilesGlob","languageFilesGlob","I18NItems","I18NLanguage","excluded","table","warn","on","error","exit"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"vue-i18n-extract.umd.js","sources":["../src/config-file/vue-i18n-extract.config.ts","../src/config-file/index.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 {\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","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 {\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)*?(?:[^:]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, I18NItemWithBounding } 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\nfunction* getMatches (file: SimpleFile, regExp: RegExp, captureGroup = 1): IterableIterator {\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\nfunction extractMessageLinkMatches (file: SimpleFile): I18NItemWithBounding[] {\n const messageLinkRegExp = /@:((?:[^\\\\]|\\\\.)*?)[\\s\"'`]/g;\n return [ ...getMatches(file, messageLinkRegExp, 2) ];\n}\n\nexport function extractI18NItemsFromLanguageFiles (languageFiles: SimpleFile[]): I18NItemWithBounding[] {\n return languageFiles.reduce((accumulator, file) => {\n const messageLinkMatches = extractMessageLinkMatches(file);\n return [\n ...accumulator,\n ...messageLinkMatches,\n ];\n }, [] as I18NItemWithBounding[]);\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 { 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): I18NReport {\n const missingKeys: I18NItem[] = [];\n const unusedKeys: I18NItem[] = [];\n\n const maybeDynamicKeys: I18NItem[] = vueItems\n .filter(vueItem => mightBeDynamic(vueItem))\n .map(vueItem => stripBounding(vueItem));\n\n Object.keys(languageFiles).forEach(language => {\n const languageItems = languageFiles[language];\n\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 const unusedKeysInLanguage = languageItems\n .filter(languageItem => !vueItems.some(vueItem => languageItem.path === vueItem.path || languageItem.path.startsWith(vueItem.path + '.')))\n .map(languageItem => ({ ...languageItem, language }));\n\n missingKeys.push(...missingKeysInLanguage);\n unusedKeys.push(...unusedKeysInLanguage);\n });\n\n return {\n missingKeys,\n unusedKeys,\n maybeDynamicKeys,\n };\n}\n\nexport async function writeReportToFile (report: I18NReport, writePath: string): Promise {\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 } from '../types';\nimport { readVueFiles, extractI18NItemsFromVueFiles } from './vue-files';\nimport { readLanguageFiles, extractI18NItemsFromLanguageFiles, extractI18NLanguageFromLanguageFiles, removeUnusedFromLanguageFiles, writeMissingToLanguageFiles } from './language-files';\nimport { extractI18NReport, writeReportToFile } from './report';\nimport Dot from 'dot-object';\n\nexport async function createI18NReport (options: ReportOptions): Promise {\n const {\n vueFiles: vueFilesGlob,\n languageFiles: languageFilesGlob,\n output,\n add,\n remove,\n exclude = [],\n ci,\n separator,\n noEmptyTranslation = '',\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 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 = [\n ...extractI18NItemsFromVueFiles(vueFiles),\n ...extractI18NItemsFromLanguageFiles(languageFiles),\n ];\n const I18NLanguage = extractI18NLanguageFromLanguageFiles(languageFiles, dot);\n\n const report = extractI18NReport(I18NItems, I18NLanguage);\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","Array","isArray","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","extractMessageLinkMatches","messageLinkRegExp","extractI18NItemsFromLanguageFiles","messageLinkMatches","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","maybeDynamicKeys","filter","vueItem","languageItems","missingKeysInLanguage","some","languageItem","unusedKeysInLanguage","startsWith","writeReportToFile","report","writePath","reportString","Promise","reject","writeFile","err","createI18NReport","vueFilesGlob","languageFilesGlob","I18NItems","I18NLanguage","excluded","table","warn","on","error","exit"],"mappings":"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"} \ No newline at end of file diff --git a/src/create-report/index.ts b/src/create-report/index.ts index 1f14bfc4..3fa2c045 100644 --- a/src/create-report/index.ts +++ b/src/create-report/index.ts @@ -1,7 +1,7 @@ import path from 'path'; import { ReportOptions, I18NReport } from '../types'; import { readVueFiles, extractI18NItemsFromVueFiles } from './vue-files'; -import { readLanguageFiles, extractI18NLanguageFromLanguageFiles, removeUnusedFromLanguageFiles, writeMissingToLanguageFiles } from './language-files'; +import { readLanguageFiles, extractI18NItemsFromLanguageFiles, extractI18NLanguageFromLanguageFiles, removeUnusedFromLanguageFiles, writeMissingToLanguageFiles } from './language-files'; import { extractI18NReport, writeReportToFile } from './report'; import Dot from 'dot-object'; @@ -25,7 +25,10 @@ export async function createI18NReport (options: ReportOptions): Promise { + while (true) { + const match = regExp.exec(file.content); + if (match === null) { + break; + } + const path = match[captureGroup]; + + const pathAtIndex = file.content.indexOf(path); + const previousCharacter = file.content.charAt(pathAtIndex - 1); + const nextCharacter = file.content.charAt(pathAtIndex + path.length); + + const line = (file.content.substring(0, match.index).match(/\n/g) || []).length + 1; + yield { + path, + previousCharacter, + nextCharacter, + file: file.fileName, + line, + }; + } +} + +function extractMessageLinkMatches (file: SimpleFile): I18NItemWithBounding[] { + const messageLinkRegExp = /@:((?:[^\\]|\\.)*?)[\s"'`]/g; + return [ ...getMatches(file, messageLinkRegExp, 2) ]; +} + +export function extractI18NItemsFromLanguageFiles (languageFiles: SimpleFile[]): I18NItemWithBounding[] { + return languageFiles.reduce((accumulator, file) => { + const messageLinkMatches = extractMessageLinkMatches(file); + return [ + ...accumulator, + ...messageLinkMatches, + ]; + }, [] as I18NItemWithBounding[]); +} + export function extractI18NLanguageFromLanguageFiles (languageFiles: SimpleFile[], dot: DotObject.Dot = Dot): I18NLanguage { return languageFiles.reduce((accumulator, file) => { const language = file.fileName.substring(file.fileName.lastIndexOf('/') + 1, file.fileName.lastIndexOf('.')); diff --git a/tests/fixtures/expected-values.ts b/tests/fixtures/expected-values.ts index 761e304f..46ba26d8 100644 --- a/tests/fixtures/expected-values.ts +++ b/tests/fixtures/expected-values.ts @@ -21,81 +21,88 @@ export const expectedFromParsedVueFiles = [ line: 5 }, { - path: 'Key used as default translation. Second sentence.', + path: 'linked.composite', previousCharacter: "'", nextCharacter: "'", file: './tests/fixtures/vue-files/Basic.vue', line: 6 }, + { + path: 'Key used as default translation. Second sentence.', + previousCharacter: "'", + nextCharacter: "'", + file: './tests/fixtures/vue-files/Basic.vue', + line: 7 + }, { path: 'content.paragraph.p.2', previousCharacter: '`', nextCharacter: '`', file: './tests/fixtures/vue-files/Basic.vue', - line: 7 + line: 8 }, { path: 'content.link.b', previousCharacter: "'", nextCharacter: "'", file: './tests/fixtures/vue-files/Basic.vue', - line: 9 + line: 10 }, { path: 'content.link.b', previousCharacter: "'", nextCharacter: "'", file: './tests/fixtures/vue-files/Basic.vue', - line: 12 + line: 13 }, { path: 'content.link.b', previousCharacter: "'", nextCharacter: "'", file: './tests/fixtures/vue-files/Basic.vue', - line: 15 + line: 16 }, { path: 'header.title', previousCharacter: "'", nextCharacter: "'", file: './tests/fixtures/vue-files/Basic.vue', - line: 19 + line: 20 }, { path: 'content.link.a', previousCharacter: '"', nextCharacter: '"', file: './tests/fixtures/vue-files/Basic.vue', - line: 8 + line: 9 }, { path: 'content.link.a', previousCharacter: '"', nextCharacter: '"', file: './tests/fixtures/vue-files/Basic.vue', - line: 11 + line: 12 }, { path: 'content.link.a', previousCharacter: '"', nextCharacter: '"', file: './tests/fixtures/vue-files/Basic.vue', - line: 14 + line: 15 }, { path: 'header.title', previousCharacter: "'", nextCharacter: "'", file: './tests/fixtures/vue-files/Basic.vue', - line: 17 + line: 18 }, { path: 'header.title', previousCharacter: "'", nextCharacter: "'", file: './tests/fixtures/vue-files/Basic.vue', - line: 18 + line: 19 }, { path: "single \\' quote", @@ -282,6 +289,14 @@ export const expectedFromParsedLanguageFiles = { path: 'content.link.b', file: './tests/fixtures/lang/de_DE.js', }, + { + path: 'linked.referenced', + file: './tests/fixtures/lang/de_DE.js', + }, + { + path: 'linked.composite', + file: './tests/fixtures/lang/de_DE.js', + }, { path: 'Key used as default translation. Second sentence.', file: './tests/fixtures/lang/de_DE.js', @@ -332,6 +347,14 @@ export const expectedFromParsedLanguageFiles = { path: 'content.link.b', file: './tests/fixtures/lang/en_EN.json', }, + { + path: 'linked.referenced', + file: './tests/fixtures/lang/en_EN.json', + }, + { + path: 'linked.composite', + file: './tests/fixtures/lang/en_EN.json', + }, { path: 'Key used as default translation. Second sentence.', file: './tests/fixtures/lang/en_EN.json', diff --git a/tests/fixtures/lang/de_DE.js b/tests/fixtures/lang/de_DE.js index fed9ea31..a8e8f401 100644 --- a/tests/fixtures/lang/de_DE.js +++ b/tests/fixtures/lang/de_DE.js @@ -12,6 +12,10 @@ module.exports = { b: 'Here' } }, + linked: { + referenced: 'New!', + composite: '@:linked.referenced @:header.title' + }, 'Key used as default translation. Second sentence.': 'Key used as default translation. Second sentence.', 'Translation component in code.': 'Translation component in code.', missing: { diff --git a/tests/fixtures/lang/en_EN.json b/tests/fixtures/lang/en_EN.json index 791e89d3..54c29f5d 100644 --- a/tests/fixtures/lang/en_EN.json +++ b/tests/fixtures/lang/en_EN.json @@ -13,6 +13,10 @@ "b": "Here" } }, + "linked": { + "referenced": "New!", + "composite": "@:linked.referenced @:header.title" + }, "Key used as default translation. Second sentence.": "Key used as default translation. Second sentence.", "Translation component in code.": "Translation component in code.", "missing": { diff --git a/tests/fixtures/vue-files/Basic.vue b/tests/fixtures/vue-files/Basic.vue index bc94b4c2..9401d8b9 100644 --- a/tests/fixtures/vue-files/Basic.vue +++ b/tests/fixtures/vue-files/Basic.vue @@ -3,6 +3,7 @@ {{ $t('header.title') }} {{ $tm('header.title2') }} {{ $t("content.paragraph.p_1", { count: 'two' }) }} + {{ $t('linked.composite') }} {{ $t('Key used as default translation. Second sentence.') }} {{ $tc(`content.paragraph.p.2`, 2) }}
{{ $t("content.paragraph.p_1", { count: 'two' }) }}
{{ $t('linked.composite') }}
{{ $t('Key used as default translation. Second sentence.') }}
{{ $tc(`content.paragraph.p.2`, 2) }}