186 lines
5.8 KiB
JavaScript
186 lines
5.8 KiB
JavaScript
let { snakeToCamel, renderFile, toLowerCaseFirstLetter } = require('./utils/index');
|
||
let ejs = require('ejs');
|
||
let { CUSTOM_REQUEST_FILE_PATH, BASE_FILE_PATH } = require('./utils/constant');
|
||
|
||
const contentTemplate = `import request from '<%= requestPath %>';
|
||
import { <%= item.responsesRef %>
|
||
<% if(item.requestBody && item.requestBody.$ref){ %>
|
||
,<%= item.requestBody.$ref %>
|
||
<% } %>
|
||
} from '../../interface';
|
||
|
||
/**
|
||
* <%= serverName + item.name %>
|
||
* <%= item.path %>
|
||
*/
|
||
export function <%= requireName.lowercaseFirstLetter %>(
|
||
<% if(item.requestQuery){ %>params: <%= requireName.capitalFirstLetter %>Params
|
||
<% }else if(item.requestBody && item.requestBody.$ref){%>params: <%= item.requestBody.$ref %>
|
||
<% }else if(item.requestBody && item.requestBody.paramsObj ){%>params: <%= getTypeString(item.requestBody.paramsObj) %>
|
||
<% } %>){return request.<%= item.method %><any,<%= item.responsesRef %><% if(item.method != 'post'){ %>,any<%}%>>(\`<%= item.path %>\`,
|
||
<% if(item.requestQuery){ %>{ params }
|
||
<% }else if(item.requestBody && item.requestBody.$ref){%>params
|
||
<% }else if(item.requestBody && item.requestBody.paramsObj && item.method == 'delete'){%>{ data: params }
|
||
<% }else if(item.requestBody && item.requestBody.paramsObj && item.method != 'delete'){%>params
|
||
<% } %>);
|
||
}
|
||
|
||
<% if (item.requestQuery) { %>
|
||
interface <%= requireName.capitalFirstLetter %>Params {
|
||
<% item.requestQuery.forEach((itemKey)=> { %>
|
||
/** <%= itemKey.description %> */
|
||
<%= itemKey.name %><% if (itemKey.nullable) { %>?<% } %>: <%= getTypeString(itemKey.schema) %>;
|
||
<% }) %>
|
||
}
|
||
<% } %>
|
||
|
||
`;
|
||
|
||
/**
|
||
* 类型判断辅助函数
|
||
* @param {Object} itemKey
|
||
* @returns
|
||
*/
|
||
function getTypeString(property) {
|
||
if (property['type'] === 'integer') {
|
||
return 'number';
|
||
} else if (property['type'] === 'array' && property['items'].type) {
|
||
return getTypeString(property['items']) + '[]';
|
||
} else if (property['type'] === 'array') {
|
||
return 'any[]';
|
||
} else if (property['type'] == undefined) {
|
||
return 'any';
|
||
} else {
|
||
return property['type'];
|
||
}
|
||
}
|
||
|
||
function renderController(obj) {
|
||
let tags = obj.tags;
|
||
let paths = obj.paths;
|
||
//controller主目录下的index.ts文件内容
|
||
let indexMainContentStr = '';
|
||
let indexMainFilePath = BASE_FILE_PATH + `/controller/index.ts`;
|
||
|
||
let data = handleControllerInfo(tags, paths);
|
||
if (!data) return;
|
||
for (let i = 0; i < data.length; i++) {
|
||
let item = data[i];
|
||
//每个接口目录下的index.ts文件内容
|
||
let indexContentStr = '';
|
||
//每个接口目录下的index.ts路径
|
||
let indexFilePath = BASE_FILE_PATH + `/controller/${item.name}/index.ts`;
|
||
indexMainContentStr += `export * from "./${item.name}";\r`;
|
||
|
||
//pathInfo
|
||
if (item.pathInfo) {
|
||
for (let j = 0; j < item.pathInfo.length; j++) {
|
||
let itemChild = item.pathInfo[j];
|
||
let templateStr = ejs.render(contentTemplate, {
|
||
requireName: { lowercaseFirstLetter: toLowerCaseFirstLetter(itemChild.requireName), capitalFirstLetter: itemChild.requireName },
|
||
serverName: item.name,
|
||
item: itemChild,
|
||
getTypeString: getTypeString,
|
||
requestPath: CUSTOM_REQUEST_FILE_PATH,
|
||
});
|
||
let filePath = BASE_FILE_PATH + `/controller/${item.name}/${itemChild.requireName}.ts`;
|
||
indexContentStr += `export * from "./${itemChild.requireName}";\r`;
|
||
renderFile(filePath, templateStr);
|
||
}
|
||
renderFile(indexFilePath, indexContentStr);
|
||
} else {
|
||
// console.log(item)
|
||
}
|
||
}
|
||
renderFile(indexMainFilePath, indexMainContentStr);
|
||
}
|
||
|
||
//处理swagger中的tags,paths 数据,将两种数据合并,作为模板使用数据
|
||
function handleControllerInfo(tags, paths) {
|
||
try {
|
||
tags.forEach((item) => {
|
||
Object.defineProperty(item, 'pathInfo', {
|
||
value: [],
|
||
writable: true,
|
||
enumerable: true,
|
||
configurable: true,
|
||
});
|
||
});
|
||
let tagsArr = tags;
|
||
|
||
for (let key in paths) {
|
||
let obj = {};
|
||
//请求信息
|
||
let pathsItem = paths[key];
|
||
let requireNameArr = key.split('/');
|
||
obj.path = key;
|
||
|
||
for (let keyChild in pathsItem) {
|
||
//keyChild请求方法 以及 pathsItemChild请求信息
|
||
let pathsItemChild = pathsItem[keyChild];
|
||
//接口名称
|
||
obj.name = pathsItemChild.summary;
|
||
|
||
//body 处理
|
||
if (pathsItemChild.requestBody) {
|
||
let content = pathsItemChild.requestBody.content;
|
||
//请求参数的类型
|
||
for (let keyContent in content) {
|
||
obj.requestBody = {};
|
||
if (content[keyContent].schema['$ref']) {
|
||
obj.requestBody.$ref = content[keyContent].schema['$ref'].replace('#/components/schemas/', '');
|
||
}
|
||
if (content[keyContent].schema['type']) {
|
||
obj.requestBody.paramsObj = content[keyContent].schema;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
//query 处理
|
||
pathsItemChild.parameters ? (obj.requestQuery = pathsItemChild.parameters) : '';
|
||
|
||
// responses处理
|
||
if (pathsItemChild.responses) {
|
||
let responsesItem = pathsItemChild.responses;
|
||
for (let keyResultCode in responsesItem) {
|
||
let resulteCodeItem = responsesItem[keyResultCode].content;
|
||
//响应参数的类型
|
||
for (let keyContent in resulteCodeItem) {
|
||
if (resulteCodeItem[keyContent].schema['$ref']) {
|
||
//响应返回值类型
|
||
obj.responsesRef = resulteCodeItem[keyContent].schema['$ref'].replace('#/components/schemas/', '');
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//生成文件名 有唯一性
|
||
obj.tags = pathsItemChild.tags[0];
|
||
//请求方法
|
||
obj.method = keyChild;
|
||
//请求方法名称
|
||
obj.requireName = obj.tags + snakeToCamel(requireNameArr[requireNameArr.length - 1]);
|
||
}
|
||
|
||
tagsArr = tagsArr.map((item) => {
|
||
if (item.name == obj.tags) {
|
||
item.pathInfo.push(obj);
|
||
}
|
||
return item;
|
||
});
|
||
}
|
||
|
||
//生成数据文件,以便调试
|
||
// renderFile('./aa.json', JSON.stringify(tagsArr))
|
||
|
||
return tagsArr;
|
||
} catch (error) {
|
||
console.log(error);
|
||
}
|
||
}
|
||
|
||
module.exports = {
|
||
renderController,
|
||
};
|