@singleton-i18n/js-core-sdk
Version:
A JavaScript Singleton client library for internationalization and localization that leverage data from Singleton service. The library works both for the browser and as a Node.js module.
202 lines (184 loc) • 6.75 kB
JavaScript
/*
* Copyright 2019-2021 VMware, Inc.
* SPDX-License-Identifier: EPL-2.0
*/
const ArgumentParser = require('argparse').ArgumentParser;
const path = require('path');
const fs = require('fs');
const { LogService } = require('./utils');
const { VIPConfig, VIPService } = require("./vip");
class LoadLocaleData {
constructor(vipConfig, vipService, logger, locales, directory) {
this.vipConfig = vipConfig;
this.vipService = vipService;
this.logger = logger;
this.locales = this.getLocalesList(locales);
this.directory = directory;
this.logger.debug('Current locales are ', this.locales);
};
generatePackage(packagePath, data) {
let that = this;
this.mkDirByPath(path.dirname(packagePath), this.logger);
fs.writeFile(packagePath, JSON.stringify(data, null, 2), 'utf-8', function (error) {
if (error) {
that.logger.error(`got an error when write file to ${packagePath}`, error);
return;
}
that.logger.info(`Succeed write data to ${packagePath}`);
});
}
mkDirByPath(absolutePath) {
const sep = path.sep;
let that = this;
return absolutePath.split(sep).reduce(function (parentDir, childDir) {
const currentDir = path.resolve(parentDir, childDir);
try {
fs.mkdirSync(currentDir);
} catch (error) {
if (error.code === 'EEXIST') {
that.logger.debug('directory is exist, skip', currentDir);
return currentDir;
}
if (error.code === 'ENOENT') { // Throw the original parentDir error on currentDir `ENOENT` failure.
throw new Error(`EACCES: permission denied, mkdir '${parentDir}'`);
}
const caughtErr = ['EACCES', 'EPERM', 'EISDIR'].indexOf(error.code) > -1;
if (!caughtErr || caughtErr && currentDir === path.resolve(absolutePath)) {
throw error; // Throw if it's just the last created dir.
}
}
return currentDir;
}, '/');
}
getLocalesList(locales) {
if (!locales || typeof locales !== 'string') {
this.logger.error('cannot get locales due to ', locales);
process.exit(1);
}
return locales.split(',');
}
generateLocaleDataBundles() {
var that = this;
var promise = new Promise(function (resolve, reject) {
try {
let locales = that.locales;
for (let locale of locales) {
// load combine data or only translation this.vipConfig.scope
let translationPromise = that.vipConfig.scope
? that.vipService.loadCombineData(locale)
: that.vipService.loadTranslation(locale);
translationPromise.then(function (body) {
let { response } = body.data;
if (response.code === 200) {
const fileName = that.vipConfig.scope
? `${locale}.json`
: `${that.vipConfig.TRANSLATION_PREFIX + locale}.json`
let translationPath = path.resolve(that.directory, fileName);
that.generatePackage(translationPath, body.data);
} else {
that.logger.error('cannot got resource due to ', response.message);
}
}).catch(function (e) {
that.logger.debug('loadI18nResource got an error with locale %s', locale);
that.logger.error('loadI18nResource got an error ', e);
});
resolve(locales);
}
} catch (error) {
reject(error);
that.logger.error('generateLocaleDataBundles got an error ', e);
}
});
return promise;
}
}
function run() {
// get path argument
let parser = new ArgumentParser({
addHelp: true,
description: 'Download i18n resource files into local project'
});
parser.addArgument(
['-d', '--directory'],
{
help: 'The location that i18n files should be added',
required: true
}
);
parser.addArgument(
['-p', '--product'],
{
help: 'VIP product name',
required: true,
}
);
parser.addArgument(
['-v', '--version'],
{
help: 'VIP product version',
required: true,
}
);
parser.addArgument(
['-c', '--component'],
{
help: 'VIP product component, usually AngularJS2',
required: true,
}
);
parser.addArgument(
['--host'],
{
help: 'VIP host',
required: true,
}
);
parser.addArgument(
['--locales'],
{
help: 'The locales you want to download from vip',
required: true,
}
);
parser.addArgument(
['--scope'],
{
help: 'The pattern categories',
required: false
}
);
parser.addArgument(
['--verbose'],
{
help: 'show more log info',
required: false,
action: 'storeTrue'
}
);
let args = parser.parseArgs();
const logger = LogService.getLogServiceInstance(args.verbose ? true : false);
logger.debug('command line args', args);
const workspace = path.resolve(process.cwd(), args.directory);
logger.debug('workspace', workspace);
try {
var vipConfig = new VIPConfig(args.host, args.product, args.version, args.component, args.scope);
var vipService = new VIPService(vipConfig, logger, null);
var loadI18nData = new LoadLocaleData(vipConfig, vipService, logger, args.locales, args.directory);
var locales = [];
loadI18nData.generateLocaleDataBundles().then(function (res) {
locales = res;
});
process.on('exit', function (code) {
if (code === 0) {
logger.info('================================================');
logger.info('Total Locales: ', locales.length);
logger.info('================================================');
}
})
} catch (error) {
logger.error('cannot generate package due to', error);
process.exit(1);
}
}
run();