Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@doodle/i18n / dist / onesky.js
Size: Mime:
const fs = require('fs');
const chalk = require('chalk');

const _ = require('lodash');
const babel = require('babel-core');
const onesky = require('onesky-utils');
const glob = require('glob');

const processMessages = require('./processMessages');
const supportedLocales = require('./locales.json');

// eslint-disable-next-line no-unused-vars
const defaultLocales = Object.entries(supportedLocales).map(([locale, label]) => locale);

/**
 * Helpers
 */
const log = (color, ...args) => {
  console.log(chalk[color](...args));
};
const curryedLog = color => (...args) => log(color, ...args);
const logSuccess = curryedLog('green');
const logError = curryedLog('red');

/**
 * Require and read config files
 */
const requireEnvVariables = () => {
  if (!fs.existsSync('.env')) {
    logError('Unable to find a .env file with Onesky API keys...');
    return false;
  }

  // eslint-disable-next-line global-require
  require('dotenv').config();
  return true;
};

const getOneskyConfig = () => {
  let oneskyConfig = null;

  try {
    oneskyConfig = JSON.parse(fs.readFileSync('.oneskyrc', 'utf8'));
  } catch (e) {
    logError('Unable to read .oneskyrc config file...');
  }

  return oneskyConfig;
};

/**
 * Upload messages to Onesky
 */
const uploadMessages = (srcPath = './src') => {
  if (!requireEnvVariables()) {
    return;
  }

  const oneskyConfig = getOneskyConfig();
  if (!oneskyConfig) {
    return;
  }

  const translations = {};

  glob(`${srcPath}/**/messages.js`, (err, files) => {
    if (!err) {
      files.forEach(file => {
        const babelTransform = babel.transformFileSync(file, {
          plugins: ['react-intl'],
        });

        const messages = _.get(babelTransform, 'metadata[react-intl].messages');
        if (messages) {
          messages.forEach(message => {
            translations[message.id] = message.defaultMessage;
          });
        }
      });

      const oneskyOptions = Object.assign(oneskyConfig, {
        secret: process.env.ONESKY_SECRET_KEY,
        apiKey: process.env.ONESKY_PUBLIC_KEY,
        content: JSON.stringify(translations),
        language: 'en',
      });

      onesky
        .postFile(oneskyOptions)
        .then(content => {
          logSuccess(content);
        })
        .catch(error => {
          logError('An error occured while uploading translations to onesky:', error.message);
        });
    } else {
      logError('An error occured while reading messages files:', err);
    }
  });
};

/**
 * Download messages from Onesky
 */
const downloadTranslations = (oneskyConfig, i18nPath, language) => {
  const oneskyOptions = Object.assign(oneskyConfig, {
    secret: process.env.ONESKY_SECRET_KEY,
    apiKey: process.env.ONESKY_PUBLIC_KEY,
    language: 'en',
  });

  onesky
    .getFile(oneskyOptions)
    .then(content => {
      const messages = processMessages.reduce(JSON.parse(content));
      fs.writeFile(`${i18nPath}/${language}.json`, JSON.stringify(messages), err => {
        if (err) {
          logError(`An error occurred while writing ${language} translations file`, err);
          return;
        }
        logSuccess(`Downloaded ${language} translations`);
      });
    })
    .catch(error => {
      logError(`An error occured while downloading ${language} translations from onesky:`, error.message);
    });
};

const downloadMessages = (locales = defaultLocales, i18nPath = './i18n') => {
  if (!requireEnvVariables()) {
    return;
  }

  const oneskyConfig = getOneskyConfig();
  if (!oneskyConfig) {
    return;
  }

  locales.forEach(language => {
    downloadTranslations(oneskyConfig, i18nPath, language);
  });
};

/**
 * Exports
 */
module.exports = {
  uploadMessages,
  downloadMessages,
};