milady
Version:
Generate the front-end code by parsing the interface document
269 lines (230 loc) • 7.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.changeText = changeText;
exports.changeApi = changeApi;
exports.changeParam = changeParam;
exports.generateName = generateName;
exports.toUpperCase = toUpperCase;
exports.generateType = generateType;
exports.generateHead = generateHead;
exports.generatePromise = generatePromise;
exports.generateInterfaceName = generateInterfaceName;
exports.generateServiceFiles = generateServiceFiles;
exports.default = void 0;
var _path = require("path");
var _fs = require("fs");
var _handelStr = require("../../utils/handelStr");
const GetMethodString = '{\n params\n }';
const PostMethodString = "{\n method: 'POST',\n data: params\n }";
function changeText(input) {
if (input.includes('_')) {
const texts = input.split('_');
let str = texts.splice(0, 1)[0];
texts.forEach(t => {
str += toUpperCase(t);
});
return str;
}
return input;
}
let additionalParameters = {};
function changeApi(input) {
const hasParams = input.includes('{');
const nameArr = input.split('/');
const newArr = nameArr.map(i => {
let iStr = i;
if (i.includes('{')) {
const param = i.replace(new RegExp('{', 'g'), '').replace(new RegExp('}', 'g'), '');
additionalParameters[param] = param;
iStr = `\${params.${param}}`;
}
return iStr;
});
return hasParams ? `\`${newArr.join('/')}\`` : `'${newArr.join('/')}'`;
}
function changeParam(nameArr) {
const newArr = nameArr.map(i => {
let iStr = i;
if (i.includes('{')) {
iStr = i.replace(new RegExp('{', 'g'), '').replace(new RegExp('}', 'g'), '');
}
return iStr;
});
return newArr;
}
function generateName(api) {
const nameArr = changeParam(api.split('/'));
let name = nameArr[nameArr.length - 2] ? nameArr[nameArr.length - 2] + toUpperCase(nameArr[nameArr.length - 1]) : nameArr[nameArr.length - 1];
name = name.replace(/-/g, '_');
return changeText(name);
}
function toUpperCase(str) {
return str.replace(str[0], str[0].toUpperCase());
}
function generateType({
type,
items,
$ref
}) {
if (type === 'integer') {
return 'number';
}
if (type === 'array') {
if (items.$ref) {
return `${generateInterfaceName(items.$ref)} []`;
}
if (items.type) {
return `${items.type} []`;
}
return '[]';
}
if ($ref) {
return generateInterfaceName($ref);
}
return type;
}
function generateHead(data) {
return `
/**
* This file is automatically generated using Alitajs/codegen
* Host: ${data.host}
* BasePath: ${data.basePath}
* Version: ${data.info.version}
* Description: 这个文件是使用脚本自动生成的,原则上来说,你不需要手动修改它
* Others:
**/
import request from 'umi-request';\n
`;
}
const hasChineseArr = {};
let hasChineseCount = 0;
function generatePromise(resData) {
let promise = '';
if (!resData) {
return 'any';
}
if (resData.$ref) {
promise = resData.$ref.replace('#/definitions/', '').replace(new RegExp('«', 'g'), '').replace(new RegExp('»', 'g'), '');
} else if (resData.item) {
promise = resData.item.$ref.replace('#/definitions/', '').replace(new RegExp('«', 'g'), '').replace(new RegExp('»', 'g'), '');
} else if (resData.type) {
promise = resData.type;
}
const hasChinese = /[^\u4e00-\u9fa5]+/.test(promise);
if (!hasChinese) {
if (hasChineseArr[promise]) {
promise = hasChineseArr[promise];
} else {
hasChineseArr[promise] = `TemporaryVariable${hasChineseCount}`;
promise = `TemporaryVariable${hasChineseCount}`;
hasChineseCount += 1;
}
}
if (resData.item) {
promise += '[]';
}
return promise;
}
function generateInterfaceName(text) {
let input = text;
input = input.replace('#/definitions/', '').replace(new RegExp('«', 'g'), '').replace(new RegExp('»', 'g'), '');
const hasChinese = /[^\u4e00-\u9fa5]+/.test(input);
if (!hasChinese) {
if (hasChineseArr[input]) {
input = hasChineseArr[input];
} else {
hasChineseArr[input] = `TemporaryVariable${hasChineseCount}`;
input = `TemporaryVariable${hasChineseCount}`;
hasChineseCount += 1;
}
}
return changeText(input);
}
function generateServiceFiles(SwaggerData) {
const {
tags = [],
paths,
definitions
} = SwaggerData;
let outPutStr = generateHead(SwaggerData);
/* 生成接口文件 */
Object.keys(definitions).forEach(defItem => {
outPutStr += `interface ${(0, _handelStr.strToKey)(generateInterfaceName(defItem))} {\n`;
const properties = definitions[defItem].properties || {};
Object.keys(properties).forEach(subDefItem => {
let defItemStr = ' /**\n';
defItemStr += ` * @description ${properties[subDefItem].description || ''}\n`;
defItemStr += ' **/\n';
defItemStr += ` ${subDefItem}: ${(0, _handelStr.strToKey)(generateType(properties[subDefItem]))};\n`;
outPutStr += defItemStr;
});
outPutStr += '}\n';
});
/* 生成请求文件 */
Object.keys(paths).forEach(item => {
const itemData = paths[item];
Object.keys(itemData).forEach(subItem => {
additionalParameters = {};
const subItemData = itemData[subItem];
const {
summary,
description,
tags: subTags,
responses,
parameters = []
} = subItemData;
const resData = responses['200'] && responses['200'].schema;
const url = changeApi(item);
const name = (0, _handelStr.apiToName)(item, subItem);
const params = `${toUpperCase(name)}Query`;
const paramsMethod = subItem === 'get' ? GetMethodString : PostMethodString;
let itemTargs = subTags || [];
itemTargs = itemTargs.map(t => {
let tStr = t;
tags.forEach(tag => {
if (tag.name === t) {
tStr = tag.description;
}
});
return tStr;
});
const promise = generatePromise(resData);
let definition = `interface ${params} {\n`;
parameters.map(p => {
if (p.in === 'query') {
let pStr = ' /**\n';
pStr += ` * @description ${p.description || ''}\n`;
pStr += ' **/\n';
pStr += ` ${p.name}: ${generateType(p)};\n`;
definition += pStr;
Object.keys(additionalParameters).map(ap => {
let apStr = ' /**\n';
apStr += ' * @description 请求地址中追加的参数\n';
apStr += ' **/\n';
apStr += ` ${ap}: string;\n`;
definition += apStr;
return ap;
});
}
return p;
});
definition += '}\n';
const tpl = (0, _path.join)(__dirname, './http.ts.tpl');
let tplContent = (0, _fs.readFileSync)(tpl, 'utf-8');
tplContent = tplContent.replace('<%= InterfaceDefinition %>', definition).replace('<%= FunctionTags %>', JSON.stringify(itemTargs)).replace('<%= FunctionSummary %>', summary).replace('<%= FunctionDescription %>', description).replace(new RegExp('<%= FunctionParams %>', 'g'), (0, _handelStr.strToKey)(params)).replace('<%= FunctionName %>', (0, _handelStr.strToKey)(name)).replace('<%= FunctionPromise %>', (0, _handelStr.strToKey)(promise)).replace('<%= FunctionUrl %>', url).replace('<%= FunctionParamsMethod %>', paramsMethod);
outPutStr += tplContent;
});
});
const file = [{
fileName: 'api.ts',
fileStr: outPutStr
}];
return file;
}
var _default = {
outPath: 'src/services',
handelData: generateServiceFiles
};
exports.default = _default;