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 / src / onesky / index.js
Size: Mime:
const { getResourceConfiguration, writeJsonFile } = require('./utils');
const { flatten, unflatten } = require('./transform');
const { extractDefaultMessages } = require('./extract');
const { uploadProjectTranslation } = require('./api');
const { updateTranslationFiles, downloadMergedTranslationFiles, uploadTranslationFiles } = require('./translations');

/**
 * Main module for managing translations
 *
 * @module @doodle/i18n/disty/onesky
 */

/**
 * Helper that filters out falsy fields of an object
 *
 * @param {object} obj
 * @returns {object}
 * @private
 */
const filterFalsyFields = obj =>
  Object.entries(obj)
    .filter(([_, value]) => value)
    .reduce((result, [key, value]) => Object.assign(result, { [key]: value }), {});

/**
 * Legacy credentials object interface
 * @typedef {object} Credentials
 * @property {string} key
 * @property {string} secret
 */
/**
 * Get combined configuration from parameters, .oneskyrc and environment variables
 *
 * @param {object} options
 * @param {Credentials} options.credentials
 * @param {string} options.projectId
 * @param {string[]} options.dependentProjectIds
 * @returns {Promise<object>}
 * @async
 */
const getConfig = async ({ credentials = {}, ...options } = {}, projectId, dependentProjectIds) => {
  const resourceConfiguration = await getResourceConfiguration();
  const projectConfig = filterFalsyFields({ projectId, dependentProjectIds });

  return {
    i18nPath: './i18n',
    srcPath: './src',
    ...resourceConfiguration,
    ...options,
    ...projectConfig,
    credentials: {
      secret: process.env.ONESKY_SECRET_KEY || credentials.secret,
      apiKey: process.env.ONESKY_PUBLIC_KEY || credentials.key,
    },
  };
};

/**
 * Download all translation files for all defined languages of multiple OneSky projects
 *
 * @param {object} options
 * @param {Credentials} options.credentials
 * @param {string} options.projectId
 * @param {string[]} options.dependentProjectIds
 * @returns {Promise}
 * @async
 */
const downloadAllTranslations = async options => {
  const config = await getConfig(options);
  await downloadMergedTranslationFiles(
    [config.projectId, ...config.dependentProjectIds],
    config.i18nPath,
    config.credentials
  );
};

/**
 * Upload directly the translation from the default messages defined in the source code
 *
 * @param {object} options
 * @param {Credentials} options.credentials
 * @param {string} options.projectId
 * @param {string[]} options.dependentProjectIds
 * @returns {Promise}
 * @async
 */
const uploadBaseMessagesFromSource = async options => {
  const config = await getConfig(options);
  const { srcPath, projectId, credentials, i18nPath, fileName, keepStrings, format } = config;
  const translationOptions = filterFalsyFields({
    language: 'en',
    projectId,
    fileName,
  });
  const syncOptions = filterFalsyFields({ keepStrings, format });

  const sourceMessages = await extractDefaultMessages(`${srcPath}/**/+(messages|*.messages).js`);
  await uploadProjectTranslation(translationOptions, sourceMessages, credentials, syncOptions);
  await writeJsonFile(`${i18nPath}/en.json`, unflatten(sourceMessages));
};

/**
 * Update translations files
 *
 * @param {object} options
 * @param {Credentials} options.credentials
 * @param {string} options.projectId
 * @param {string} options.srcPath
 * @param {string} options.i18nPath
 * @returns {Promise}
 * @async
 */
const updateTranslations = async options => {
  const config = await getConfig(options);
  await updateTranslationFiles(
    config.projectId,
    config.credentials,
    `${config.srcPath}/**/messages.js`,
    config.i18nPath,
    config.includeValues
  );
};

/**
 * Upload all translations files
 *
 * @param {object} options
 * @param {Credentials} options.credentials
 * @param {string} options.projectId
 * @param {string} options.srcPath
 * @param {string} options.i18nPath
 * @returns {Promise}
 * @async
 */
const uploadAllTranslations = async options => {
  const { i18nPath, projectId, fileName, credentials, keepStrings, format } = await getConfig(options);
  await uploadTranslationFiles(
    i18nPath,
    filterFalsyFields({ projectId, fileName }),
    credentials,
    filterFalsyFields({ keepStrings, format })
  );
};

module.exports = {
  updateTranslations,
  uploadAllTranslations,
  uploadBaseMessagesFromSource,
  downloadAllTranslations,
  downloadMessages: downloadAllTranslations,
  uploadMessages: uploadBaseMessagesFromSource,
  getConfig,
  flatten,
  unflatten,
};