@spscommerce/phrase-cli
Version:
A CLI used for interacting with phraseApp to keep translations up-to-date
84 lines (74 loc) • 2.52 kB
JavaScript
import { isDeepStrictEqual } from 'node:util';
import path from 'node:path';
import fs from 'node:fs';
import settings from '../settings.mjs';
// Synchronous file read
const readTranslationJSON = (woodland) => {
const localFilePath = path.join(process.cwd(), woodland ? settings.woodlandTranslationFile : settings.translationFile);
try {
const content = fs.readFileSync(localFilePath);
return JSON.parse(content);
} catch (error) {
throw new Error(`utils.readTranslationJSON error: error: ${error}`);
}
};
const readI18nJSON = () => {
const translationPath = './i18n.json';
const localFilePath = path.join(process.cwd(), translationPath);
try {
const content = fs.readFileSync(localFilePath);
return JSON.parse(content);
} catch (error) {
throw new Error(`utils.readI18nJSON error: ${error}`);
}
};
const readLocaleTranslation = (localePath, woodland) => {
const translationPath = woodland ? './woodland.json' : './translation.json';
const localFilePath = path.join(process.cwd(), localePath, translationPath);
try {
const content = fs.readFileSync(localFilePath);
return JSON.parse(content);
} catch (error) {
throw new Error(`utils.readLocaleTranslationerror: ${error}`);
}
};
const writeLocalesTranslations = (dir, data, woodland) => {
const translationFile = woodland ? 'woodland.json' : 'translation.json';
// check for existing directory
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
const filePath = path.join(process.cwd(), dir, translationFile);
fs.writeFileSync(filePath, JSON.stringify(data, null, 2));
};
const getKeyValuePairs = (objects) => {
return objects.reduce((accum, object) => {
const { content, key } = object;
return { ...accum, [key.name]: content };
}, {});
};
const getObjectDiff = (obj1, obj2) => {
const diff = Object.keys(obj1).reduce((result, key) => {
if (!Object.prototype.hasOwnProperty.call(obj2, key)) {
result.push(key);
} else if (isDeepStrictEqual(obj1[key], obj2[key])) {
const resultKeyIndex = result.indexOf(key);
result.splice(resultKeyIndex, 1);
}
return result;
}, Object.keys(obj2));
return diff;
};
const hasNewUpdatedKey = (remote, local) => {
const transRemote = getKeyValuePairs(remote);
return !isDeepStrictEqual(transRemote, local);
};
export {
readTranslationJSON,
readI18nJSON,
hasNewUpdatedKey,
getKeyValuePairs,
getObjectDiff,
readLocaleTranslation,
writeLocalesTranslations
};