( translationFilesContents: Record<string, any>, sourceLocale: string )
| 16 | } |
| 17 | |
| 18 | export async function checkMissingKeys( |
| 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 missingKeys = new Set(sourceKeys.filter(r => !localeKeys.has(r))) |
| 34 | // We're being lenient here since only missing keys are currently considered breaking |
| 35 | if (!missingKeys.size) { |
| 36 | return result |
| 37 | } |
| 38 | writeStderr('---------------------------------\n') |
| 39 | writeStderr(`Missing translation keys for locale ${locale}:\n`) |
| 40 | missingKeys.forEach(r => writeStderr(`${r}\n`)) |
| 41 | |
| 42 | return false |
| 43 | }, true) |
| 44 | } |
no test coverage detected