UNPKG

@erda-ui/cli

Version:

Command line interface for rapid Erda UI development

222 lines (221 loc) 9.71 kB
"use strict"; 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('&#58;', ':'); } }); }); } 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(':', '&#58;'); }); } 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(); });