Repository URL to install this package:
|
Version:
4.2.0 ▾
|
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,
};