UNPKG

@dvhb/react-intl-messages

Version:

Library for parsing source files and extract react-intl messages

85 lines (84 loc) 3.56 kB
"use strict"; 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);