mock-convert
Version:
convert interface data to mock data
206 lines (177 loc) • 5.43 kB
JavaScript
const path = require('path');
const fs = require('fs');
const debug = require('debug')('mockGen');
const Translate = require('./translate');
function writeFile(outPath, data) {
fs.writeFile(outPath, data, (err) => {
if (!err) {
debug('write file: %s success', outPath);
} else {
debug('write file: %s failed, err: %O', outPath, err);
}
});
}
function generateSingleFile(projectObj, outOpt) {
let fileData = '';
if (Array.isArray(projectObj)) {
fileData += 'module.exports = {\n';
for (let m = 0; m < projectObj.length; m++) {
const { name, introduction, moduleList } = projectObj[m];
if (name) {
fileData += name;
}
if (introduction) {
fileData += introduction;
}
if (moduleList) {
for (let i = 0, len = moduleList.length; i < len; i++) {
const { parse } = moduleList[i];
fileData += parse;
}
}
}
fileData += '};\n';
} else {
const { name, introduction, moduleList } = projectObj;
if (name) {
fileData += name;
}
if (introduction) {
fileData += introduction;
}
fileData += 'module.exports = {\n';
if (moduleList) {
for (let i = 0, len = moduleList.length; i < len; i++) {
const { parse } = moduleList[i];
fileData += parse;
}
}
fileData += '};\n';
}
// 写入单个文件
const { outPath } = outOpt;
writeFile(outPath, fileData);
}
function formatName(name) {
let result = name;
if (name) {
result = name.replace(/\(.*?\)/g, '');
result = result.replace(/(.*?)/g, '');
result = result.replace(/ /g, '');
}
return result;
}
function preGenerateFiles(projectObj, outOpt, translateOpt, trans) {
const fileList = [];
const originFileList = [];
const translatePromise = [];
const _moduleList = [];
if (Array.isArray(projectObj)) {
for (let m = 0; m < projectObj.length; m++) {
const { moduleList } = projectObj[m];
let { fileNames } = translateOpt;
if (!fileNames) {
fileNames = outOpt.fileNames; // 兼容以前的版本
}
if (moduleList) {
for (let i = 0, len = moduleList.length; i < len; i++) {
let { name: moduleName } = moduleList[i];
_moduleList.push(moduleList[i]);
moduleName = formatName(moduleName);
const fileName = fileNames[moduleName];
originFileList.push(moduleName);
if (!fileName) {
fileList.push(null);
translatePromise.push(trans.translate(moduleName));
} else {
fileList.push(fileName);
}
}
}
}
} else {
const { moduleList } = projectObj;
let { fileNames } = translateOpt;
if (!fileNames) {
fileNames = outOpt.fileNames; // 兼容以前的版本
}
if (moduleList) {
for (let i = 0, len = moduleList.length; i < len; i++) {
let { name: moduleName } = moduleList[i];
_moduleList.push(moduleList[i]);
moduleName = formatName(moduleName);
const fileName = fileNames[moduleName];
originFileList.push(moduleName);
if (!fileName) {
fileList.push(null);
translatePromise.push(trans.translate(moduleName));
} else {
fileList.push(fileName);
}
}
}
}
return { fileList, originFileList, moduleList: _moduleList, translatePromise };
}
function generateFiles(projectObj, outOpt, translateOpt) {
let indexFileData = '';
const { outPath } = outOpt;
let outDir = path.dirname(outPath);
if (outDir[outDir.length - 1] !== '/' && outDir.length > 0) {
outDir += '/';
}
const { apiHost, appKey, secretKey } = translateOpt;
const trans = new Translate(apiHost, appKey, secretKey);
const {
fileList = [],
originFileList = [],
translatePromise = [],
moduleList,
} = preGenerateFiles(projectObj, outOpt, translateOpt, trans);
Promise.all(translatePromise).then((wordArray) => {
debug('translate data: ', wordArray);
let fileName = '';
for (let i = 0, j = 0, len = fileList.length; i < len; i++) {
if (!fileList[i]) {
fileList[i] = trans.postProcess(wordArray[j]) || originFileList[i];
j++;
}
fileList[i] = fileList[i].replace('-', '');
fileName = fileList[i];
indexFileData += `const ${fileName} = require('./${fileName}');\n`;
fileName += '.js';
const filePath = path.resolve(outDir, fileName);
let fileData = '';
fileData += 'module.exports = {\n';
const { parse } = moduleList[i];
fileData += parse;
fileData += '};\n';
writeFile(filePath, fileData);
}
indexFileData += '\nmodule.exports = Object.assign({}';
for (let j = 0, len = fileList.length; j < len; j++) {
indexFileData += ',\n ';
indexFileData += fileList[j];
}
indexFileData += ');\n';
writeFile(outPath, indexFileData);
}).catch((err) => {
debug('write file failed', err);
});
}
module.exports = function persist(projectObj, outOpt, translateOpt) {
const {
outPath,
singleFile,
} = outOpt;
const outDir = path.dirname(outPath);
if (!fs.existsSync(outDir)) {
debug('directory is not exist: %s', outDir);
return;
}
if (singleFile) {
generateSingleFile(projectObj, outOpt);
} else {
generateFiles(projectObj, outOpt, translateOpt);
}
};