UNPKG

milady

Version:

Generate the front-end code by parsing the interface document

269 lines (230 loc) 7.62 kB
"use strict"; 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;