nei-interface
Version:
auto create interface by nei
176 lines (160 loc) • 6.86 kB
JavaScript
const chalk = require('chalk');
const path = require("path");
const appendFile = require('./append-file');
const {initRequest, request} = require('./request')
const Utils = require('./util');
let Config = {}
let ajaxCount = 0, successAjaxCount = 0// 用以记录获取到的接口数量,包含成功失败
let interfaceArr = []// 存放所有project的 interface声明
let ajaxArr = []//存放所有project的 ajax 数据
//拼接ajax
function appendAjaxFile(interfaceById){
let tmpArr = [`\r\n\r\n /*`, ` * url:${interfaceById.path}`, ` * 方法:${interfaceById.method}`,` * 入参:${interfaceById.interfaceName}Args`,` * 返回:${interfaceById.interfaceName}`, , ' */'];
tmpArr.push(` async ${interfaceById.interfaceName}(params: ${interfaceById.interfaceName}Args) {`)
tmpArr.push(` return await api.${interfaceById.method.toLowerCase()}('${interfaceById.path}', params);`)
tmpArr.push(` }`)
ajaxArr.push(tmpArr.join('\r\n'))
}
//拼接interface
function getInterfaceArr(data){
if(data && data.data instanceof Array){
data.name = Utils.keywordFormat(Utils.deleteSpecialChar(data.name));
data.data.sort((a, b) => {
return a.name.toUpperCase() > b.name.toUpperCase() ? 1 : -1
})//按照字母顺序排序
let arr = [`/* ${Utils.deleteSpace(data.description)} */`, `interface ${data.name} {`]
if(data.data.length){
data.data.map( item => {
if(item.name && (item.typeName || item.type)){
item.name = Utils.keywordFormat(Utils.deleteSpecialChar(item.name));
arr.push(` ${item.name}${item.required && !Config.SAFE_MODE ? '' : '?'}: ${item.typeName ? Utils.typeNameFormat(item.typeName) : Utils.getIdName(item.type) + ''}${item.isArray ? '[]' : ''}; //${Utils.deleteSpace(item.description.substring(0,100))}`)
} else if(!item.name && item.typeName){
arr.push(` ${item.typeName}${item.required && !Config.SAFE_MODE ? '' : '?'}: ${item.typeName}${item.isArray ? '[]' : ''}; //${Utils.deleteSpace(item.description.substring(0,100))}`)
} else {
console.log(chalk.hex('#82e0d0')(` warning:interface为 ${data.name} 的接口声明内缺少 name or type,请确认nei数据是有有误`))
}
})
} else {
arr.push(` [propName: string]: any; //此项未定义,默认为any`)
}
arr.push(`}`)
return arr
} else {
return []
}
}
let projectDescription = ''//获取当前项目的基础信息
async function getProjectInfo(){
let res = await request('3api/projects', { data: {pgid: Config.PROJECT_ID}})
if(!res){
return false
}
projectDescription = [`/*`, `项目名称:${res.result.name}`,`projectId:${res.result.id}`,`*/`].join('\r\n')
}
//获取项目所有的接口信息
async function getInterfaces(){
let res = await request('3api/interfaces/', {data: {pid: Config.PROJECT_ID}})
if(!res){
return false
}
let interfaces = res.result
interfaces.map((item) => {
getInterfaceById(item.id)
})
let st = setInterval(function(){
if(interfaces.length === ajaxCount){
clearInterval(st)
ajaxArr.push('}')
console.log(chalk.blue(`共${ajaxCount}个ajax接口数据,其中${successAjaxCount}个获取成功……`))
appendFile(interfaceArr.sort().join('\r\n'), Config.TYPES_DIST + '/' + Config.TYPES_NAME1, `项目 接口声明`)
if(Config.API_PREINIT.length){
appendFile(ajaxArr.sort().join('\r\n'), Config.API_DIST + '/index.ts', `ajax方法`)
}
}
},200)
}
//获取某个ajax接口的入参和返回
async function getInterfaceById(id) {
let res = await request('3api/interfaces/' + id)
ajaxCount++
if(!res){
return false
}
successAjaxCount++
let interfaceById = res.result
let params = interfaceById.params
let tmpArr = interfaceById.path.split('/').slice(-2);
let tmpInterfaceName = '';
if(tmpArr.length === 1){
tmpInterfaceName = tmpArr[0];
} else if(tmpArr.length === 2){
var tmpStr = tmpArr[1];
tmpInterfaceName = tmpArr[0] + tmpStr.substring(0,1).toUpperCase() + tmpStr.substring(1);
} else {
return false;
}
tmpInterfaceName = Utils.deleteSpecialChar(tmpInterfaceName);
interfaceById.interfaceName = tmpInterfaceName
let arr = [`\r\n/*`,`接口名:${interfaceById.name}`, `url:${interfaceById.path}`, `方法:${interfaceById.method}`,'*/', ``];
let input_arr = getInterfaceArr({
name: `${interfaceById.interfaceName}Args`,
description: `${interfaceById.path}接口的入参`,
data: params.inputs
})
let out_arr = getInterfaceArr({
name: `${interfaceById.interfaceName}`,
description: `${interfaceById.path}接口的返回`,
data: params.outputs
})
arr = arr.concat(input_arr, out_arr)
interfaceArr.push(arr.join('\r\n'))
if(Config.API_PREINIT.length){
appendAjaxFile(interfaceById)
}
}
//获取项目的所有数据模型
async function getDataTypes(){
let res = await request('3api/datatypes/', { data: {pid: Config.PROJECT_ID} })
if(!res){
return false
}
let datatypes = [];
let error_arr = [];
res.result.map(item => {
item.name = item.name || Utils.getIdName(item.id)
if(item.name){
if(!Config.BASE_TYPES[item.name]){//基础类型不用写
datatypes.push(item)
}
} else {
error_arr.push(item)
}
});
datatypes.sort((a, b) => {
return a.name.toUpperCase() > b.name.toUpperCase() ? 1 : -1
});
let arr = [`/*`,`所有数据模型`,'*/', ``]
datatypes.map( item => {
let tmp_arr = getInterfaceArr({
name: item.name,
description: Utils.deleteSpace(item.description),
data: item.params
})
arr = arr.concat(tmp_arr)
});
if(error_arr.length){
console.log(chalk.hex('#82e0f9')(` warning:在本项目的数据模型中,共有${error_arr.length}条数据缺少name值,无法生成interface,请确认哦!`))
}
appendFile(arr.join('\r\n'), Config.TYPES_DIST + '/' + Config.TYPES_NAME2, '所有公用数据模型的接口声明')
}
let getNeiData = (config) => {
Config = config
initRequest(Config)
if(Config.API_PREINIT.length){
ajaxArr = ['/*', '* 所有的请求方法都定义在这里', '*/'].concat(Config.API_PREINIT,['', 'export default {'])
}
//getProjectInfo()
getDataTypes()
getInterfaces()
}
module.exports = getNeiData;