@dvhb/react-intl-messages
Version:
Library for parsing source files and extract react-intl messages
85 lines (84 loc) • 3.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const path = require("path");
const utils_1 = require("../utils");
const base_1 = require("../base");
const lokalise_1 = require("../providers/lokalise");
const locize_1 = require("../providers/locize");
class Extract extends base_1.Base {
constructor() {
super(...arguments);
this.messages = {};
}
static async readMessages(fileName) {
try {
try {
return JSON.parse(await utils_1.readFile(fileName));
}
catch (err) {
throw new Error(`Error parsing messages JSON in file ${fileName}`);
}
}
catch (err) {
if (err.code !== 'ENOENT') {
throw err;
}
}
}
async mergeToFile(locale) {
const { flags } = this.parse(Extract);
const fileName = path.join(flags.messagesDir, `${locale}.json`);
const fileMessages = await Extract.readMessages(fileName);
if (!fileMessages)
return;
const result = fileMessages
.map(msg => (Object.assign(Object.assign({}, msg), { message: this.provider.getMessage(locale, msg.id) || msg.message })))
.filter(msg => msg.files || msg.message);
this.messages[locale] = utils_1.toHash(result, 'id');
await Extract.writeMessages(fileName, result);
utils_1.showInfo(`Messages updated: ${fileName}`);
}
static async writeMessages(fileName, msgs) {
await utils_1.writeFile(fileName, `${JSON.stringify(msgs, null, 2)}\n`);
}
async run() {
utils_1.showInfo('Start sync messages');
const { flags } = this.parse(Extract);
const { langs, provider, projectId, token, version, namespace, uploadTranslations } = flags;
const locales = langs.split(',');
const defaultLocale = utils_1.head(locales);
const getProvider = () => {
const providers = {
lokalise: () => new lokalise_1.Lokalise(defaultLocale, projectId, token),
locize: () => new locize_1.Locize(defaultLocale, projectId, token, version, namespace),
};
return providers[provider]();
};
this.provider = getProvider();
if (!this.provider) {
utils_1.showError('Not provider selected');
return;
}
locales.forEach(locale => {
this.messages[locale] = {};
});
await this.provider.getKeys(locales);
await Promise.all(locales.map(locale => this.mergeToFile(locale)));
const newMessages = this.provider.getNewMessages();
if (newMessages.length > 0) {
utils_1.showInfo(`New translation keys: ${newMessages.length}`);
await this.provider.uploadMessages(newMessages.map(id => this.messages[locales[0]][id]));
if (uploadTranslations && locales.length > 1) {
await utils_1.asyncForEach(utils_1.tail(locales), locale => this.provider.uploadMessages(newMessages.map(id => this.messages[locale][id]).filter(Boolean), locale));
}
}
utils_1.showInfo('Finish sync messages');
}
}
exports.default = Extract;
Extract.description = 'Synchronise extracted files with Lokalise.co';
Extract.examples = [
`$ messages extract --langs=en,fr,de,ru --pattern="src/**/*.{ts,tsx}"
`,
];
Extract.flags = Object.assign(Object.assign(Object.assign({}, base_1.Base.flags), base_1.Base.langFlags), base_1.Base.providersFlags);