@formatjs/cli-lib
Version:
Lib for CLI for formatjs.
38 lines (37 loc) • 1.45 kB
JavaScript
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);
}