( translationFilesContents: Record<string, any>, sourceLocale: string )
| 16 | } |
| 17 | |
| 18 | export async function checkExtraKeys( |
| 19 | translationFilesContents: Record<string, any>, |
| 20 | sourceLocale: string |
| 21 | ): Promise<boolean> { |
| 22 | debug('Checking translation files:') |
| 23 | const sourceContent = translationFilesContents[sourceLocale] |
| 24 | if (!sourceContent) { |
| 25 | throw new Error(`Missing source ${sourceLocale}.json file`) |
| 26 | } |
| 27 | const sourceKeys = extractKeys(sourceContent) |
| 28 | return Object.entries(translationFilesContents) |
| 29 | .filter(([locale]) => locale !== sourceLocale) |
| 30 | .reduce<boolean>((result, [locale, content]) => { |
| 31 | const localeKeys = new Set(extractKeys(content)) |
| 32 | |
| 33 | const extraKeys = new Set( |
| 34 | Array.from(localeKeys).filter(k => !sourceKeys.includes(k)) |
| 35 | ) |
| 36 | |
| 37 | if (!extraKeys.size) { |
| 38 | return result |
| 39 | } |
| 40 | |
| 41 | writeStderr('---------------------------------\n') |
| 42 | writeStderr(`Extra translation keys for locale ${locale}:\n`) |
| 43 | extraKeys.forEach(r => writeStderr(`${r}\n`)) |
| 44 | |
| 45 | return false |
| 46 | }, true) |
| 47 | } |
no test coverage detected