From 17d3b6075eb57b554bc5c1beb63704c5d0d29879 Mon Sep 17 00:00:00 2001 From: Thierry Michel Date: Fri, 29 Oct 2021 09:46:06 +0200 Subject: [PATCH] :sparkles: add 'silent' configuration option --- README.md | 4 ++++ bin/vue-i18n-extract.js | 4 ++++ dist/config-file/vue-i18n-extract.config.d.ts | 1 + dist/types.d.ts | 1 + dist/vue-i18n-extract.modern.js | 18 ++++++++++++------ dist/vue-i18n-extract.modern.js.map | 2 +- dist/vue-i18n-extract.umd.js | 18 ++++++++++++------ dist/vue-i18n-extract.umd.js.map | 2 +- src/config-file/vue-i18n-extract.config.ts | 1 + src/create-report/index.ts | 9 ++++++--- src/types.ts | 1 + tests/unit/create-report/index.spec.ts | 4 ++++ 12 files changed, 48 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index c253fe80..f5bf1cc0 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,10 @@ This will print out a table of missing keys in your language files, as well as u // Boolean // Use if you want to remove unused keys from your language files. +--silent +// Boolean +// Use if you want to remove `console.table` logs + --ci // Boolean // The process will exit with exitCode=1 if at least one translation key is missing or unused (useful if it is part of a CI pipeline). diff --git a/bin/vue-i18n-extract.js b/bin/vue-i18n-extract.js index f0474d4d..23b96742 100755 --- a/bin/vue-i18n-extract.js +++ b/bin/vue-i18n-extract.js @@ -27,6 +27,10 @@ cli '--remove', '[boolean] Use if you want to remove unused keys from your json language files.', ) + .option( + '--silent', + '[boolean] Use if you want to remove `console.table` logs.', + ) .option( '--ci', '[boolean] The process will exit with exitCode=1 if at least one translation-key is missing (useful expecially if it is part of a CI pipeline).', diff --git a/dist/config-file/vue-i18n-extract.config.d.ts b/dist/config-file/vue-i18n-extract.config.d.ts index c88418c2..b2f093f7 100644 --- a/dist/config-file/vue-i18n-extract.config.d.ts +++ b/dist/config-file/vue-i18n-extract.config.d.ts @@ -4,6 +4,7 @@ declare const _default: { output: boolean; add: boolean; remove: boolean; + silent: boolean; ci: boolean; separator: string; }; diff --git a/dist/types.d.ts b/dist/types.d.ts index eceff0c9..c0941bbe 100644 --- a/dist/types.d.ts +++ b/dist/types.d.ts @@ -4,6 +4,7 @@ export declare type ReportOptions = { output?: string; add?: boolean; remove?: boolean; + silent?: boolean; ci?: boolean; separator?: string; }; diff --git a/dist/vue-i18n-extract.modern.js b/dist/vue-i18n-extract.modern.js index 5c331914..4b6ff479 100644 --- a/dist/vue-i18n-extract.modern.js +++ b/dist/vue-i18n-extract.modern.js @@ -31,6 +31,7 @@ var defaultConfig = { output: false, add: false, remove: false, + silent: false, ci: false, separator: '.' }; @@ -101,9 +102,10 @@ function* getMatches(file, regExp, captureGroup = 1) { /** * Extracts translation keys from methods such as `$t` and `$tc`. * - * - **regexp pattern**: (?:[$ .]tc?)\( + * - **regexp pattern**: (?:[$\s.:"'`+\(\[\{]t[cm]?)\( * - * **description**: Matches the sequence t( or tc(, optionally with either “$”, “.” or “ ” in front of it. + * **description**: Matches the sequence t(, tc( or tm(, optionally with either “$”, SPACE, “.”, “:”, “"”, “'”, + * “`”, "+", "(", "[" or "{" in front of it. * * - **regexp pattern**: (["'`]) * @@ -124,7 +126,7 @@ function* getMatches(file, regExp, captureGroup = 1) { function extractMethodMatches(file) { - const methodRegExp = /(?:[$ ."'`]t[cm]?)\(\s*?(["'`])((?:[^\\]|\\.)*?)\1/g; + const methodRegExp = /(?:[$\s.:"'`+\(\[\{]t[cm]?)\(\s*?(["'`])((?:[^\\]|\\.)*?)\1/g; return [...getMatches(file, methodRegExp, 2)]; } @@ -305,6 +307,7 @@ async function createI18NReport(options) { output, add, remove, + silent, ci, separator } = options; @@ -316,9 +319,12 @@ async function createI18NReport(options) { const I18NItems = extractI18NItemsFromVueFiles(vueFiles); const I18NLanguage = extractI18NLanguageFromLanguageFiles(languageFiles, dot); const report = extractI18NReport(I18NItems, I18NLanguage); - if (report.missingKeys.length) console.info('\nMissing Keys'), console.table(report.missingKeys); - if (report.unusedKeys.length) console.info('\nUnused Keys'), console.table(report.unusedKeys); - if (report.maybeDynamicKeys.length) console.warn('\nSuspected Dynamic Keys Found\nvue-i18n-extract does not compile Vue templates and therefore can not infer the correct key for the following keys.'), console.table(report.maybeDynamicKeys); + + if (!silent) { + if (report.missingKeys.length) console.info('\nMissing Keys'), console.table(report.missingKeys); + if (report.unusedKeys.length) console.info('\nUnused Keys'), console.table(report.unusedKeys); + if (report.maybeDynamicKeys.length) console.warn('\nSuspected Dynamic Keys Found\nvue-i18n-extract does not compile Vue templates and therefore can not infer the correct key for the following keys.'), console.table(report.maybeDynamicKeys); + } if (output) { await writeReportToFile(report, path.resolve(process.cwd(), output)); diff --git a/dist/vue-i18n-extract.modern.js.map b/dist/vue-i18n-extract.modern.js.map index 33adf2eb..03ec8120 100644 --- a/dist/vue-i18n-extract.modern.js.map +++ b/dist/vue-i18n-extract.modern.js.map @@ -1 +1 @@ -{"version":3,"file":"vue-i18n-extract.modern.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 output: false,\n add: false,\n remove: false,\n ci: false,\n separator: '.'\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 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 configFile = require(pathToConfigFile);\n\n console.info(`\\nUsing config file found at ${pathToConfigFile}`);\n\n return {\n ...configFile,\n ...argvOptions\n };\n } catch {\n return argvOptions;\n }\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 if (!isValidGlob(src)) {\n throw new Error(`vueFiles isn't a valid glob pattern.`);\n }\n\n const targetFiles = glob.sync(src);\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**: (?:[$ .]tc?)\\(\n *\n * **description**: Matches the sequence t( or tc(, optionally with either “$”, “.” 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 = /(?:[$ .\"'`]t[cm]?)\\(\\s*?([\"'`])((?:[^\\\\]|\\\\.)*?)\\1/g;\n return [ ...getMatches(file, methodRegExp, 2) ];\n}\n\nfunction extractComponentMatches (file: SimpleFile): I18NItemWithBounding[] {\n const componentRegExp = /(?:<(?:i18n|Translation))(?:.|\\n)*?(?:[^:]path=(\"|'))((?:[^\\\\]|\\\\.)*?)\\1/gi;\n return [ ...getMatches(file, componentRegExp, 2) ];\n}\n\nfunction extractDirectiveMatches (file: SimpleFile): I18NItemWithBounding[] {\n const directiveRegExp = /v-t=\"'((?:[^\\\\]|\\\\.)*?)'\"/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 if (!isValidGlob(src)) {\n throw new Error(`languageFiles isn't a valid glob pattern.`);\n }\n\n const targetFiles = glob.sync(src);\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, index) => {\n accumulator[language].push({\n path: key,\n file: file.fileName,\n line: index,\n });\n });\n\n return accumulator;\n }, {});\n}\n\nexport function writeMissingToLanguageFiles (parsedLanguageFiles: SimpleFile[], missingKeys: I18NItem[], dot: DotObject.Dot = Dot): 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 dot.str(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 ci,\n separator\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 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 (add && report.missingKeys.length) {\n writeMissingToLanguageFiles(languageFiles, report.missingKeys, dot);\n console.info('\\nThe missing keys have been added to your language files.');\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 (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","output","add","remove","ci","separator","initCommand","fs","writeFileSync","path","resolve","process","cwd","JSON","stringify","defaultConfig","resolveConfig","argvOptions","cac","parse","argv","run","options","pathToConfigFile","configFile","require","console","info","readVueFiles","src","isValidGlob","Error","targetFiles","glob","sync","length","map","f","fileName","replace","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","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","table","warn","on","error","exit"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"vue-i18n-extract.modern.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 output: false,\n add: false,\n remove: false,\n silent: false,\n ci: false,\n separator: '.'\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 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 configFile = require(pathToConfigFile);\n\n console.info(`\\nUsing config file found at ${pathToConfigFile}`);\n\n return {\n ...configFile,\n ...argvOptions\n };\n } catch {\n return argvOptions;\n }\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 if (!isValidGlob(src)) {\n throw new Error(`vueFiles isn't a valid glob pattern.`);\n }\n\n const targetFiles = glob.sync(src);\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 = /(?:<(?:i18n|Translation))(?:.|\\n)*?(?:[^:]path=(\"|'))((?:[^\\\\]|\\\\.)*?)\\1/gi;\n return [ ...getMatches(file, componentRegExp, 2) ];\n}\n\nfunction extractDirectiveMatches (file: SimpleFile): I18NItemWithBounding[] {\n const directiveRegExp = /v-t=\"'((?:[^\\\\]|\\\\.)*?)'\"/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 if (!isValidGlob(src)) {\n throw new Error(`languageFiles isn't a valid glob pattern.`);\n }\n\n const targetFiles = glob.sync(src);\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, index) => {\n accumulator[language].push({\n path: key,\n file: file.fileName,\n line: index,\n });\n });\n\n return accumulator;\n }, {});\n}\n\nexport function writeMissingToLanguageFiles (parsedLanguageFiles: SimpleFile[], missingKeys: I18NItem[], dot: DotObject.Dot = Dot): 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 dot.str(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 silent,\n ci,\n separator\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 if (!silent) {\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\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 (add && report.missingKeys.length) {\n writeMissingToLanguageFiles(languageFiles, report.missingKeys, dot);\n console.info('\\nThe missing keys have been added to your language files.');\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 (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","output","add","remove","silent","ci","separator","initCommand","fs","writeFileSync","path","resolve","process","cwd","JSON","stringify","defaultConfig","resolveConfig","argvOptions","cac","parse","argv","run","options","pathToConfigFile","configFile","require","console","info","readVueFiles","src","isValidGlob","Error","targetFiles","glob","sync","length","map","f","fileName","replace","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","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","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 c366f986..0c7b33fb 100644 --- a/dist/vue-i18n-extract.umd.js +++ b/dist/vue-i18n-extract.umd.js @@ -38,6 +38,7 @@ output: false, add: false, remove: false, + silent: false, ci: false, separator: '.' }; @@ -108,9 +109,10 @@ /** * Extracts translation keys from methods such as `$t` and `$tc`. * - * - **regexp pattern**: (?:[$ .]tc?)\( + * - **regexp pattern**: (?:[$\s.:"'`+\(\[\{]t[cm]?)\( * - * **description**: Matches the sequence t( or tc(, optionally with either “$”, “.” or “ ” in front of it. + * **description**: Matches the sequence t(, tc( or tm(, optionally with either “$”, SPACE, “.”, “:”, “"”, “'”, + * “`”, "+", "(", "[" or "{" in front of it. * * - **regexp pattern**: (["'`]) * @@ -131,7 +133,7 @@ function extractMethodMatches(file) { - const methodRegExp = /(?:[$ ."'`]t[cm]?)\(\s*?(["'`])((?:[^\\]|\\.)*?)\1/g; + const methodRegExp = /(?:[$\s.:"'`+\(\[\{]t[cm]?)\(\s*?(["'`])((?:[^\\]|\\.)*?)\1/g; return [...getMatches(file, methodRegExp, 2)]; } @@ -312,6 +314,7 @@ output, add, remove, + silent, ci, separator } = options; @@ -323,9 +326,12 @@ const I18NItems = extractI18NItemsFromVueFiles(vueFiles); const I18NLanguage = extractI18NLanguageFromLanguageFiles(languageFiles, dot); const report = extractI18NReport(I18NItems, I18NLanguage); - if (report.missingKeys.length) console.info('\nMissing Keys'), console.table(report.missingKeys); - if (report.unusedKeys.length) console.info('\nUnused Keys'), console.table(report.unusedKeys); - if (report.maybeDynamicKeys.length) console.warn('\nSuspected Dynamic Keys Found\nvue-i18n-extract does not compile Vue templates and therefore can not infer the correct key for the following keys.'), console.table(report.maybeDynamicKeys); + + if (!silent) { + if (report.missingKeys.length) console.info('\nMissing Keys'), console.table(report.missingKeys); + if (report.unusedKeys.length) console.info('\nUnused Keys'), console.table(report.unusedKeys); + if (report.maybeDynamicKeys.length) console.warn('\nSuspected Dynamic Keys Found\nvue-i18n-extract does not compile Vue templates and therefore can not infer the correct key for the following keys.'), console.table(report.maybeDynamicKeys); + } if (output) { await writeReportToFile(report, path__default['default'].resolve(process.cwd(), output)); diff --git a/dist/vue-i18n-extract.umd.js.map b/dist/vue-i18n-extract.umd.js.map index dfbfe833..328ecf50 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 output: false,\n add: false,\n remove: false,\n ci: false,\n separator: '.'\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 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 configFile = require(pathToConfigFile);\n\n console.info(`\\nUsing config file found at ${pathToConfigFile}`);\n\n return {\n ...configFile,\n ...argvOptions\n };\n } catch {\n return argvOptions;\n }\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 if (!isValidGlob(src)) {\n throw new Error(`vueFiles isn't a valid glob pattern.`);\n }\n\n const targetFiles = glob.sync(src);\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**: (?:[$ .]tc?)\\(\n *\n * **description**: Matches the sequence t( or tc(, optionally with either “$”, “.” 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 = /(?:[$ .\"'`]t[cm]?)\\(\\s*?([\"'`])((?:[^\\\\]|\\\\.)*?)\\1/g;\n return [ ...getMatches(file, methodRegExp, 2) ];\n}\n\nfunction extractComponentMatches (file: SimpleFile): I18NItemWithBounding[] {\n const componentRegExp = /(?:<(?:i18n|Translation))(?:.|\\n)*?(?:[^:]path=(\"|'))((?:[^\\\\]|\\\\.)*?)\\1/gi;\n return [ ...getMatches(file, componentRegExp, 2) ];\n}\n\nfunction extractDirectiveMatches (file: SimpleFile): I18NItemWithBounding[] {\n const directiveRegExp = /v-t=\"'((?:[^\\\\]|\\\\.)*?)'\"/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 if (!isValidGlob(src)) {\n throw new Error(`languageFiles isn't a valid glob pattern.`);\n }\n\n const targetFiles = glob.sync(src);\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, index) => {\n accumulator[language].push({\n path: key,\n file: file.fileName,\n line: index,\n });\n });\n\n return accumulator;\n }, {});\n}\n\nexport function writeMissingToLanguageFiles (parsedLanguageFiles: SimpleFile[], missingKeys: I18NItem[], dot: DotObject.Dot = Dot): 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 dot.str(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 ci,\n separator\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 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 (add && report.missingKeys.length) {\n writeMissingToLanguageFiles(languageFiles, report.missingKeys, dot);\n console.info('\\nThe missing keys have been added to your language files.');\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 (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","output","add","remove","ci","separator","initCommand","fs","writeFileSync","path","resolve","process","cwd","JSON","stringify","defaultConfig","resolveConfig","argvOptions","cac","parse","argv","run","options","pathToConfigFile","configFile","require","console","info","readVueFiles","src","isValidGlob","Error","targetFiles","glob","sync","length","map","f","fileName","replace","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","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","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 output: false,\n add: false,\n remove: false,\n silent: false,\n ci: false,\n separator: '.'\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 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 configFile = require(pathToConfigFile);\n\n console.info(`\\nUsing config file found at ${pathToConfigFile}`);\n\n return {\n ...configFile,\n ...argvOptions\n };\n } catch {\n return argvOptions;\n }\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 if (!isValidGlob(src)) {\n throw new Error(`vueFiles isn't a valid glob pattern.`);\n }\n\n const targetFiles = glob.sync(src);\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 = /(?:<(?:i18n|Translation))(?:.|\\n)*?(?:[^:]path=(\"|'))((?:[^\\\\]|\\\\.)*?)\\1/gi;\n return [ ...getMatches(file, componentRegExp, 2) ];\n}\n\nfunction extractDirectiveMatches (file: SimpleFile): I18NItemWithBounding[] {\n const directiveRegExp = /v-t=\"'((?:[^\\\\]|\\\\.)*?)'\"/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 if (!isValidGlob(src)) {\n throw new Error(`languageFiles isn't a valid glob pattern.`);\n }\n\n const targetFiles = glob.sync(src);\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, index) => {\n accumulator[language].push({\n path: key,\n file: file.fileName,\n line: index,\n });\n });\n\n return accumulator;\n }, {});\n}\n\nexport function writeMissingToLanguageFiles (parsedLanguageFiles: SimpleFile[], missingKeys: I18NItem[], dot: DotObject.Dot = Dot): 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 dot.str(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 silent,\n ci,\n separator\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 if (!silent) {\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\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 (add && report.missingKeys.length) {\n writeMissingToLanguageFiles(languageFiles, report.missingKeys, dot);\n console.info('\\nThe missing keys have been added to your language files.');\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 (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","output","add","remove","silent","ci","separator","initCommand","fs","writeFileSync","path","resolve","process","cwd","JSON","stringify","defaultConfig","resolveConfig","argvOptions","cac","parse","argv","run","options","pathToConfigFile","configFile","require","console","info","readVueFiles","src","isValidGlob","Error","targetFiles","glob","sync","length","map","f","fileName","replace","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","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","table","warn","on","error","exit"],"mappings":"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"} \ No newline at end of file diff --git a/src/config-file/vue-i18n-extract.config.ts b/src/config-file/vue-i18n-extract.config.ts index ca3640d5..c64a595f 100644 --- a/src/config-file/vue-i18n-extract.config.ts +++ b/src/config-file/vue-i18n-extract.config.ts @@ -5,6 +5,7 @@ export default { output: false, add: false, remove: false, + silent: false, ci: false, separator: '.' }; diff --git a/src/create-report/index.ts b/src/create-report/index.ts index 8d09d49e..5210ade0 100644 --- a/src/create-report/index.ts +++ b/src/create-report/index.ts @@ -12,6 +12,7 @@ export async function createI18NReport (options: ReportOptions): Promise { expect(consoleTableSpy).toHaveBeenCalledTimes(3); expect(consoleTableSpy.mock.calls[0][0]).toEqual(expectedI18NReport.missingKeys); expect(consoleTableSpy.mock.calls[1][0]).toEqual(expectedI18NReport.unusedKeys); + + await createI18NReport({ ...options, silent: true }); + + expect(consoleTableSpy).toHaveBeenCalledTimes(3); }); it('Write report to file at output path', async () => {