@erda-ui/cli
Version:
Command line interface for rapid Erda UI development
222 lines (221 loc) • 9.71 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const vinyl_fs_1 = __importDefault(require("vinyl-fs"));
const path_1 = __importDefault(require("path"));
const fs_1 = __importDefault(require("fs"));
const lodash_1 = require("lodash");
const log_1 = require("./log");
const i18n_config_1 = require("./i18n-config");
const scanner = require('i18next-scanner');
const flattenObjectKeys = require('i18next-scanner/lib/flatten-object-keys').default;
const omitEmptyObject = require('i18next-scanner/lib/omit-empty-object').default;
let zhWordMap = {};
let localePath = null;
let ns = [];
let originalZhJson = {};
let originalEnJson = {};
let isExternal = false;
const options = () => ({
removeUnusedKeys: true,
sort: true,
func: {
list: ['i18n.t'],
extensions: ['.js', '.jsx', '.ts', '.tsx'],
},
lngs: ['en', 'zh'],
defaultLng: 'en',
defaultNs: ns.includes('default') ? 'default' : ns[0] || 'default',
defaultValue: '__NOT_TRANSLATED__',
resource: {
savePath: `${localePath}/{{lng}}.json`,
jsonIndent: 2,
lineEnding: '\n',
},
ns,
nsSeparator: ':',
keySeparator: false,
interpolation: {
prefix: '{{',
suffix: '}}',
},
});
function sortObject(unordered) {
const ordered = {};
Object.keys(unordered)
.sort()
.forEach((key) => {
if (typeof unordered[key] === 'object') {
ordered[key] = sortObject(unordered[key]);
}
else {
ordered[key] = unordered[key];
}
});
return ordered;
}
function customFlush(done) {
const enToZhWords = zhWordMap;
const { resStore } = this.parser;
const { resource, removeUnusedKeys, sort, defaultValue } = this.parser.options;
Object.keys(resStore).forEach((lng) => {
const namespaces = resStore[lng];
if (lng === 'en') {
Object.keys(namespaces).forEach((_ns) => {
const obj = namespaces[_ns];
Object.keys(obj).forEach((k) => {
if (obj[k] === defaultValue) {
obj[k] = k.replace(':', ':');
}
});
});
}
const filePath = resource.savePath.replace('{{lng}}', lng);
let oldContent = lng === 'zh' ? originalZhJson : originalEnJson;
if (removeUnusedKeys) {
const namespaceKeys = flattenObjectKeys(namespaces);
const oldContentKeys = flattenObjectKeys(oldContent);
const unusedKeys = (0, lodash_1.differenceWith)(oldContentKeys, namespaceKeys, lodash_1.isEqual);
for (let i = 0; i < unusedKeys.length; ++i) {
(0, lodash_1.unset)(oldContent, unusedKeys[i]);
}
oldContent = omitEmptyObject(oldContent);
}
let output = (0, lodash_1.merge)(namespaces, oldContent);
if (sort) {
output = sortObject(output);
}
if (lng === 'zh') {
Object.keys(output).forEach((_ns) => {
const obj = output[_ns];
Object.keys(obj).forEach((k) => {
if (obj[k] === defaultValue) {
const zh = enToZhWords[k] || enToZhWords[`${_ns}:${k}`];
if (zh) {
obj[k] = zh;
}
else {
(0, log_1.logError)(`there is untranslated content in zh.json: ${k}, please handle it manually`);
}
}
});
});
}
if (isExternal) {
fs_1.default.writeFile(filePath, `${JSON.stringify(output, null, resource.jsonIndent)}\n`, 'utf8', (writeErr) => {
if (writeErr)
return (0, log_1.logError)(`writing failed:${lng}`, writeErr);
});
}
else {
const { default: defaultContent } = output, restContent = __rest(output, ["default"]);
fs_1.default.writeFile(filePath, `${JSON.stringify(restContent, null, resource.jsonIndent)}\n`, 'utf8', (writeErr) => {
if (writeErr)
return (0, log_1.logError)(`writing failed:${lng}`, writeErr);
});
const defaultLocalePath = `${i18n_config_1.internalLocalePathMap.default}/${lng}.json`;
fs_1.default.writeFile(defaultLocalePath, `${JSON.stringify({ default: defaultContent }, null, resource.jsonIndent)}\n`, 'utf8', (writeErr) => {
if (writeErr)
return (0, log_1.logError)(`writing failed:${lng}`, writeErr);
});
}
});
done();
}
exports.default = (resolve, _isExternal = false) => __awaiter(void 0, void 0, void 0, function* () {
try {
const jsonContent = fs_1.default.readFileSync(path_1.default.resolve(process.cwd(), './temp-zh-words.json'), 'utf8');
const zhWordContent = JSON.parse(jsonContent);
zhWordMap = (0, lodash_1.mapKeys)(zhWordContent, (_v, key) => {
return key.replace(':', ':');
});
}
catch (error) {
zhWordMap = {};
}
if (!_isExternal) {
for (const moduleName of i18n_config_1.internalModules) {
const srcDirs = i18n_config_1.internalSrcDirMap[moduleName];
const paths = srcDirs.map((srcDir) => `${srcDir}/**/*.{js,jsx,ts,tsx}`);
paths.push('!**/node_modules/**');
paths.push('!**/__tests__/**');
localePath = i18n_config_1.internalLocalePathMap[moduleName];
const targetLocalePath = i18n_config_1.internalLocalePathMap[moduleName];
const zhJsonPath = `${targetLocalePath}/zh.json`;
const enJsonPath = `${targetLocalePath}/en.json`;
let content = fs_1.default.readFileSync(zhJsonPath, 'utf8');
originalZhJson = JSON.parse(content);
content = fs_1.default.readFileSync(enJsonPath, 'utf8');
originalEnJson = JSON.parse(content);
const defaultLocalePath = i18n_config_1.internalLocalePathMap.default;
const defaultZhJsonPath = `${defaultLocalePath}/zh.json`;
const defaultEnJsonPath = `${defaultLocalePath}/en.json`;
content = fs_1.default.readFileSync(defaultZhJsonPath, 'utf8');
originalZhJson = (0, lodash_1.merge)(originalZhJson, JSON.parse(content));
content = fs_1.default.readFileSync(defaultEnJsonPath, 'utf8');
originalEnJson = (0, lodash_1.merge)(originalEnJson, JSON.parse(content));
ns = Object.keys(originalZhJson);
const promise = new Promise((_resolve) => {
vinyl_fs_1.default
.src(paths)
.pipe(scanner(options(), undefined, customFlush))
.pipe(vinyl_fs_1.default.dest('./'))
.on('end', () => {
_resolve();
});
});
yield promise;
}
}
else {
isExternal = true;
for (const moduleName of i18n_config_1.externalModules) {
const srcDirs = i18n_config_1.externalSrcDirMap[moduleName];
const paths = srcDirs.map((srcDir) => `${srcDir}/**/*.{js,jsx,ts,tsx}`);
paths.push('!**/node_modules/**');
paths.push('!**/__tests__/**');
localePath = i18n_config_1.externalLocalePathMap[moduleName];
const targetLocalePath = i18n_config_1.externalLocalePathMap[moduleName];
const zhJsonPath = `${targetLocalePath}/zh.json`;
const enJsonPath = `${targetLocalePath}/en.json`;
let content = fs_1.default.readFileSync(zhJsonPath, 'utf8');
originalZhJson = JSON.parse(content);
content = fs_1.default.readFileSync(enJsonPath, 'utf8');
originalEnJson = JSON.parse(content);
ns = Object.keys(originalZhJson);
const promise = new Promise((_resolve) => {
vinyl_fs_1.default
.src(paths)
.pipe(scanner(options(), undefined, customFlush))
.pipe(vinyl_fs_1.default.dest('./'))
.on('end', () => {
_resolve();
});
});
yield promise;
}
}
resolve();
});