milady
Version:
Generate the front-end code by parsing the interface document
182 lines (147 loc) • 4.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _fs = require("fs");
var _path = require("path");
var _handelStr = require("../../utils/handelStr");
function main(SwaggerData) {
const {
paths,
definitions
} = SwaggerData;
const indexStr = generateIndex(paths);
const dataStr = generateData(definitions);
const str = indexStr + dataStr;
const file = [{
fileName: 'api.ts',
fileStr: str
}];
return file;
}
/* 生成接口文件 */
function generateIndex(paths) {
let indexStr = '';
Object.keys(paths).forEach(api => {
Object.keys(paths[api]).forEach(method => {
if (method === 'post' || method === 'get') {
const {
description,
responses,
summary,
tags,
parameters
} = paths[api][method];
const interfaceGet = '';
const requestInterfaceName = '';
const responseInterfaceName = '';
const requestBody = '';
const data = getIndexValue(responses);
const tpl = (0, _path.join)(__dirname, './http.ts.tpl');
let tplContent = (0, _fs.readFileSync)(tpl, 'utf-8');
tplContent = tplContent.replace('<%= InterfaceGet %>', interfaceGet).replace('<%= FunctionTags %>', JSON.stringify(tags)).replace('<%= FunctionSummary %>', summary).replace('<%= FunctionDescription %>', description).replace(new RegExp('<%= FunctionParams %>', 'g'), (0, _handelStr.strToKey)(requestInterfaceName)).replace('<%= FunctionName %>', (0, _handelStr.strToKey)(api)).replace('<%= FunctionPromise %>', (0, _handelStr.strToKey)(responseInterfaceName)).replace('<%= FunctionUrl %>', api).replace('<%= FunctionParamsMethod %>', requestBody);
indexStr = indexStr.concat(tplContent);
}
});
});
indexStr = indexStr.concat('};\n');
return indexStr;
} // 生成接口文件
function getIndexValue(responses) {
let res;
if (responses['200'] && responses['200'].schema) {
if (responses['200'].schema.$ref) {
res = `data.${(0, _handelStr.handelRef)(responses['200'].schema.$ref)}`;
} else if (responses['200'].schema.items && responses['200'].schema.items.$ref) {
res = `[data.${(0, _handelStr.handelRef)(responses['200'].schema.items.$ref)}]`;
}
} else {
res = null;
}
return res;
}
/* 生成请求文件 */
let up = true; // 排序
function generateData(definitions) {
let dataStr = '';
dataStr = dataStr.concat(generateObjectStr(Object.keys(definitions)));
dataStr = dataStr.concat(generateBody(definitions));
dataStr = dataStr.concat('export default obj;\n');
return dataStr;
} // 生成数据文件
function generateBody(definitions) {
let dataStr = '';
Object.keys(definitions).forEach(dataName => {
const dataContents = definitions[dataName].properties;
up = true;
const str = generateDataStr(dataName, dataContents);
if (up) {
dataStr = str.concat(dataStr);
} else {
dataStr = dataStr.concat(str);
}
});
return dataStr;
}
function generateDataStr(dataName, dataContents) {
if (!dataContents) {
console.log(dataContents);
return '';
}
let str = `obj.${(0, _handelStr.strToKey)(dataName)} = {\n`;
Object.keys(dataContents).forEach(propertiesName => {
str = str.concat(` ${propertiesName}: ${generateValueStr(dataContents[propertiesName])}, // ${dataContents[propertiesName].description ? dataContents[propertiesName].description.replace(/\n/g, '').replace(/\s/g, '') : '无'}\n`);
});
str = str.concat('};\n');
return str;
} // 生成数据
function generateValueStr(params) {
let dataStr;
let data = null;
if (params.items && params.items.$ref) {
data = (0, _handelStr.handelRef)(params.items.$ref);
}
switch (params.type) {
case 'array':
dataStr = `[obj.${data}]`;
up = false;
break;
case 'object':
dataStr = `obj.${data}`;
up = false;
break;
case 'string':
dataStr = '1';
break;
case 'integer':
dataStr = 1;
break;
case 'boolean':
dataStr = true;
break;
case 'number':
dataStr = 1;
break;
case 'undefined':
dataStr = undefined;
break;
default:
dataStr = "'没有type值'";
break;
}
return dataStr;
} // 生成数据值
function generateObjectStr(params) {
let str = 'const obj = {\n';
params.forEach(element => {
str = str.concat(` ${(0, _handelStr.strToKey)(element)}: null,\n`);
});
str = str.concat('};\n');
return str;
} // 生成定义导出数据对象
var _default = {
outPath: 'mock/',
handelData: main
};
exports.default = _default;