UNPKG

@formatjs/cli-lib

Version:
38 lines (37 loc) 1.45 kB
import { debug, writeStderr } from '../console_utils'; /** * Flatten nested obj into list of keys, delimited by `.` * @param obj * @param parentKey * @returns */ function extractKeys(obj, parentKey = '') { if (!obj || typeof obj !== 'object' || Array.isArray(obj)) { return []; } return Object.keys(obj) .map(k => [parentKey ? `${parentKey}.${k}` : k, ...extractKeys(obj[k], k)]) .flat(); } export async function checkMissingKeys(translationFilesContents, sourceLocale) { debug('Checking translation files:'); const enUSContent = translationFilesContents[sourceLocale]; if (!enUSContent) { throw new Error(`Missing source ${sourceLocale}.json file`); } const enUSKeys = extractKeys(enUSContent); return Object.entries(translationFilesContents) .filter(([locale]) => locale !== sourceLocale) .reduce((result, [locale, content]) => { const localeKeys = new Set(extractKeys(content)); const missingKeys = new Set(enUSKeys.filter(r => !localeKeys.has(r))); // We're being lenient here since only missing keys are currently considered breaking if (!missingKeys.size) { return result; } writeStderr('---------------------------------\n'); writeStderr(`Missing translation keys for locale ${locale}:\n`); missingKeys.forEach(r => writeStderr(`${r}\n`)); return false; }, true); }