@liuit/apigen 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +53 -0
- package/dist/index.cjs.js +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.umd.js +1 -0
- package/dist/model/index.d.ts +177 -0
- package/dist/util/ApiTemplateUtil.d.ts +90 -0
- package/dist/util/CodeGenUtil.d.ts +37 -0
- package/dist/util/DateUtil.d.ts +32 -0
- package/dist/util/HeaderUtil.d.ts +13 -0
- package/dist/util/NameUtil.d.ts +24 -0
- package/dist/util/SwaggerUtil.d.ts +115 -0
- package/package.json +77 -0
package/README.md
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
### swagger代码前端生成生成
|
|
2
|
+
### 一. 本组介绍
|
|
3
|
+
|
|
4
|
+
```
|
|
5
|
+
作者: 黑肱
|
|
6
|
+
邮箱: zuiwoxing@qq.com
|
|
7
|
+
本组件介绍: 本组件主要提供前端代码生成(models,apis以及xxApis 接口索引),与@liuit/api 集成使用,生成符合@liuit/api要求的API接口,为前端提供一站式网络请求服务。
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### 二. 组件安装
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
yarn add @liuit/apigen 或者 npm install @liuit/apigen
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### 三. 使用示例
|
|
19
|
+
```typescript
|
|
20
|
+
|
|
21
|
+
import {CodeGenUtil} from "@liuit/apigen"
|
|
22
|
+
|
|
23
|
+
let token = "xxxx"; // 选填
|
|
24
|
+
let url = "http://127.0.0.1:8081/sd/v3/api-docs/uc-api"; // swagger api 接口
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 生成代码 (默认生成代码 在 outputDir/contextPath 目录下 生成(models.ts,apis.ts,index.ts)三个文件)
|
|
29
|
+
@param swaggerApiUrl swagger服务API地址
|
|
30
|
+
@param token 令牌
|
|
31
|
+
@param contextPath 上下文路径(前缀)
|
|
32
|
+
@param apiSuffix API后缀 domain+apiSuffix+Api
|
|
33
|
+
@param excludePrefix 需要排除的固定前缀(如 /api/gc)
|
|
34
|
+
@param outputDir 输出文件夹(可根据模块输出,相对于本地目录。默认本地: auto-code)
|
|
35
|
+
*/
|
|
36
|
+
CodeGenUtil.genCodeToFile(url, token, "/sd","In","/api/gc","./auto")
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* 生成代码 返回 CodeInfo
|
|
40
|
+
* @param swaggerApiUrl swagger服务API地址
|
|
41
|
+
* @param token 令牌
|
|
42
|
+
* @param contextPath 上下文路径(前缀)
|
|
43
|
+
* @param apiSuffix API后缀 domain+apiSuffix+Api
|
|
44
|
+
* @param excludePrefix 需要排除的固定前缀(如 /api/gc)
|
|
45
|
+
*/
|
|
46
|
+
CodeGenUtil.genCodeContent(url, token, "/sd","In","/api/gc")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 三. 使用示例
|
|
52
|
+
|
|
53
|
+
参见: https://doc.liuit.com
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e,t=require("axios"),r=require("fs"),n=require("liquidjs"),i=require("path");exports.HttpMethod=void 0,(e=exports.HttpMethod||(exports.HttpMethod={})).GET="GET",e.PUT="PUT",e.POST="POST",e.DELETE="DELETE",e.HEADER="HEADER",e.OPTIONS="OPTIONS",e.PATCH="PATCH";class a{constructor(){Object.defineProperty(this,"bodyName",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"bodyType",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"required",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}}class o{constructor(){Object.defineProperty(this,"paramName",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"ref",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"paramType",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"format",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"required",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"in",{enumerable:!0,configurable:!0,writable:!0,value:"query"})}}class s{constructor(){Object.defineProperty(this,"domain",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"path",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"method",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"remark",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"tag",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"operationId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"reqBody",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"reqParams",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"responseType",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}methodOf(e){if((e=e.toUpperCase().trim())===exports.HttpMethod.GET.toString())return exports.HttpMethod.GET;if(e===exports.HttpMethod.POST.toString())return exports.HttpMethod.POST;if(e===exports.HttpMethod.PUT.toString())return exports.HttpMethod.PUT;if(e===exports.HttpMethod.DELETE.toString())return exports.HttpMethod.DELETE;if(e===exports.HttpMethod.HEADER.toString())return exports.HttpMethod.HEADER;if(e===exports.HttpMethod.PATCH.toString())return exports.HttpMethod.PATCH;if(e===exports.HttpMethod.OPTIONS.toString())return exports.HttpMethod.OPTIONS;throw new Error("not support "+e)}addParam(e){return this.reqParams||(this.reqParams=new Array),this.reqParams.push(e),this}}class l{constructor(){Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"title",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"entityFields",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}static of(e,t,r){const n=new l;return n.name=e,n.title=t,n.type=r,n}addField(e){return null==this.entityFields&&(this.entityFields=new Array),this.entityFields.push(e),this}}class c{constructor(){Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"title",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"format",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"required",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"maxLength",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"minLength",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"ref",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}static of(e,t,r,n,i,a,o,s){const l=new c;return l.name=e,l.title=t,l.type=r,l.format=n,l.required=i,l.minLength=a,l.maxLength=o,l.ref=s,l}}class p{constructor(){Object.defineProperty(this,"models",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"apis",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"index",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}}function u(e,t,r,n){return new(r||(r=Promise))(function(i,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function s(e){try{l(n.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(o,s)}l((n=n.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;class d{static splitWords(e){return e.trim().replace(/[_\s-]+/g,"_").split("_").filter(Boolean)}static toPascalCase(e){const t=d.splitWords(e);return 0===t.length?"":t.map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("")}static toCamelCase(e){const t=d.splitWords(e);if(0===t.length)return"";return t[0].toLowerCase()+t.slice(1).map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("")}static pascalToCamel(e){return e?e.charAt(0).toLowerCase()+e.slice(1):e}static removeSymbol(e){if(!e)return e;let t=e;const r=/<[^<>]*>/g;for(;r.test(t);)t=t.replace(r,"");return t.trim()}}class m{static getSchemaType(e){if(e.$ref){const t=e.$ref.split("/");return t[t.length-1]}if("string"===e.type)return"date-time"===e.format?"string /* date-time */":e.enum?e.enum.map(e=>`'${e}'`).join(" | "):"string";if("number"===e.type||"integer"===e.type)return e.enum?e.enum.map(e=>e.toString()).join(" | "):"number";if("boolean"===e.type)return"boolean";if("array"===e.type&&e.items)return`Array<${m.getSchemaType(e.items)}>`;if("object"===e.type&&e.properties){let t="";return Object.entries(e.properties).forEach(([r,n],i,a)=>{var o,s;const l=null!==(s=null===(o=e.required)||void 0===o?void 0:o.includes(r))&&void 0!==s&&s,c=m.getSchemaType(n);t+=`${r}${l?"":"?"}: ${c}`,i<a.length-1&&(t+="; ")}),`{ ${t} }`}return e.oneOf?e.oneOf.map(e=>m.getSchemaType(e)).join(" | "):e.anyOf?e.anyOf.map(e=>m.getSchemaType(e)).join(" | "):e.allOf?e.allOf.map(e=>m.getSchemaType(e)).join(" & "):"any"}static getFunctionName(e,t,r){if(r.operationId){let e=/.*_[0-9]+$/,t=r.operationId;return e.test(t)&&(t=t.replace(/_\d+$/,"")),t}let n=t.toLowerCase();return e.split("/").filter(e=>e).forEach(e=>{e.startsWith("{")&&e.endsWith("}")?n+=e.slice(1,-1).charAt(0).toUpperCase()+e.slice(2,-1):n+=e.charAt(0).toUpperCase()+e.slice(1)}),n}static getOpenAPI(e,r){return u(this,void 0,void 0,function*(){let n=null;n=r?yield t.get(e,{headers:{Authorization:"Bearer "+r}}):yield t.get(e);return n.data})}static parseModelToMap(e){var t;const r=new Map;return(null===(t=e.components)||void 0===t?void 0:t.schemas)&&Object.entries(e.components.schemas).forEach(([t,n])=>{let i=m.parseModel(t,n,e);r.set(i.name,i)}),r}static getInnermostGenerics(e){const t=[],r=e.trim(),n=r.indexOf("<");if(-1===n)return[r];const i=r.substring(n+1,r.length-1).trim();let a=0,o=0;for(let e=0;e<i.length;e++){const r=i[e];if("<"===r)o++;else if(">"===r)o--;else if(","===r&&0===o){const r=i.substring(a,e).trim();r&&t.push(...m.getInnermostGenerics(r)),a=e+1}}const s=i.substring(a).trim();return s&&t.push(...m.getInnermostGenerics(s)),t}static parseNestedGenerics(e){const t=e.trim(),r=t.indexOf("<");if(-1===r)return{name:t};const n=t.substring(0,r).trim(),i=t.substring(r+1,t.length-1).trim(),a=[];let o=0,s=0;for(let e=0;e<i.length;e++){const t=i[e];if("<"===t)s++;else if(">"===t)s--;else if(","===t&&0===s){const t=i.substring(o,e).trim();t&&a.push(m.parseNestedGenerics(t)),o=e+1}}const l=i.substring(o).trim();return l&&a.push(m.parseNestedGenerics(l)),{name:n,children:a}}static parseModels(e){var t;const r=new Array;return(null===(t=e.components)||void 0===t?void 0:t.schemas)&&Object.entries(e.components.schemas).forEach(([t,n])=>{let i=m.parseModel(t,n,e);r.push(i)}),r}static convertNameToType(e){if(/Request[a-zA-Z0-9]+/.test(e)){e.endsWith("RequestBo")||e.endsWith("RequestDto")||e.endsWith("RequestVo")?(e.startsWith("Request")&&(e=e.replace("Request","Request<")+">"),e.startsWith("Page")&&(e=e.replace("Page","Page<")+">")):e=e.replace("Request","Request<")+">"}if(/Response[a-zA-Z0-9]+/.test(e)&&(e=e.replace("Response","Response<")+">"),/Response<Page[a-zA-Z0-9]+>/.test(e)&&(e=e.replace("Page","Page<")+">"),/Response<List[a-zA-Z0-9]+>/.test(e)&&(e=e.replace("List","Array<")+">"),/Response<Set[a-zA-Z0-9]+>/.test(e)&&(e=e.replace("Set","Array<")+">"),/.*<Integer|Long>.*/.test(e)&&(e=(e=e.replace("<Integer>","<number>")).replace("<Long>","<number>")),/Response<String>/.test(e)&&(e=e.replace("<String>","<string>")),/Response<Boolean>/.test(e)&&(e=e.replace("<Boolean>","<boolean>")),/Response<Map[a-zA-Z0-9]+>/.test(e)){e=e.replace("Map","Map<")+">";let t=m.getInnermostGenerics(e)[0];if(/(Integer|Long|String).*/.test(t)){let r="",n="";t.startsWith("Long")?(r=t.substring(0,4),n=t.substring(4,t.length)):t.startsWith("Integer")?(r=t.substring(0,7),n=t.substring(7,t.length)):t.startsWith("String")&&(r=t.substring(0,6),n=t.substring(6,t.length)),r=r.replace("Long","number"),r=r.replace("Integer","number"),r=r.replace("String","string"),n=n.replace("Long","number"),n=n.replace("Integer","number"),n=n.replace("String","string"),e=e.replace(t,r+","+n)}}return e}static parseModel(e,t,r){let n=new l;const i=/Request.*/,a=/Response.*/,o=/Page.*/,s=/List.*/,p=/Set.*/;if(n.title=t.title||t.description||"",n.name=m.convertNameToType(e),t.oneOf||t.anyOf||t.allOf){let r="";r+=`export type ${e} = `,t.oneOf?r+=t.oneOf.map(e=>m.getSchemaType(e)).join(" | "):t.anyOf?r+=t.anyOf.map(e=>m.getSchemaType(e)).join(" | "):t.allOf&&(r+=t.allOf.map(e=>m.getSchemaType(e)).join(" & ")),r+=";\n"}else"object"===t.type&&t.properties?Object.entries(t.properties).forEach(([e,r])=>{var l,u;const d=null!==(u=null===(l=t.required)||void 0===l?void 0:l.includes(e))&&void 0!==u&&u;let f=m.getSchemaType(r),h=new c;if(h.title=r.title||r.description||"",i.test(f)){f.endsWith("RequestBo")||f.endsWith("RequestDto")||f.endsWith("RequestVo")?(f.startsWith("Request")&&(f=f.replace("Request","Request<")+">"),f.startsWith("Page")&&(f=f.replace("Page","Page<")+">")):f=f.replace("Request","Request<")+">"}a.test(f)&&(f=f.replace("Response","Response<")+">"),o.test(f)&&(f=f.replace("Page","Page<")+">"),s.test(f)&&(f=f.replace("List","Array<")+">"),p.test(f)&&(f=f.replace("Set","Array<")+">"),h.name=e,h.required=d,h.type=f,n.addField(h)}):"array"===t.type&&t.items?m.getSchemaType(t.items):t.enum?t.enum.forEach((e,t)=>{}):m.getSchemaType(t);return n}static filterPath(e){return e.filter(e=>!(e.startsWith("{")&&e.endsWith("}")))}static getCommonRootPath(e){if(!e.length)return"";const t=e.map(e=>e.split("/").filter(Boolean)),r=t[0];let n=0;for(let e=0;e<r.length;e++){if(!t.every(t=>t[e]===r[e]))break;n++}return"/"+r.slice(0,n).join("/")}static getSubPathAfterRoot(e,t){const r=e.endsWith("/")?e.slice(0,-1):e;let n=(t.endsWith("/")?t.slice(0,-1):t).replace(r,"");return n.startsWith("/")&&(n=n.slice(1)),n}static buildPathKeyMap(e,t){const r=new Map;if(!e.length)return r;const n=e.map(e=>e.startsWith(t)?e.slice(t.length):e),i=new Map;return n.forEach((r,n)=>{const a=e[n],o=r.split("/").filter(Boolean)[0]||"";if(!o)return;const s=`${t}/${o}`;i.has(s)||i.set(s,[]),i.get(s).push(a)}),i.forEach((e,t)=>{const n=t.split("/").filter(Boolean).pop()||"",i=d.toPascalCase(n);r.set(t,i)}),r}static getLastPathSegment(e){return e.split("/").filter(Boolean).pop()||""}static getDomainByPath(e,t){if(!e||!t)return"";const r=Array.from(e.keys()).filter(e=>t.startsWith(e));if(0===r.length)return"";const n=r.sort((e,t)=>t.length-e.length)[0];return e.get(n)||""}static parseApi(e,t){const r=new Map;let n=e.paths;const i=new Array;Object.entries(n).forEach(([e])=>{i.push(e)});const l=m.buildPathKeyMap(i,t);return Object.entries(n).forEach(([e,t])=>{Object.entries(t).forEach(([t,n])=>{var i,c,p,u,f;const h=m.getFunctionName(e,t,n);let g=m.getDomainByPath(l,e);if(!g||0==g.length){let t=e.split("/");if(t.length>=2){if(g=t[t.length-2],g.startsWith("{")&&g.endsWith("}")){let e=m.filterPath(t);e.length>=2&&(g=e[e.length-2])}g=d.toPascalCase(g)}}let b=r.get(g);b||(b=new Array);let y=new s;y.domain=g,y.method=y.methodOf(t),y.operationId=h,y.path=e;const v=(n.tags||["default"])[0];n.description,y.remark=n.description||n.summary||"",y.tag=v;let P="";if(n.requestBody&&(null===(i=n.requestBody)||void 0===i?void 0:i.content["application/json"])){const e=n.requestBody.content["application/json"].schema;P=m.getSchemaType(e);let t=new a;t.bodyName="data",t.bodyType=P,t.required=!0,y.reqBody=t}if(n.parameters&&n.parameters.length>0){const e=n.parameters.filter(e=>"path"===e.in),t=n.parameters.filter(e=>"query"===e.in);(e.length>0||t.length>0)&&n.parameters.forEach((e,t)=>{const r=m.getSchemaType(e.schema),n=new o;n.paramName=e.name,n.paramType=r,n.required=!!e.required&&e.required,n.in=e.in,y.addParam(n)})}let O="any";const w=n.responses[200]||n.responses[201]||Object.values(n.responses)[0];(null===(p=null===(c=null==w?void 0:w.content)||void 0===c?void 0:c["application/json"])||void 0===p?void 0:p.schema)?O=m.getSchemaType(w.content["application/json"].schema):(null===(f=null===(u=null==w?void 0:w.content)||void 0===u?void 0:u["*/*"])||void 0===f?void 0:f.schema)&&(O=m.getSchemaType(w.content["*/*"].schema)),O=m.convertNameToType(O),y.responseType=O,b.push(y),r.set(g,b)})}),r}}const f=new n.Liquid;class h{static getDefaultExcludes(){let e=new Array;return e.push(new RegExp("Response<.*")),e.push(new RegExp("Page.*")),e.push(new RegExp("Request<.*")),e}static modelTemplate(e="class"){let t="";return t+="{% for entity in entities %}",t+="{% if entity.title != ''%}",t+="/**{{entity.title}}*/ \n",t+="{% endif %}",t+="class"==e?"export class {{entity.name}} {\n":"export interface {{entity.name}} {\n",t+="{% for field in entity.entityFields %}",t+="{% if field.title !='' %}",t+="\t/** {{field.title}} */ \n",t+="{% endif %}",t+="{% if field.required == true %}",t+="class"==e?"\t{{field.name}}!:{{field.type}}; \n":"\t{{field.name}}:{{field.type}}; \n",t+="{% else %}",t+="\t{{field.name}}?:{{field.type}}; \n",t+="{% endif %}",t+="{% endfor %}",t+="}\n",t+="{% endfor %}",t}static apiCommonImports(){let e="import 'reflect-metadata';\n";return e+='import {Api, CC, MC, SC, Page,Get,Put,Delete,Post, Request, Response, Security,RA} from "@liuit/api";\n',e+='import {IocContext, Service} from "@liuit/core";\n','import \'reflect-metadata\';\nimport {Api, CC, MC, SC, Page,Get,Put,Delete,Post, Request, Response, Security,RA} from "@liuit/api";\nimport {IocContext, Service} from "@liuit/core";\n'}static dynamicImportOrExportModel(e,t,r){let n="";r||(r=h.getDefaultExcludes());const i=h.filterModels(t,r);if(i){n="import"==e?"import {":"export {";for(let e=0;e<i.length;e++){let t=i[e];e==i.length-1?n+=t.name:n+=t.name+","}n+='} from "./models"'}return n}static dynamicImportOrExportApi(e,t,r){null!=r&&null!=r&&0!=r.trim().length||(r="");let n=e+" {";return t.forEach((e,t)=>{n+=t+r+"Api,"}),n=n.substring(0,n.length-1),n+='} from "./apis"',n}static dynamicImportApis(e,t,r){null!=r&&null!=r&&0!=r.trim().length||(r="");let n="const "+e+r+"Apis = {\n";if(t){let e=0;t.forEach((i,a)=>{let o=a+r+"Api";e==t.size-1?n+="\t"+o+": IocContext.getBean<"+o+">("+o+")\n":n+="\t"+o+": IocContext.getBean<"+o+">("+o+"),\n",e++})}return n+="}\n",n+="export {"+e+r+"Apis}\n",n}static firstWordUp(e){return e=(e=e.toLowerCase()).charAt(0).toUpperCase()+e.slice(1)}static genApi(e,t,r,n,i,a,o){let s="";s+="\n",o&&(s+=h.apiCommonImports()),null!=i&&null!=i&&0!=i.trim().length||(i=""),s+="\n@Service()\n",s+="@Api(CC.of('"+e+"', '"+r+"', '"+t+"', '"+n+"'))\n",s+="export class "+t+i+"Api {\n";for(let e of a){s+="\t@"+h.firstWordUp(e.method)+"(";let t=e.path;s+="MC.of('"+m.getSubPathAfterRoot(r,t)+"','"+e.remark+"')",s+=")\n",s+="\tpublic "+e.operationId+"(";let n="";if(e.reqBody){let t=e.reqBody.bodyType;t=d.removeSymbol(t),n+=d.pascalToCamel(t)+":"+m.convertNameToType(e.reqBody.bodyType)}if(e.reqParams){let t=e.reqParams,r="";for(let e of t)r+=e.paramName,e.required||(r+="?"),r+=":"+e.paramType+",";r=r.substring(0,r.length-1),s+=n?n+","+r:r}else s+=n;s+=")";let i=e.responseType;i&&(s+=":",i&&i.startsWith("Response")&&(i=i.replace("Response","RA")),s+=i),s+=" {return RA.prototype}",s+="\n\n"}return s+="}\n",s}static genApis(e,t,r){let n="";return n+=h.apiCommonImports(),r.forEach((r,i)=>{let a=r.map(e=>e.path);const o=m.getCommonRootPath(a);let s=r[0].tag;n+=h.genApi(e,i,o,s,t,r,!1)}),n}static execute(e,t){return u(this,void 0,void 0,function*(){return yield f.parseAndRender(e,t)})}static executeSync(e,t){return f.parseAndRenderSync(e,t)}static filterModels(e,t){t||(t=h.getDefaultExcludes());let r=new Array;for(let n of e){if(t){let e=!1;for(let r of t)if(r.test(n.name)){e=!0;break}if(e)continue}r.push(n)}return r}static genModels(e,t,r){const n=h.filterModels(e,t);let i=h.modelTemplate(r);return h.execute(i,{entities:n})}static genModelsSync(e,t,r){const n=h.filterModels(e,t);let i=h.modelTemplate(r);return h.executeSync(i,{entities:n})}}class g{static formatDate(e,t,r="zh-CN"){const n=new Date(e);if(isNaN(n.getTime()))throw new Error("无效的日期格式");return new Intl.DateTimeFormat(r,Object.assign(Object.assign({},{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}),t)).format(n)}static formatDateOnly(e){return g.formatDate(e,{year:"numeric",month:"2-digit",day:"2-digit"})}static formatTimeOnly(e){return g.formatDate(e,{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}static formatDateWithTimezone(e){return g.formatDate(e,{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1,timeZoneName:"short"})}}class b{static getHeaderAnno(e,t){let r=" /**\n";return r+=" *@desc "+e+" \n",r+=t?" *@author "+t+" \n":" *@author <a href='mailto:zuiwoxing@qq.com'>刘IT</a> \n",r+=" *@date "+g.formatDate(new Date)+" \n",r+=" */\n",r}}class y{static genCodeContent(e){return u(this,arguments,void 0,function*(e,t="",r="/",n="",i="/"){const a=new p;return yield m.getOpenAPI(e,t).then(e=>{let t=m.parseModels(e),o=h.getDefaultExcludes();const s=h.dynamicImportOrExportModel("import",t,o);let l=h.genModelsSync(t,o,"class");l=b.getHeaderAnno("实体类信息","<a href='mailto:zuiwoxing@qq.com'>刘IT</a>")+l,a.models=l;let c=m.parseApi(e,i),p=h.genApis(r,n,c),u=b.getHeaderAnno("API接口信息","<a href='mailto:zuiwoxing@qq.com'>刘IT</a>"),f=u+s+"\n"+p;a.apis=f;let g="";"/"==r?g="":(g=r.replace("/",""),g=d.toPascalCase(g));let v=y.genIndexContent(g,t,o,c,n);return v=u+v,a.index=v,a})})}static genCodeToFile(e,t="",n="/",a="",o="/",s){s||(s="./auto-code"),n&&(s+=n),r.existsSync(s)||r.mkdirSync(s,{recursive:!0}),m.getOpenAPI(e,t).then(e=>{let t=m.parseModels(e),l=h.getDefaultExcludes();const c=h.dynamicImportOrExportModel("import",t,l);let p=h.genModelsSync(t,l,"class");if("string"==typeof s){p=b.getHeaderAnno("实体类信息","<a href='mailto:zuiwoxing@qq.com'>刘IT</a>")+p,r.writeFileSync(i.join(s,"models.ts"),p)}let u=m.parseApi(e,o),f=h.genApis(n,a,u);if("string"==typeof s){let e=b.getHeaderAnno("API接口信息","<a href='mailto:zuiwoxing@qq.com'>刘IT</a>")+c+"\n"+f;r.writeFileSync(i.join(s,"apis.ts"),e)}if("string"==typeof s){let e="";"/"==n?e="":(e=n.replace("/",""),e=d.toPascalCase(e));let o=y.genIndexContent(e,t,l,u,a);o=b.getHeaderAnno("API集合索引","<a href='mailto:zuiwoxing@qq.com'>刘IT</a>")+o,r.writeFileSync(i.join(s,"index.ts"),o)}})}static genIndexContent(e,t,r,n,i){let a="";a+='\nimport {IocContext} from "@liuit/core";\n';a+=h.dynamicImportOrExportModel("export",t,r)+"\n";return a+=h.dynamicImportOrExportApi("import",n,i)+"\n",a+=h.dynamicImportApis(e,n,i),a}}exports.ApiTemplateUtil=h,exports.CodeGenUtil=y,exports.CodeInfo=p,exports.Entity=l,exports.EntityField=c,exports.ReqBody=a,exports.ReqParam=o,exports.SwApi=s,exports.SwaggerUtil=m;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*@desc 集中对外发布
|
|
3
|
+
*@author liudejian
|
|
4
|
+
*@date 2020-08-31 18:56
|
|
5
|
+
**/
|
|
6
|
+
export { CodeInfo, EntityField, Entity, SwApi, ReqParam, ReqBody, HttpMethod } from "./model/index";
|
|
7
|
+
export type { Schema, Parameter, Operation, OpenAPI } from "./model/index";
|
|
8
|
+
export { CodeGenUtil } from "./util/CodeGenUtil";
|
|
9
|
+
export { SwaggerUtil } from "./util/SwaggerUtil";
|
|
10
|
+
export { ApiTemplateUtil } from "./util/ApiTemplateUtil";
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import e from"axios";import t from"fs";import{Liquid as r}from"liquidjs";import n from"path";var i;!function(e){e.GET="GET",e.PUT="PUT",e.POST="POST",e.DELETE="DELETE",e.HEADER="HEADER",e.OPTIONS="OPTIONS",e.PATCH="PATCH"}(i||(i={}));class a{constructor(){Object.defineProperty(this,"bodyName",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"bodyType",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"required",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}}class o{constructor(){Object.defineProperty(this,"paramName",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"ref",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"paramType",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"format",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"required",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"in",{enumerable:!0,configurable:!0,writable:!0,value:"query"})}}class s{constructor(){Object.defineProperty(this,"domain",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"path",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"method",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"remark",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"tag",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"operationId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"reqBody",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"reqParams",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"responseType",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}methodOf(e){if((e=e.toUpperCase().trim())===i.GET.toString())return i.GET;if(e===i.POST.toString())return i.POST;if(e===i.PUT.toString())return i.PUT;if(e===i.DELETE.toString())return i.DELETE;if(e===i.HEADER.toString())return i.HEADER;if(e===i.PATCH.toString())return i.PATCH;if(e===i.OPTIONS.toString())return i.OPTIONS;throw new Error("not support "+e)}addParam(e){return this.reqParams||(this.reqParams=new Array),this.reqParams.push(e),this}}class l{constructor(){Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"title",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"entityFields",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}static of(e,t,r){const n=new l;return n.name=e,n.title=t,n.type=r,n}addField(e){return null==this.entityFields&&(this.entityFields=new Array),this.entityFields.push(e),this}}class c{constructor(){Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"title",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"format",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"required",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"maxLength",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"minLength",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"ref",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}static of(e,t,r,n,i,a,o,s){const l=new c;return l.name=e,l.title=t,l.type=r,l.format=n,l.required=i,l.minLength=a,l.maxLength=o,l.ref=s,l}}class p{constructor(){Object.defineProperty(this,"models",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"apis",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"index",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}}function u(e,t,r,n){return new(r||(r=Promise))(function(i,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function s(e){try{l(n.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(o,s)}l((n=n.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;class m{static splitWords(e){return e.trim().replace(/[_\s-]+/g,"_").split("_").filter(Boolean)}static toPascalCase(e){const t=m.splitWords(e);return 0===t.length?"":t.map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("")}static toCamelCase(e){const t=m.splitWords(e);if(0===t.length)return"";return t[0].toLowerCase()+t.slice(1).map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("")}static pascalToCamel(e){return e?e.charAt(0).toLowerCase()+e.slice(1):e}static removeSymbol(e){if(!e)return e;let t=e;const r=/<[^<>]*>/g;for(;r.test(t);)t=t.replace(r,"");return t.trim()}}class d{static getSchemaType(e){if(e.$ref){const t=e.$ref.split("/");return t[t.length-1]}if("string"===e.type)return"date-time"===e.format?"string /* date-time */":e.enum?e.enum.map(e=>`'${e}'`).join(" | "):"string";if("number"===e.type||"integer"===e.type)return e.enum?e.enum.map(e=>e.toString()).join(" | "):"number";if("boolean"===e.type)return"boolean";if("array"===e.type&&e.items)return`Array<${d.getSchemaType(e.items)}>`;if("object"===e.type&&e.properties){let t="";return Object.entries(e.properties).forEach(([r,n],i,a)=>{var o,s;const l=null!==(s=null===(o=e.required)||void 0===o?void 0:o.includes(r))&&void 0!==s&&s,c=d.getSchemaType(n);t+=`${r}${l?"":"?"}: ${c}`,i<a.length-1&&(t+="; ")}),`{ ${t} }`}return e.oneOf?e.oneOf.map(e=>d.getSchemaType(e)).join(" | "):e.anyOf?e.anyOf.map(e=>d.getSchemaType(e)).join(" | "):e.allOf?e.allOf.map(e=>d.getSchemaType(e)).join(" & "):"any"}static getFunctionName(e,t,r){if(r.operationId){let e=/.*_[0-9]+$/,t=r.operationId;return e.test(t)&&(t=t.replace(/_\d+$/,"")),t}let n=t.toLowerCase();return e.split("/").filter(e=>e).forEach(e=>{e.startsWith("{")&&e.endsWith("}")?n+=e.slice(1,-1).charAt(0).toUpperCase()+e.slice(2,-1):n+=e.charAt(0).toUpperCase()+e.slice(1)}),n}static getOpenAPI(t,r){return u(this,void 0,void 0,function*(){let n=null;n=r?yield e.get(t,{headers:{Authorization:"Bearer "+r}}):yield e.get(t);return n.data})}static parseModelToMap(e){var t;const r=new Map;return(null===(t=e.components)||void 0===t?void 0:t.schemas)&&Object.entries(e.components.schemas).forEach(([t,n])=>{let i=d.parseModel(t,n,e);r.set(i.name,i)}),r}static getInnermostGenerics(e){const t=[],r=e.trim(),n=r.indexOf("<");if(-1===n)return[r];const i=r.substring(n+1,r.length-1).trim();let a=0,o=0;for(let e=0;e<i.length;e++){const r=i[e];if("<"===r)o++;else if(">"===r)o--;else if(","===r&&0===o){const r=i.substring(a,e).trim();r&&t.push(...d.getInnermostGenerics(r)),a=e+1}}const s=i.substring(a).trim();return s&&t.push(...d.getInnermostGenerics(s)),t}static parseNestedGenerics(e){const t=e.trim(),r=t.indexOf("<");if(-1===r)return{name:t};const n=t.substring(0,r).trim(),i=t.substring(r+1,t.length-1).trim(),a=[];let o=0,s=0;for(let e=0;e<i.length;e++){const t=i[e];if("<"===t)s++;else if(">"===t)s--;else if(","===t&&0===s){const t=i.substring(o,e).trim();t&&a.push(d.parseNestedGenerics(t)),o=e+1}}const l=i.substring(o).trim();return l&&a.push(d.parseNestedGenerics(l)),{name:n,children:a}}static parseModels(e){var t;const r=new Array;return(null===(t=e.components)||void 0===t?void 0:t.schemas)&&Object.entries(e.components.schemas).forEach(([t,n])=>{let i=d.parseModel(t,n,e);r.push(i)}),r}static convertNameToType(e){if(/Request[a-zA-Z0-9]+/.test(e)){e.endsWith("RequestBo")||e.endsWith("RequestDto")||e.endsWith("RequestVo")?(e.startsWith("Request")&&(e=e.replace("Request","Request<")+">"),e.startsWith("Page")&&(e=e.replace("Page","Page<")+">")):e=e.replace("Request","Request<")+">"}if(/Response[a-zA-Z0-9]+/.test(e)&&(e=e.replace("Response","Response<")+">"),/Response<Page[a-zA-Z0-9]+>/.test(e)&&(e=e.replace("Page","Page<")+">"),/Response<List[a-zA-Z0-9]+>/.test(e)&&(e=e.replace("List","Array<")+">"),/Response<Set[a-zA-Z0-9]+>/.test(e)&&(e=e.replace("Set","Array<")+">"),/.*<Integer|Long>.*/.test(e)&&(e=(e=e.replace("<Integer>","<number>")).replace("<Long>","<number>")),/Response<String>/.test(e)&&(e=e.replace("<String>","<string>")),/Response<Boolean>/.test(e)&&(e=e.replace("<Boolean>","<boolean>")),/Response<Map[a-zA-Z0-9]+>/.test(e)){e=e.replace("Map","Map<")+">";let t=d.getInnermostGenerics(e)[0];if(/(Integer|Long|String).*/.test(t)){let r="",n="";t.startsWith("Long")?(r=t.substring(0,4),n=t.substring(4,t.length)):t.startsWith("Integer")?(r=t.substring(0,7),n=t.substring(7,t.length)):t.startsWith("String")&&(r=t.substring(0,6),n=t.substring(6,t.length)),r=r.replace("Long","number"),r=r.replace("Integer","number"),r=r.replace("String","string"),n=n.replace("Long","number"),n=n.replace("Integer","number"),n=n.replace("String","string"),e=e.replace(t,r+","+n)}}return e}static parseModel(e,t,r){let n=new l;const i=/Request.*/,a=/Response.*/,o=/Page.*/,s=/List.*/,p=/Set.*/;if(n.title=t.title||t.description||"",n.name=d.convertNameToType(e),t.oneOf||t.anyOf||t.allOf){let r="";r+=`export type ${e} = `,t.oneOf?r+=t.oneOf.map(e=>d.getSchemaType(e)).join(" | "):t.anyOf?r+=t.anyOf.map(e=>d.getSchemaType(e)).join(" | "):t.allOf&&(r+=t.allOf.map(e=>d.getSchemaType(e)).join(" & ")),r+=";\n"}else"object"===t.type&&t.properties?Object.entries(t.properties).forEach(([e,r])=>{var l,u;const m=null!==(u=null===(l=t.required)||void 0===l?void 0:l.includes(e))&&void 0!==u&&u;let f=d.getSchemaType(r),g=new c;if(g.title=r.title||r.description||"",i.test(f)){f.endsWith("RequestBo")||f.endsWith("RequestDto")||f.endsWith("RequestVo")?(f.startsWith("Request")&&(f=f.replace("Request","Request<")+">"),f.startsWith("Page")&&(f=f.replace("Page","Page<")+">")):f=f.replace("Request","Request<")+">"}a.test(f)&&(f=f.replace("Response","Response<")+">"),o.test(f)&&(f=f.replace("Page","Page<")+">"),s.test(f)&&(f=f.replace("List","Array<")+">"),p.test(f)&&(f=f.replace("Set","Array<")+">"),g.name=e,g.required=m,g.type=f,n.addField(g)}):"array"===t.type&&t.items?d.getSchemaType(t.items):t.enum?t.enum.forEach((e,t)=>{}):d.getSchemaType(t);return n}static filterPath(e){return e.filter(e=>!(e.startsWith("{")&&e.endsWith("}")))}static getCommonRootPath(e){if(!e.length)return"";const t=e.map(e=>e.split("/").filter(Boolean)),r=t[0];let n=0;for(let e=0;e<r.length;e++){if(!t.every(t=>t[e]===r[e]))break;n++}return"/"+r.slice(0,n).join("/")}static getSubPathAfterRoot(e,t){const r=e.endsWith("/")?e.slice(0,-1):e;let n=(t.endsWith("/")?t.slice(0,-1):t).replace(r,"");return n.startsWith("/")&&(n=n.slice(1)),n}static buildPathKeyMap(e,t){const r=new Map;if(!e.length)return r;const n=e.map(e=>e.startsWith(t)?e.slice(t.length):e),i=new Map;return n.forEach((r,n)=>{const a=e[n],o=r.split("/").filter(Boolean)[0]||"";if(!o)return;const s=`${t}/${o}`;i.has(s)||i.set(s,[]),i.get(s).push(a)}),i.forEach((e,t)=>{const n=t.split("/").filter(Boolean).pop()||"",i=m.toPascalCase(n);r.set(t,i)}),r}static getLastPathSegment(e){return e.split("/").filter(Boolean).pop()||""}static getDomainByPath(e,t){if(!e||!t)return"";const r=Array.from(e.keys()).filter(e=>t.startsWith(e));if(0===r.length)return"";const n=r.sort((e,t)=>t.length-e.length)[0];return e.get(n)||""}static parseApi(e,t){const r=new Map;let n=e.paths;const i=new Array;Object.entries(n).forEach(([e])=>{i.push(e)});const l=d.buildPathKeyMap(i,t);return Object.entries(n).forEach(([e,t])=>{Object.entries(t).forEach(([t,n])=>{var i,c,p,u,f;const g=d.getFunctionName(e,t,n);let h=d.getDomainByPath(l,e);if(!h||0==h.length){let t=e.split("/");if(t.length>=2){if(h=t[t.length-2],h.startsWith("{")&&h.endsWith("}")){let e=d.filterPath(t);e.length>=2&&(h=e[e.length-2])}h=m.toPascalCase(h)}}let b=r.get(h);b||(b=new Array);let y=new s;y.domain=h,y.method=y.methodOf(t),y.operationId=g,y.path=e;const v=(n.tags||["default"])[0];n.description,y.remark=n.description||n.summary||"",y.tag=v;let P="";if(n.requestBody&&(null===(i=n.requestBody)||void 0===i?void 0:i.content["application/json"])){const e=n.requestBody.content["application/json"].schema;P=d.getSchemaType(e);let t=new a;t.bodyName="data",t.bodyType=P,t.required=!0,y.reqBody=t}if(n.parameters&&n.parameters.length>0){const e=n.parameters.filter(e=>"path"===e.in),t=n.parameters.filter(e=>"query"===e.in);(e.length>0||t.length>0)&&n.parameters.forEach((e,t)=>{const r=d.getSchemaType(e.schema),n=new o;n.paramName=e.name,n.paramType=r,n.required=!!e.required&&e.required,n.in=e.in,y.addParam(n)})}let O="any";const w=n.responses[200]||n.responses[201]||Object.values(n.responses)[0];(null===(p=null===(c=null==w?void 0:w.content)||void 0===c?void 0:c["application/json"])||void 0===p?void 0:p.schema)?O=d.getSchemaType(w.content["application/json"].schema):(null===(f=null===(u=null==w?void 0:w.content)||void 0===u?void 0:u["*/*"])||void 0===f?void 0:f.schema)&&(O=d.getSchemaType(w.content["*/*"].schema)),O=d.convertNameToType(O),y.responseType=O,b.push(y),r.set(h,b)})}),r}}const f=new r;class g{static getDefaultExcludes(){let e=new Array;return e.push(new RegExp("Response<.*")),e.push(new RegExp("Page.*")),e.push(new RegExp("Request<.*")),e}static modelTemplate(e="class"){let t="";return t+="{% for entity in entities %}",t+="{% if entity.title != ''%}",t+="/**{{entity.title}}*/ \n",t+="{% endif %}",t+="class"==e?"export class {{entity.name}} {\n":"export interface {{entity.name}} {\n",t+="{% for field in entity.entityFields %}",t+="{% if field.title !='' %}",t+="\t/** {{field.title}} */ \n",t+="{% endif %}",t+="{% if field.required == true %}",t+="class"==e?"\t{{field.name}}!:{{field.type}}; \n":"\t{{field.name}}:{{field.type}}; \n",t+="{% else %}",t+="\t{{field.name}}?:{{field.type}}; \n",t+="{% endif %}",t+="{% endfor %}",t+="}\n",t+="{% endfor %}",t}static apiCommonImports(){let e="import 'reflect-metadata';\n";return e+='import {Api, CC, MC, SC, Page,Get,Put,Delete,Post, Request, Response, Security,RA} from "@liuit/api";\n',e+='import {IocContext, Service} from "@liuit/core";\n','import \'reflect-metadata\';\nimport {Api, CC, MC, SC, Page,Get,Put,Delete,Post, Request, Response, Security,RA} from "@liuit/api";\nimport {IocContext, Service} from "@liuit/core";\n'}static dynamicImportOrExportModel(e,t,r){let n="";r||(r=g.getDefaultExcludes());const i=g.filterModels(t,r);if(i){n="import"==e?"import {":"export {";for(let e=0;e<i.length;e++){let t=i[e];e==i.length-1?n+=t.name:n+=t.name+","}n+='} from "./models"'}return n}static dynamicImportOrExportApi(e,t,r){null!=r&&null!=r&&0!=r.trim().length||(r="");let n=e+" {";return t.forEach((e,t)=>{n+=t+r+"Api,"}),n=n.substring(0,n.length-1),n+='} from "./apis"',n}static dynamicImportApis(e,t,r){null!=r&&null!=r&&0!=r.trim().length||(r="");let n="const "+e+r+"Apis = {\n";if(t){let e=0;t.forEach((i,a)=>{let o=a+r+"Api";e==t.size-1?n+="\t"+o+": IocContext.getBean<"+o+">("+o+")\n":n+="\t"+o+": IocContext.getBean<"+o+">("+o+"),\n",e++})}return n+="}\n",n+="export {"+e+r+"Apis}\n",n}static firstWordUp(e){return e=(e=e.toLowerCase()).charAt(0).toUpperCase()+e.slice(1)}static genApi(e,t,r,n,i,a,o){let s="";s+="\n",o&&(s+=g.apiCommonImports()),null!=i&&null!=i&&0!=i.trim().length||(i=""),s+="\n@Service()\n",s+="@Api(CC.of('"+e+"', '"+r+"', '"+t+"', '"+n+"'))\n",s+="export class "+t+i+"Api {\n";for(let e of a){s+="\t@"+g.firstWordUp(e.method)+"(";let t=e.path;s+="MC.of('"+d.getSubPathAfterRoot(r,t)+"','"+e.remark+"')",s+=")\n",s+="\tpublic "+e.operationId+"(";let n="";if(e.reqBody){let t=e.reqBody.bodyType;t=m.removeSymbol(t),n+=m.pascalToCamel(t)+":"+d.convertNameToType(e.reqBody.bodyType)}if(e.reqParams){let t=e.reqParams,r="";for(let e of t)r+=e.paramName,e.required||(r+="?"),r+=":"+e.paramType+",";r=r.substring(0,r.length-1),s+=n?n+","+r:r}else s+=n;s+=")";let i=e.responseType;i&&(s+=":",i&&i.startsWith("Response")&&(i=i.replace("Response","RA")),s+=i),s+=" {return RA.prototype}",s+="\n\n"}return s+="}\n",s}static genApis(e,t,r){let n="";return n+=g.apiCommonImports(),r.forEach((r,i)=>{let a=r.map(e=>e.path);const o=d.getCommonRootPath(a);let s=r[0].tag;n+=g.genApi(e,i,o,s,t,r,!1)}),n}static execute(e,t){return u(this,void 0,void 0,function*(){return yield f.parseAndRender(e,t)})}static executeSync(e,t){return f.parseAndRenderSync(e,t)}static filterModels(e,t){t||(t=g.getDefaultExcludes());let r=new Array;for(let n of e){if(t){let e=!1;for(let r of t)if(r.test(n.name)){e=!0;break}if(e)continue}r.push(n)}return r}static genModels(e,t,r){const n=g.filterModels(e,t);let i=g.modelTemplate(r);return g.execute(i,{entities:n})}static genModelsSync(e,t,r){const n=g.filterModels(e,t);let i=g.modelTemplate(r);return g.executeSync(i,{entities:n})}}class h{static formatDate(e,t,r="zh-CN"){const n=new Date(e);if(isNaN(n.getTime()))throw new Error("无效的日期格式");return new Intl.DateTimeFormat(r,Object.assign(Object.assign({},{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}),t)).format(n)}static formatDateOnly(e){return h.formatDate(e,{year:"numeric",month:"2-digit",day:"2-digit"})}static formatTimeOnly(e){return h.formatDate(e,{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}static formatDateWithTimezone(e){return h.formatDate(e,{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1,timeZoneName:"short"})}}class b{static getHeaderAnno(e,t){let r=" /**\n";return r+=" *@desc "+e+" \n",r+=t?" *@author "+t+" \n":" *@author <a href='mailto:zuiwoxing@qq.com'>刘IT</a> \n",r+=" *@date "+h.formatDate(new Date)+" \n",r+=" */\n",r}}class y{static genCodeContent(e){return u(this,arguments,void 0,function*(e,t="",r="/",n="",i="/"){const a=new p;return yield d.getOpenAPI(e,t).then(e=>{let t=d.parseModels(e),o=g.getDefaultExcludes();const s=g.dynamicImportOrExportModel("import",t,o);let l=g.genModelsSync(t,o,"class");l=b.getHeaderAnno("实体类信息","<a href='mailto:zuiwoxing@qq.com'>刘IT</a>")+l,a.models=l;let c=d.parseApi(e,i),p=g.genApis(r,n,c),u=b.getHeaderAnno("API接口信息","<a href='mailto:zuiwoxing@qq.com'>刘IT</a>"),f=u+s+"\n"+p;a.apis=f;let h="";"/"==r?h="":(h=r.replace("/",""),h=m.toPascalCase(h));let v=y.genIndexContent(h,t,o,c,n);return v=u+v,a.index=v,a})})}static genCodeToFile(e,r="",i="/",a="",o="/",s){s||(s="./auto-code"),i&&(s+=i),t.existsSync(s)||t.mkdirSync(s,{recursive:!0}),d.getOpenAPI(e,r).then(e=>{let r=d.parseModels(e),l=g.getDefaultExcludes();const c=g.dynamicImportOrExportModel("import",r,l);let p=g.genModelsSync(r,l,"class");if("string"==typeof s){p=b.getHeaderAnno("实体类信息","<a href='mailto:zuiwoxing@qq.com'>刘IT</a>")+p,t.writeFileSync(n.join(s,"models.ts"),p)}let u=d.parseApi(e,o),f=g.genApis(i,a,u);if("string"==typeof s){let e=b.getHeaderAnno("API接口信息","<a href='mailto:zuiwoxing@qq.com'>刘IT</a>")+c+"\n"+f;t.writeFileSync(n.join(s,"apis.ts"),e)}if("string"==typeof s){let e="";"/"==i?e="":(e=i.replace("/",""),e=m.toPascalCase(e));let o=y.genIndexContent(e,r,l,u,a);o=b.getHeaderAnno("API集合索引","<a href='mailto:zuiwoxing@qq.com'>刘IT</a>")+o,t.writeFileSync(n.join(s,"index.ts"),o)}})}static genIndexContent(e,t,r,n,i){let a="";a+='\nimport {IocContext} from "@liuit/core";\n';a+=g.dynamicImportOrExportModel("export",t,r)+"\n";return a+=g.dynamicImportOrExportApi("import",n,i)+"\n",a+=g.dynamicImportApis(e,n,i),a}}export{g as ApiTemplateUtil,y as CodeGenUtil,p as CodeInfo,l as Entity,c as EntityField,i as HttpMethod,a as ReqBody,o as ReqParam,s as SwApi,d as SwaggerUtil};
|
|
2
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/model/index.ts","../src/util/NameUtil.ts","../src/util/SwaggerUtil.ts","../src/util/ApiTemplateUtil.ts","../src/util/DateUtil.ts","../src/util/HeaderUtil.ts","../src/util/CodeGenUtil.ts"],"sourcesContent":["/**\r\n *@desc\r\n *@author liudejian\r\n *@date 2025-10-09 18:28\r\n **/\r\nexport interface OpenAPI {\r\n openapi: string;\r\n info: {\r\n title: string;\r\n version: string;\r\n };\r\n paths: Record<string, Record<string, Operation>>;\r\n components?: {\r\n schemas?: Record<string, Schema>;\r\n parameters?: Record<string, Parameter>;\r\n };\r\n}\r\n\r\nexport interface Operation {\r\n operationId?: string;\r\n summary?: string;\r\n description?: string;\r\n parameters?: Parameter[];\r\n requestBody?: {\r\n content: Record<string, { schema: Schema }>;\r\n };\r\n responses: Record<string, {\r\n description: string;\r\n content?: Record<string, { schema: Schema }>;\r\n }>;\r\n tags?: string[];\r\n}\r\n\r\nexport interface Parameter {\r\n name: string;\r\n in: 'query' | 'path' | 'header' | 'cookie';\r\n required?: boolean;\r\n schema: Schema;\r\n description?: string;\r\n}\r\n\r\nexport interface Schema {\r\n type?: string;\r\n format?: string;\r\n $ref?: string;\r\n items?: Schema;\r\n properties?: Record<string, Schema>;\r\n required?: string[];\r\n enum?: any[];\r\n oneOf?: Schema[];\r\n anyOf?: Schema[];\r\n allOf?: Schema[];\r\n description?: string;\r\n title?: string;\r\n}\r\n\r\nexport enum HttpMethod {\r\n GET = \"GET\", PUT = \"PUT\", POST = \"POST\", DELETE = \"DELETE\", HEADER = \"HEADER\", OPTIONS = \"OPTIONS\", PATCH = \"PATCH\"\r\n}\r\n\r\nexport class ReqBody {\r\n /**\r\n * body关联对象\r\n */\r\n bodyName: string;\r\n /**\r\n * body类型(array|ref|basic)\r\n */\r\n bodyType: string;\r\n /**\r\n * 是否必填\r\n */\r\n required: boolean;\r\n}\r\n\r\nexport class ReqParam {\r\n /**\r\n * 参数名称\r\n */\r\n paramName: string;\r\n\r\n /**\r\n * 是否应用对象\r\n */\r\n ref: boolean = false;\r\n\r\n /**\r\n * 参数类型\r\n */\r\n paramType: string;\r\n /**\r\n * 格式化\r\n */\r\n format: string;\r\n /**\r\n * 是否必填\r\n */\r\n required: boolean;\r\n /**\r\n * 作用于 'query' | 'path' | 'header' | 'cookie'\r\n */\r\n in: \"query\" | \"path\" | \"header\" | \"cookie\" = \"query\";\r\n\r\n}\r\n\r\n\r\nexport class SwApi {\r\n /**\r\n * 业务域\r\n */\r\n domain: string;\r\n /**\r\n * 路径\r\n */\r\n path: string;\r\n /**\r\n * 请求方法\r\n */\r\n method: HttpMethod;\r\n /**\r\n * API描述\r\n */\r\n remark: string;\r\n\r\n tag: string;\r\n\r\n /**\r\n * 操作ID\r\n */\r\n operationId: string;\r\n\r\n /**\r\n * 请求对象\r\n */\r\n reqBody: ReqBody;\r\n /**\r\n * 请求参数\r\n */\r\n reqParams: Array<ReqParam>;\r\n\r\n /**\r\n * 响应对象类型\r\n */\r\n responseType: string;\r\n\r\n public methodOf(method: string): HttpMethod {\r\n method = method.toUpperCase().trim();\r\n if (method === HttpMethod.GET.toString()) {\r\n return HttpMethod.GET\r\n } else if (method === HttpMethod.POST.toString()) {\r\n return HttpMethod.POST\r\n } else if (method === HttpMethod.PUT.toString()) {\r\n return HttpMethod.PUT\r\n } else if (method === HttpMethod.DELETE.toString()) {\r\n return HttpMethod.DELETE\r\n } else if (method === HttpMethod.HEADER.toString()) {\r\n return HttpMethod.HEADER\r\n } else if (method === HttpMethod.PATCH.toString()) {\r\n return HttpMethod.PATCH\r\n } else if (method === HttpMethod.OPTIONS.toString()) {\r\n return HttpMethod.OPTIONS\r\n } else {\r\n throw new Error(\"not support \" + method)\r\n }\r\n }\r\n\r\n /**\r\n * 添加参数\r\n * @param reqParam\r\n * @return\r\n */\r\n public addParam(reqParam: ReqParam): SwApi {\r\n if (!this.reqParams) {\r\n this.reqParams = new Array<ReqParam>();\r\n }\r\n this.reqParams.push(reqParam);\r\n return this;\r\n }\r\n}\r\n\r\nexport class Entity {\r\n name: string;\r\n title: string;\r\n /**\r\n * object/basic\r\n */\r\n type: string;\r\n entityFields: Array<EntityField>;\r\n\r\n public static of(name: string, title: string, type: string): Entity {\r\n const entity = new Entity();\r\n entity.name = name;\r\n entity.title = title;\r\n entity.type = type;\r\n return entity;\r\n }\r\n\r\n public addField(ef: EntityField): Entity {\r\n if (this.entityFields == null) {\r\n this.entityFields = new Array<EntityField>();\r\n }\r\n this.entityFields.push(ef);\r\n return this;\r\n }\r\n}\r\n\r\nexport class EntityField {\r\n name: string;\r\n title: string;\r\n type: string;\r\n format: string;\r\n required: boolean;\r\n maxLength?: number;\r\n minLength?: number\r\n ref?: string;\r\n\r\n public static of(name: string, title: string, type: string, format: string, required: boolean, minLen?: number, maxLen?: number, ref?: string): EntityField {\r\n const ef = new EntityField();\r\n ef.name = name;\r\n ef.title = title;\r\n ef.type = type;\r\n ef.format = format;\r\n ef.required = required;\r\n ef.minLength = minLen;\r\n ef.maxLength = maxLen;\r\n ef.ref = ref;\r\n return ef;\r\n }\r\n}\r\n\r\n/**\r\n * 代码信息\r\n */\r\nexport class CodeInfo {\r\n models:string;\r\n apis:string;\r\n index:string;\r\n}\r\n","/**\r\n *@desc\r\n *@author liudejian\r\n *@date 2025-10-22 14:02\r\n **/\r\nexport default class NameUtil {\r\n// 工具:按多分隔符切分并清理空项\r\n private static splitWords(str: string): string[] {\r\n return str\r\n .trim()\r\n .replace(/[_\\s-]+/g, '_') // 统一分隔符\r\n .split('_')\r\n .filter(Boolean);\r\n }\r\n\r\n /**\r\n * 转帕斯卡:每个单词首字母大写,然后拼接\r\n * @param str\r\n */\r\n public static toPascalCase(str: string): string {\r\n const words = NameUtil.splitWords(str);\r\n if (words.length === 0) return '';\r\n return words.map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join('');\r\n }\r\n\r\n /**\r\n * 转驼峰:首词小写,后续单词首字母大写,然后拼接\r\n * @param str\r\n */\r\n public static toCamelCase(str: string): string {\r\n const words = NameUtil.splitWords(str);\r\n if (words.length === 0) return '';\r\n const head = words[0].toLowerCase();\r\n const tail = words.slice(1).map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join('');\r\n return head + tail;\r\n }\r\n\r\n public static pascalToCamel(str: string): string {\r\n if (!str) return str;\r\n // 第一个字符转小写 + 剩余字符原样拼接\r\n return str.charAt(0).toLowerCase() + str.slice(1);\r\n }\r\n\r\n\r\n /**\r\n * 移除符号以及尖括号<>\r\n * @param str\r\n */\r\n public static removeSymbol(str:string):string {\r\n // @ts-ignore\r\n if (!str) return str;\r\n let result = str;\r\n // 匹配最内层尖括号的正则:< 后面跟 非<>的任意字符 >(无嵌套)\r\n const reg = /<[^<>]*>/g;\r\n // 循环替换,直到没有匹配项(所有嵌套都被逐层拆解)\r\n while (reg.test(result)) {\r\n result = result.replace(reg, '');\r\n }\r\n return result.trim();\r\n }\r\n}\r\n","import axios from 'axios';\r\nimport NameUtil from \"./NameUtil\";\r\n\r\nimport {Entity, EntityField, OpenAPI, Operation, ReqBody, ReqParam, Schema, SwApi} from '../model'\r\n\r\n/**\r\n *@desc\r\n *@author liudejian\r\n *@date 2025-09-09 14:55\r\n **/\r\n\r\nexport class SwaggerUtil {\r\n\r\n\r\n /**\r\n * 获取schema类型\r\n * @param schema\r\n * @param openapi\r\n */\r\n public static getSchemaType(schema: Schema): string {\r\n // console.log(\"schema.type=========\",schema.type+\"===\"+schema.$ref)\r\n if (schema.$ref) {\r\n // 处理引用类型\r\n const refParts = schema.$ref.split('/');\r\n let schemaName = refParts[refParts.length - 1];\r\n return schemaName;\r\n } else if (schema.type === 'string') {\r\n if (schema.format === 'date-time') return 'string /* date-time */';\r\n if (schema.enum) return schema.enum.map(v => `'${v}'`).join(' | ');\r\n return 'string';\r\n } else if (schema.type === 'number' || schema.type === 'integer') {\r\n if (schema.enum) return schema.enum.map(v => v.toString()).join(' | ');\r\n return 'number';\r\n } else if (schema.type === 'boolean') {\r\n return 'boolean';\r\n } else if (schema.type === 'array' && schema.items) {\r\n return `Array<${SwaggerUtil.getSchemaType(schema.items)}>`;\r\n } else if (schema.type === 'object' && schema.properties) {\r\n // 处理内联对象\r\n let props = '';\r\n Object.entries(schema.properties).forEach(([propName, propSchema], index, array) => {\r\n const isRequired = schema.required?.includes(propName) ?? false;\r\n const propType = SwaggerUtil.getSchemaType(propSchema);\r\n props += `${propName}${isRequired ? '' : '?'}: ${propType}`;\r\n if (index < array.length - 1) props += '; ';\r\n });\r\n return `{ ${props} }`;\r\n } else if (schema.oneOf) {\r\n return schema.oneOf.map(s => SwaggerUtil.getSchemaType(s)).join(' | ');\r\n } else if (schema.anyOf) {\r\n return schema.anyOf.map(s => SwaggerUtil.getSchemaType(s)).join(' | ');\r\n } else if (schema.allOf) {\r\n return schema.allOf.map(s => SwaggerUtil.getSchemaType(s)).join(' & ');\r\n }\r\n\r\n return 'any';\r\n }\r\n\r\n /**\r\n * 获取方法名\r\n * @param path\r\n * @param method\r\n * @param operation\r\n */\r\n private static getFunctionName(path: string, method: string, operation: Operation): string {\r\n // 尝试从operationId获取函数名\r\n if (operation.operationId) {\r\n let numReg = /.*_[0-9]+$/\r\n let operationId = operation.operationId;\r\n if (numReg.test(operationId)) {\r\n operationId = operationId.replace(/_\\d+$/, \"\");\r\n }\r\n return operationId;\r\n }\r\n\r\n // 否则根据路径和方法生成\r\n let name = method.toLowerCase();\r\n\r\n // 处理路径参数,如 /users/{id} 变成 usersId\r\n const pathParts = path.split('/').filter(part => part);\r\n pathParts.forEach(part => {\r\n if (part.startsWith('{') && part.endsWith('}')) {\r\n name += part.slice(1, -1).charAt(0).toUpperCase() + part.slice(2, -1);\r\n } else {\r\n name += part.charAt(0).toUpperCase() + part.slice(1);\r\n }\r\n });\r\n\r\n return name;\r\n }\r\n\r\n /**\r\n * 获取OPEN API\r\n * @param swaggerUrl\r\n * @param authToken\r\n */\r\n public static async getOpenAPI(swaggerUrl: string, authToken?: string) {\r\n let response = null;\r\n if (authToken) {\r\n response = await axios.get<OpenAPI>(swaggerUrl, {\r\n headers: {\r\n Authorization: \"Bearer \" + authToken\r\n }\r\n } as any);\r\n } else {\r\n response = await axios.get<OpenAPI>(swaggerUrl);\r\n }\r\n const openapi = response.data as OpenAPI;\r\n return openapi;\r\n }\r\n\r\n /**\r\n * 返回Map\r\n * @param openapi\r\n */\r\n public static parseModelToMap(openapi: OpenAPI): Map<string, Entity> {\r\n const entityMap = new Map<string, Entity>();\r\n if (openapi.components?.schemas) {\r\n Object.entries(openapi.components.schemas).forEach(([schemaName, schema]) => {\r\n let entity = SwaggerUtil.parseModel(schemaName, schema, openapi);\r\n entityMap.set(entity.name, entity);\r\n });\r\n }\r\n return entityMap;\r\n }\r\n\r\n /**\r\n * 提取嵌套尖括号中最内部的字符(最内层类型)\r\n * @param typeStr 嵌套尖括号字符串(如 \"Response<Data<Long>>\")\r\n * @returns 最内层字符数组(可能多个同级最内层)\r\n */\r\n public static getInnermostGenerics(typeStr: string): string[] {\r\n const innermost: string[] = [];\r\n const str = typeStr.trim();\r\n const firstAngleIndex = str.indexOf('<');\r\n\r\n // 无尖括号,自身就是最内层\r\n if (firstAngleIndex === -1) {\r\n return [str];\r\n }\r\n\r\n // 提取尖括号内的内容(处理嵌套)\r\n const innerStr = str.substring(firstAngleIndex + 1, str.length - 1).trim();\r\n let start = 0;\r\n let angleCount = 0; // 跟踪嵌套层级\r\n\r\n // 分割尖括号内的子类型(处理逗号分隔和嵌套)\r\n for (let i = 0; i < innerStr.length; i++) {\r\n const char = innerStr[i];\r\n if (char === '<') angleCount++;\r\n else if (char === '>') angleCount--;\r\n // 仅在非嵌套状态下(angleCount=0)用逗号分割子类型\r\n else if (char === ',' && angleCount === 0) {\r\n const child = innerStr.substring(start, i).trim();\r\n if (child) {\r\n // 递归解析子类型,收集其最内层结果\r\n innermost.push(...SwaggerUtil.getInnermostGenerics(child));\r\n }\r\n start = i + 1;\r\n }\r\n }\r\n\r\n // 处理最后一个子类型\r\n const lastChild = innerStr.substring(start).trim();\r\n if (lastChild) {\r\n innermost.push(...SwaggerUtil.getInnermostGenerics(lastChild));\r\n }\r\n\r\n return innermost;\r\n }\r\n\r\n\r\n /**\r\n * 解析嵌套尖括号类型字符串,返回结构化的类型信息\r\n * @param typeStr 嵌套尖括号类型字符串(如 \"Response<Data<Long>>\")\r\n * @returns 结构化的类型信息,包含类型名称和子类型\r\n */\r\n public static parseNestedGenerics(typeStr: string): {\r\n name: string;\r\n children?: ReturnType<typeof SwaggerUtil.parseNestedGenerics>[]\r\n } {\r\n // 去除字符串前后的空格\r\n const str = typeStr.trim();\r\n // 查找第一个 '<' 的位置,确定是否有嵌套\r\n const firstAngleIndex = str.indexOf('<');\r\n\r\n // 如果没有 '<',说明是最内层类型(无嵌套)\r\n if (firstAngleIndex === -1) {\r\n return {name: str};\r\n }\r\n\r\n // 提取当前层的类型名称(第一个 '<' 之前的部分)\r\n const typeName = str.substring(0, firstAngleIndex).trim();\r\n\r\n // 处理尖括号内的内容(需要匹配成对的 '>',处理嵌套)\r\n const innerStr = str.substring(firstAngleIndex + 1, str.length - 1).trim(); // 去掉外层的 '<' 和最后的 '>'\r\n const children: ReturnType<typeof SwaggerUtil.parseNestedGenerics>[] = [];\r\n let start = 0;\r\n let angleCount = 0; // 用于计数嵌套的尖括号(处理多层嵌套)\r\n\r\n // 遍历内部字符串,分割出多个子类型(用 ',' 分隔,同时处理嵌套)\r\n for (let i = 0; i < innerStr.length; i++) {\r\n const char = innerStr[i];\r\n if (char === '<') {\r\n angleCount++; // 遇到 '<',嵌套层级+1\r\n } else if (char === '>') {\r\n angleCount--; // 遇到 '>',嵌套层级-1\r\n } else if (char === ',' && angleCount === 0) {\r\n // 只有当嵌套层级为 0 时,才用 ',' 分割子类型\r\n const childStr = innerStr.substring(start, i).trim();\r\n if (childStr) {\r\n children.push(SwaggerUtil.parseNestedGenerics(childStr)); // 递归解析子类型\r\n }\r\n start = i + 1;\r\n }\r\n }\r\n\r\n // 处理最后一个子类型\r\n const lastChildStr = innerStr.substring(start).trim();\r\n if (lastChildStr) {\r\n children.push(SwaggerUtil.parseNestedGenerics(lastChildStr));\r\n }\r\n\r\n return {name: typeName, children};\r\n }\r\n\r\n /**\r\n * 解析模型\r\n * @param openapi\r\n */\r\n public static parseModels(openapi: OpenAPI): Array<Entity> {\r\n const entityAry = new Array<Entity>();\r\n if (openapi.components?.schemas) {\r\n Object.entries(openapi.components.schemas).forEach(([schemaName, schema]) => {\r\n let entity = SwaggerUtil.parseModel(schemaName, schema, openapi);\r\n // console.log(\"entity=======\",entity.name)\r\n entityAry.push(entity);\r\n });\r\n }\r\n return entityAry;\r\n }\r\n\r\n /**\r\n * 转换名称类型\r\n * @param name\r\n */\r\n public static convertNameToType(name: string): string {\r\n const requestReg = /Request[a-zA-Z0-9]+/\r\n\r\n const responseReg = /Response[a-zA-Z0-9]+/\r\n const pageReg = /Response<Page[a-zA-Z0-9]+>/\r\n const listReg = /Response<List[a-zA-Z0-9]+>/\r\n const setReg = /Response<Set[a-zA-Z0-9]+>/\r\n const numberReg = /.*<Integer|Long>.*/\r\n const mapReg = /Response<Map[a-zA-Z0-9]+>/\r\n const responseStringReg = /Response<String>/\r\n const responseBooleanReg = /Response<Boolean>/\r\n // MapLongString\r\n\r\n if (requestReg.test(name)) {\r\n let reqEndWith = name.endsWith(\"RequestBo\") || name.endsWith(\"RequestDto\") || name.endsWith(\"RequestVo\");\r\n if (reqEndWith) {\r\n if (name.startsWith(\"Request\")) {\r\n name = name.replace(\"Request\", \"Request<\") + \">\";\r\n } if (name.startsWith(\"Page\")) {\r\n name = name.replace(\"Page\", \"Page<\") + \">\";\r\n }else {\r\n name = name;\r\n }\r\n } else {\r\n name = name.replace(\"Request\", \"Request<\") + \">\";\r\n }\r\n }\r\n if (responseReg.test(name)) {\r\n name = name.replace(\"Response\", \"Response<\") + \">\";\r\n }\r\n if (pageReg.test(name)) {\r\n // console.log(\"name====s====\",name)\r\n /* let reqEndWith = name.endsWith(\"RequestBo\") || name.endsWith(\"RequestDto\") || name.endsWith(\"RequestVo\");\r\n if (reqEndWith) {\r\n if (name.startsWith(\"Request\")) {\r\n name = name.replace(\"Request\", \"Request<\") + \">\";\r\n } if (name.startsWith(\"Page\")) {\r\n name = name.replace(\"Page\", \"Page<\") + \">\";\r\n }else {\r\n name = name;\r\n }\r\n } else {\r\n name = name.replace(\"Page\", \"Page<\") + \">\";\r\n }*/\r\n name = name.replace(\"Page\", \"Page<\") + \">\";\r\n // console.log(\"name====e====\",name)\r\n }\r\n if (listReg.test(name)) {\r\n name = name.replace(\"List\", \"Array<\") + \">\";\r\n }\r\n if (setReg.test(name)) {\r\n name = name.replace(\"Set\", \"Array<\") + \">\";\r\n }\r\n if (numberReg.test(name)) {\r\n name = name.replace(\"<Integer>\", \"<number>\");\r\n name = name.replace(\"<Long>\", \"<number>\");\r\n }\r\n if (responseStringReg.test(name)) {\r\n name = name.replace(\"<String>\", \"<string>\");\r\n }\r\n if (responseBooleanReg.test(name)) {\r\n name = name.replace(\"<Boolean>\", \"<boolean>\");\r\n }\r\n\r\n if (mapReg.test(name)) {\r\n name = name.replace(\"Map\", \"Map<\") + \">\";\r\n let innerData = SwaggerUtil.getInnermostGenerics(name);\r\n let data = innerData[0];\r\n const innerReg = /(Integer|Long|String).*/\r\n if (innerReg.test(data)) {\r\n let key = \"\";\r\n let value = \"\";\r\n if (data.startsWith(\"Long\")) {\r\n key = data.substring(0, 4);\r\n value = data.substring(4, data.length);\r\n } else if (data.startsWith(\"Integer\")) {\r\n key = data.substring(0, 7);\r\n value = data.substring(7, data.length);\r\n } else if (data.startsWith(\"String\")) {\r\n key = data.substring(0, 6);\r\n value = data.substring(6, data.length);\r\n }\r\n key = key.replace(\"Long\", \"number\");\r\n key = key.replace(\"Integer\", \"number\");\r\n key = key.replace(\"String\", \"string\");\r\n value = value.replace(\"Long\", \"number\");\r\n value = value.replace(\"Integer\", \"number\");\r\n value = value.replace(\"String\", \"string\");\r\n name = name.replace(data, key + \",\" + value);\r\n }\r\n }\r\n\r\n return name;\r\n }\r\n\r\n\r\n /**\r\n * 解析模型\r\n * @param schemaName\r\n * @param schema\r\n * @param openapi\r\n */\r\n private static parseModel(schemaName: string, schema: Schema, openapi: OpenAPI): Entity {\r\n let entity = new Entity();\r\n\r\n const requestReg = /Request.*/\r\n const responseReg = /Response.*/\r\n const pageReg = /Page.*/\r\n const listReg = /List.*/\r\n const setReg = /Set.*/\r\n\r\n entity.title = schema.title || schema.description || \"\";\r\n\r\n entity.name = SwaggerUtil.convertNameToType(schemaName);\r\n // console.log(\"entity.name=======\",entity.name)\r\n\r\n if (schema.oneOf || schema.anyOf || schema.allOf) {\r\n // 处理组合类型\r\n let types = \"\";\r\n types += `export type ${schemaName} = `;\r\n\r\n if (schema.oneOf) {\r\n types += schema.oneOf.map(s => SwaggerUtil.getSchemaType(s)).join(' | ');\r\n } else if (schema.anyOf) {\r\n types += schema.anyOf.map(s => SwaggerUtil.getSchemaType(s)).join(' | ');\r\n } else if (schema.allOf) {\r\n types += schema.allOf.map(s => SwaggerUtil.getSchemaType(s)).join(' & ');\r\n }\r\n\r\n types += ';\\n';\r\n } else if (schema.type === 'object' && schema.properties) {\r\n Object.entries(schema.properties).forEach(([propName, propSchema]) => {\r\n const isRequired = schema.required?.includes(propName) ?? false;\r\n let propType = SwaggerUtil.getSchemaType(propSchema);\r\n let entityField = new EntityField();\r\n // 添加属性注释\r\n entityField.title = propSchema.title || propSchema.description || \"\";\r\n if (requestReg.test(propType)) {\r\n let reqEndWith = propType.endsWith(\"RequestBo\") || propType.endsWith(\"RequestDto\") || propType.endsWith(\"RequestVo\");\r\n if (reqEndWith) {\r\n if (propType.startsWith(\"Request\")) {\r\n propType = propType.replace(\"Request\", \"Request<\") + \">\";\r\n } if (propType.startsWith(\"Page\")) {\r\n propType = propType.replace(\"Page\", \"Page<\") + \">\";\r\n } else {\r\n propType = propType;\r\n }\r\n } else {\r\n propType = propType.replace(\"Request\", \"Request<\") + \">\";\r\n }\r\n }\r\n if (responseReg.test(propType)) {\r\n propType = propType.replace(\"Response\", \"Response<\") + \">\";\r\n }\r\n\r\n if (pageReg.test(propType)) {\r\n propType = propType.replace(\"Page\", \"Page<\") + \">\";\r\n }\r\n if (listReg.test(propType)) {\r\n propType = propType.replace(\"List\", \"Array<\") + \">\";\r\n }\r\n if (setReg.test(propType)) {\r\n propType = propType.replace(\"Set\", \"Array<\") + \">\";\r\n }\r\n\r\n entityField.name = propName;\r\n entityField.required = isRequired;\r\n entityField.type = propType;\r\n entity.addField(entityField);\r\n });\r\n\r\n } else if (schema.type === 'array' && schema.items) {\r\n // 处理数组类型\r\n const itemType = SwaggerUtil.getSchemaType(schema.items);\r\n // code += `export type ${schemaName} = ${itemType}[];\\n`;\r\n } else if (schema.enum) {\r\n // 处理枚举类型\r\n // code += `export enum ${schemaName} {\\n`;\r\n schema.enum.forEach((enumValue, index) => {\r\n const key = typeof enumValue === 'string' ? enumValue : `VALUE_${index}`;\r\n // code += ` ${key} = ${JSON.stringify(enumValue)},\\n`;\r\n });\r\n // code += '}\\n';\r\n } else {\r\n // 处理基本类型\r\n const type = SwaggerUtil.getSchemaType(schema);\r\n // code += `export type ${schemaName} = ${type};\\n`;\r\n }\r\n return entity;\r\n }\r\n\r\n /**\r\n * 过滤掉{xxx} 的路径\r\n * @param pathAry\r\n * @private\r\n */\r\n private static filterPath(pathAry:Array<string>) {\r\n return pathAry.filter(path=> !(path.startsWith(\"{\") && path.endsWith(\"}\")));\r\n }\r\n\r\n /**\r\n * 从多个 URL 路径中,提取公共根路径\r\n * @param paths 路径数组\r\n * @returns 相同的最长根路径\r\n */\r\n public static getCommonRootPath(paths: Array<string>): string {\r\n if (!paths.length) return '';\r\n const segments = paths.map(p => p.split('/').filter(Boolean));\r\n const first = segments[0];\r\n let commonLen = 0;\r\n for (let i = 0; i < first.length; i++) {\r\n const allSame = segments.every(s => s[i] === first[i]);\r\n if (allSame) commonLen++;\r\n else break;\r\n }\r\n return '/' + first.slice(0, commonLen).join('/');\r\n }\r\n\r\n /**\r\n * 2. 获取【根路径之后的子路径】(去掉前面公共部分)\r\n * @param rootPath 公共根路径\r\n * @param fullPath 原始完整路径\r\n * @returns 根路径后面的路径(不带前导斜杠)\r\n */\r\n public static getSubPathAfterRoot(rootPath: string, fullPath: string): string {\r\n // 统一处理结尾斜杠\r\n const root = rootPath.endsWith('/') ? rootPath.slice(0, -1) : rootPath;\r\n const full = fullPath.endsWith('/') ? fullPath.slice(0, -1) : fullPath;\r\n // 替换掉根路径部分\r\n let sub = full.replace(root, '');\r\n // 去掉开头多余的 /\r\n if (sub.startsWith('/')) sub = sub.slice(1);\r\n return sub;\r\n }\r\n /**\r\n * 生成路径映射 Map\r\n * key: 公共根路径\r\n * value: 公共根路径最后一段转帕斯卡命名=作用域\r\n */\r\n /**\r\n * 优化版:根据路径分组生成映射Map\r\n * @param paths 路径数组\r\n * @param excludePrefix 需要排除的固定前缀(如 /api/gc)\r\n * @returns Map<完整公共路径, 帕斯卡命名>\r\n */\r\n private static buildPathKeyMap(paths: Array<string>, excludePrefix: string): Map<string, string> {\r\n const resultMap = new Map<string, string>();\r\n if (!paths.length) return resultMap;\r\n\r\n // 1. 剔除固定前缀,拿到剩余路径用于分组\r\n const processedPaths = paths.map(path =>\r\n path.startsWith(excludePrefix)\r\n ? path.slice(excludePrefix.length) // 去掉 /api/gc\r\n : path\r\n );\r\n\r\n // 2. 对【剔除后】的路径,按第一层目录分组(核心分组逻辑)\r\n const groupMap = new Map<string, Array<string>>();\r\n\r\n processedPaths.forEach((fullPath, index) => {\r\n const originalPath = paths[index];\r\n // 按 / 分割,取第一个有效片段(如 verify-code、upload、tenant、app-publish-info)\r\n const firstSegment = fullPath.split('/').filter(Boolean)[0] || '';\r\n if (!firstSegment) return;\r\n\r\n // 完整公共前缀 = excludePrefix + / + firstSegment\r\n const fullGroupPrefix = `${excludePrefix}/${firstSegment}`;\r\n\r\n if (!groupMap.has(fullGroupPrefix)) {\r\n groupMap.set(fullGroupPrefix, []);\r\n }\r\n groupMap.get(fullGroupPrefix)!.push(originalPath);\r\n });\r\n\r\n // 3. 每组生成 帕斯卡命名 并放入结果\r\n groupMap.forEach((_, groupPrefix) => {\r\n // 取最后一段(即模块名:verify-code、app-publish-info)\r\n const lastSegment = groupPrefix.split('/').filter(Boolean).pop() || '';\r\n const pascalName = NameUtil.toPascalCase(lastSegment);\r\n resultMap.set(groupPrefix, pascalName);\r\n });\r\n\r\n return resultMap;\r\n }\r\n\r\n\r\n /**\r\n * 获取路径最后一段\r\n */\r\n private static getLastPathSegment(path: string): string {\r\n return path.split('/').filter(Boolean).pop() || '';\r\n }\r\n\r\n /**\r\n * 根据完整路径,从公共路径映射Map中找到对应的作用域\r\n * 匹配规则:path.startsWith(key),并自动选择【最长匹配】的前缀(最精准)\r\n * @param pathMap Map<公共路径前缀, 作用域>\r\n * @param fullPath 完整接口路径\r\n * @returns 匹配到的作用域 | undefined\r\n */\r\n public static getDomainByPath(pathMap: Map<string, string>, fullPath: string): string {\r\n if (!pathMap || !fullPath) return \"\";\r\n // 1. 找出所有以 fullPath 开头的 key\r\n const matchedKeys = Array.from(pathMap.keys()).filter(key =>\r\n fullPath.startsWith(key)\r\n );\r\n if (matchedKeys.length === 0) return \"\";\r\n // 2. 【关键】按长度排序,取最长的key(最精准匹配,避免短路径误匹配)\r\n const bestMatchKey = matchedKeys.sort((a, b) => b.length - a.length)[0];\r\n // 3. 返回对应的帕斯卡命名\r\n return pathMap.get(bestMatchKey) || \"\";\r\n }\r\n\r\n /**\r\n * 解析API\r\n * @param openapi\r\n * @param excludePrefix 需要排除的固定前缀(如 /api/gc)\r\n * @return key=domain\r\n * value=swaggerApi\r\n */\r\n public static parseApi(openapi: OpenAPI,excludePrefix:string): Map<string, Array<SwApi>> {\r\n const map = new Map<string, Array<SwApi>>();\r\n\r\n // 按标签分组API\r\n const tagGroups: Record<string, Array<{\r\n name: string;\r\n code: string;\r\n }>> = {};\r\n\r\n let openapiPaths = openapi.paths;\r\n const pathAry = new Array<String>();\r\n Object.entries(openapiPaths).forEach(([path])=>{\r\n pathAry.push(path)\r\n });\r\n /**\r\n * key=公共路径\r\n * value=Domain\r\n * */\r\n // @ts-ignore\r\n const pathDomainMap = SwaggerUtil.buildPathKeyMap(pathAry,excludePrefix);\r\n\r\n Object.entries(openapiPaths).forEach(([path, methods]) => {\r\n // console.log(path,\"===methods===========\",methods)\r\n Object.entries(methods).forEach(([method, operation]) => {\r\n const functionName = SwaggerUtil.getFunctionName(path, method, operation);\r\n let domain = SwaggerUtil.getDomainByPath(pathDomainMap,path);\r\n if (!domain || domain.length == 0) {\r\n let pathAry = path.split(\"/\");\r\n if (pathAry.length >= 2) {\r\n domain = pathAry[pathAry.length - 2];\r\n // 如果为路径,则需要重新处理\r\n if (domain.startsWith(\"{\") && domain.endsWith(\"}\")) {\r\n let resultPath = SwaggerUtil.filterPath(pathAry);\r\n if (resultPath.length >= 2) {\r\n domain = resultPath[resultPath.length - 2];\r\n }\r\n }\r\n domain = NameUtil.toPascalCase(domain)\r\n }\r\n }\r\n let swApis = map.get(domain);\r\n if (!swApis) {\r\n swApis = new Array<SwApi>();\r\n }\r\n let sa = new SwApi();\r\n sa.domain = domain;\r\n sa.method = sa.methodOf(method);\r\n sa.operationId = functionName;\r\n sa.path = path;\r\n\r\n\r\n const tags = operation.tags || ['default'];\r\n const tag = tags[0];\r\n const description = operation.description;\r\n sa.remark = operation.description || operation.summary || \"\";\r\n sa.tag = tag;\r\n // 请求体\r\n let requestBodyType = '';\r\n if (operation.requestBody && operation.requestBody?.content['application/json']) {\r\n const schema = operation.requestBody.content['application/json'].schema;\r\n requestBodyType = SwaggerUtil.getSchemaType(schema);\r\n let reqBody = new ReqBody();\r\n reqBody.bodyName = \"data\";\r\n reqBody.bodyType = requestBodyType;\r\n reqBody.required = true;\r\n sa.reqBody = reqBody;\r\n }\r\n // 处理路径参数,如 {id} 变成 ${params.id}\r\n // const processedPath = path.replace(/{([^}]+)}/g, '${params.$1}');\r\n // 路径参数和查询参数\r\n if (operation.parameters && operation.parameters.length > 0) {\r\n const pathParams = operation.parameters.filter(p => p.in === 'path');\r\n const queryParams = operation.parameters.filter(p => p.in === 'query');\r\n if (pathParams.length > 0 || queryParams.length > 0) {\r\n operation.parameters.forEach((param, index) => {\r\n const paramType = SwaggerUtil.getSchemaType(param.schema);\r\n const reqParam = new ReqParam();\r\n reqParam.paramName = param.name;\r\n reqParam.paramType = paramType;\r\n reqParam.required = param.required ? param.required : false;\r\n //'query' | 'path' | 'header' | 'cookie';\r\n reqParam.in = param.in;\r\n sa.addParam(reqParam);\r\n });\r\n }\r\n }\r\n\r\n // 响应类型\r\n let responseType = 'any';\r\n const successResponse = operation.responses['200'] ||\r\n operation.responses['201'] || Object.values(operation.responses)[0];\r\n\r\n if (successResponse?.content?.['application/json']?.schema) {\r\n responseType = SwaggerUtil.getSchemaType(successResponse.content['application/json'].schema);\r\n } else if (successResponse?.content?.['*/*']?.schema) {\r\n responseType = SwaggerUtil.getSchemaType(successResponse.content['*/*'].schema);\r\n }\r\n\r\n responseType = SwaggerUtil.convertNameToType(responseType);\r\n\r\n sa.responseType = responseType;\r\n swApis.push(sa);\r\n map.set(domain, swApis);\r\n // console.log(path + \"=====\" + functionName + \"====\" + operation.operationId + \"====method===\" + method+\"==domain==\"+domain)\r\n });\r\n\r\n });\r\n return map;\r\n }\r\n}\r\n\r\n","import {Liquid} from 'liquidjs';\r\nimport {Entity, OpenAPI, SwApi} from \"../model\";\r\nimport {SwaggerUtil} from \"./SwaggerUtil\";\r\nimport NameUtil from \"./NameUtil\";\r\n\r\nconst engine = new Liquid();\r\n\r\nexport type GenType = \"class\" | \"interface\";\r\n\r\n/**\r\n * https://liquid.mdn.cn/basics/introduction/ 模板介绍\r\n *@desc API 模板工具\r\n *@author liudejian\r\n *@date 2025-10-14 17:10\r\n **/\r\nexport class ApiTemplateUtil {\r\n\r\n /**\r\n * 获取默认 排除正则\r\n */\r\n public static getDefaultExcludes() {\r\n let execludes = new Array<RegExp>();\r\n execludes.push(new RegExp(\"Response<.*\"))\r\n execludes.push(new RegExp(\"Page.*\"))\r\n execludes.push(new RegExp(\"Request<.*\"))\r\n return execludes;\r\n }\r\n\r\n /**\r\n * https://liquid.mdn.cn/basics/introduction/\r\n * @param genType\r\n */\r\n public static modelTemplate(genType: GenType = \"class\"): string {\r\n let model = \"\";\r\n model += \"{% for entity in entities %}\";\r\n model += \"{% if entity.title != ''%}\";\r\n model += \"/**{{entity.title}}*/ \\n\";\r\n model += \"{% endif %}\";\r\n if (genType == \"class\") {\r\n model += \"export class {{entity.name}} {\\n\";\r\n } else {\r\n model += \"export interface {{entity.name}} {\\n\";\r\n }\r\n model += \"{% for field in entity.entityFields %}\";\r\n model += \"{% if field.title !='' %}\";\r\n model += \"\\t/** {{field.title}} */ \\n\";\r\n model += \"{% endif %}\";\r\n model += \"{% if field.required == true %}\";\r\n if (genType == \"class\") {\r\n model += \"\\t{{field.name}}!:{{field.type}}; \\n\";\r\n } else {\r\n model += \"\\t{{field.name}}:{{field.type}}; \\n\";\r\n }\r\n model += \"{% else %}\";\r\n model += \"\\t{{field.name}}?:{{field.type}}; \\n\";\r\n model += \"{% endif %}\";\r\n model += \"{% endfor %}\";\r\n model += \"}\\n\";\r\n model += \"{% endfor %}\";\r\n return model;\r\n }\r\n\r\n /**\r\n * import {LoginLogBo} from \"./models\";\r\n */\r\n public static apiCommonImports(): string {\r\n let data = \"import 'reflect-metadata';\\n\";\r\n data += \"import {Api, CC, MC, SC, Page,Get,Put,Delete,Post, Request, Response, Security,RA} from \\\"@liuit/api\\\";\\n\";\r\n data += \"import {IocContext, Service} from \\\"@liuit/core\\\";\\n\";\r\n return data;\r\n }\r\n\r\n /**\r\n * 动态导入|导出 的实体\r\n * @param entities\r\n * @param excludeRegs\r\n */\r\n public static dynamicImportOrExportModel(type: \"import\" | \"export\", entities: Array<Entity>, excludeRegs?: Array<RegExp>): string {\r\n let result = \"\";\r\n if (!excludeRegs) {\r\n excludeRegs = ApiTemplateUtil.getDefaultExcludes();\r\n }\r\n const finalAry = ApiTemplateUtil.filterModels(entities, excludeRegs);\r\n if (finalAry) {\r\n if (type == \"import\") {\r\n result = \"import {\";\r\n } else {\r\n result = \"export {\";\r\n }\r\n for (let i = 0; i < finalAry.length; i++) {\r\n let entity = finalAry[i];\r\n if (i == finalAry.length - 1) {\r\n result += entity.name\r\n } else {\r\n result += entity.name + \",\"\r\n }\r\n }\r\n result += \"} from \\\"./models\\\"\";\r\n }\r\n return result;\r\n }\r\n\r\n\r\n /**\r\n * 动态导入或者导出API\r\n * @param type\r\n * @param apiMap\r\n */\r\n public static dynamicImportOrExportApi(type: \"import\" | \"export\", apiMap: Map<string, Array<SwApi>>,apiSuffix:string): string {\r\n if (apiSuffix == null || apiSuffix == undefined || apiSuffix.trim().length == 0) {\r\n apiSuffix = \"\";\r\n }\r\n let result = type + \" {\";\r\n apiMap.forEach((value, domain: string) => {\r\n result += domain + apiSuffix + \"Api,\"\r\n })\r\n result = result.substring(0, result.length - 1);\r\n result += \"} from \\\"./apis\\\"\";\r\n return result;\r\n }\r\n\r\n /**\r\n * 动态导入API集合\r\n * const SdApis = {\r\n * LoginLogApi: IocContext.getBean<LoginLogApi>(LoginLogApi),\r\n * }\r\n * export {SdApis}\r\n * @param apiMap\r\n * @private\r\n */\r\n public static dynamicImportApis(contextPathName: string, apiMap: Map<string, Array<SwApi>>,apiSuffix:string) {\r\n if (apiSuffix == null || apiSuffix == undefined || apiSuffix.trim().length == 0) {\r\n apiSuffix = \"\";\r\n }\r\n let apis = \"const \" + contextPathName +apiSuffix+ \"Apis = {\\n\";\r\n if (apiMap) {\r\n let index = 0;\r\n apiMap.forEach((values, domain) => {\r\n let domainApi = domain +apiSuffix+ \"Api\";\r\n if (index == apiMap.size - 1) {\r\n apis += \"\\t\" + domainApi + \": IocContext.getBean<\" + domainApi + \">(\" + domainApi + \")\\n\";\r\n } else {\r\n apis += \"\\t\" + domainApi + \": IocContext.getBean<\" + domainApi + \">(\" + domainApi + \"),\\n\";\r\n }\r\n index++;\r\n })\r\n }\r\n apis += \"}\\n\"\r\n apis += \"export {\"+contextPathName+apiSuffix+\"Apis}\\n\";\r\n return apis;\r\n }\r\n\r\n\r\n private static firstWordUp(word: string): string {\r\n word = word.toLowerCase();\r\n word = word.charAt(0).toUpperCase() + word.slice(1);\r\n return word;\r\n }\r\n\r\n /**\r\n *\r\n * @param baseUrl\r\n * @param domain\r\n * @param uriPrefix\r\n * @param tag\r\n * @param apis\r\n * @param suffix API统一后缀【可选 】\r\n * @param includeImport 是否包含import信息\r\n */\r\n public static genApi(baseUrl: string, domain: string, uriPrefix: string, tag: string,suffix:string, apis: Array<SwApi>, includeImport?: boolean): string {\r\n let code = \"\";\r\n code += \"\\n\";\r\n if (includeImport) {\r\n code += ApiTemplateUtil.apiCommonImports();\r\n }\r\n if (suffix == null || suffix == undefined || suffix.trim().length == 0) {\r\n suffix = \"\";\r\n }\r\n code += \"\\n@Service()\\n\";\r\n code += \"@Api(CC.of('\" + baseUrl + \"', '\" + uriPrefix + \"', '\" + domain + \"', '\" + tag + \"'))\\n\";\r\n code += \"export class \" + domain + suffix+\"Api {\\n\";\r\n for (let api of apis) {\r\n code += \"\\t@\" + ApiTemplateUtil.firstWordUp(api.method) + \"(\";\r\n let path = api.path;\r\n // let pathAry = path.split(\"/\");\r\n // let pathLastUri = pathAry[pathAry.length - 1];\r\n const pathLastUri = SwaggerUtil.getSubPathAfterRoot(uriPrefix,path);\r\n code += \"MC.of('\" + pathLastUri + \"','\" + api.remark + \"')\"\r\n code += \")\\n\";\r\n code += \"\\tpublic \" + api.operationId + \"(\";\r\n let bodyStr = \"\";\r\n if (api.reqBody) {\r\n let data = api.reqBody.bodyType;\r\n data = NameUtil.removeSymbol(data);\r\n bodyStr += NameUtil.pascalToCamel(data) + \":\" + SwaggerUtil.convertNameToType(api.reqBody.bodyType);\r\n }\r\n if (api.reqParams) {\r\n let params = api.reqParams;\r\n let paramStr = \"\";\r\n for (let param of params) {\r\n paramStr += param.paramName;\r\n if (!param.required) {\r\n paramStr += \"?\"\r\n }\r\n paramStr += \":\" + param.paramType + \",\";\r\n }\r\n paramStr = paramStr.substring(0, paramStr.length - 1);\r\n if (bodyStr) {\r\n code += bodyStr + \",\" + paramStr;\r\n } else {\r\n code += paramStr;\r\n }\r\n } else {\r\n code += bodyStr;\r\n }\r\n code += \")\";\r\n let responseType = api.responseType;\r\n if (responseType) {\r\n code += \":\";\r\n // responseType = SwaggerUtil.convertNameToType(responseType); //已经转换了,这里不需要再转换了\r\n if (responseType && responseType.startsWith(\"Response\")) {\r\n //todo 响应对象RequestAdapter=>RA简称\r\n responseType = responseType.replace(\"Response\", \"RA\");\r\n }\r\n code += responseType;\r\n }\r\n code += \" {return RA.prototype}\";\r\n code += \"\\n\\n\";\r\n\r\n }\r\n code += \"}\\n\";\r\n return code;\r\n }\r\n\r\n\r\n /**\r\n * 生成API\r\n * @param baseUrl\r\n * @param suffix API统一后缀 domain+suffix+Api\r\n * @param apiMap\r\n */\r\n public static genApis(baseUrl: string,suffix:string, apiMap: Map<string, Array<SwApi>>): string {\r\n let result = \"\";\r\n\r\n result += ApiTemplateUtil.apiCommonImports();\r\n apiMap.forEach((apis: Array<SwApi>, domain: string) => {\r\n // 提取所有的PATH路径\r\n let paths = apis.map(swApi=>swApi.path);\r\n const uriPrefix = SwaggerUtil.getCommonRootPath(paths);\r\n\r\n let firstApi = apis[0];\r\n\r\n let tag = firstApi.tag;\r\n result += ApiTemplateUtil.genApi(baseUrl, domain, uriPrefix, tag,suffix, apis, false);\r\n\r\n\r\n })\r\n return result;\r\n }\r\n\r\n /**\r\n * 执行模板\r\n * @param template 模板\r\n * @param data 数据\r\n */\r\n public static async execute(template: string, data: any): Promise<string> {\r\n const result = await engine.parseAndRender(template, data);\r\n return result;\r\n }\r\n\r\n /**\r\n * 同步执行\r\n * @param template\r\n * @param data\r\n */\r\n public static executeSync(template: string, data: any): string {\r\n return engine.parseAndRenderSync(template, data);\r\n\r\n }\r\n /**\r\n * 过滤模型\r\n * @param entities 实体列表\r\n * @param excludePatterns 排除的实体\r\n */\r\n public static filterModels(entities: Array<Entity>, excludePatterns?: Array<RegExp>) {\r\n if (!excludePatterns) {\r\n excludePatterns = ApiTemplateUtil.getDefaultExcludes();\r\n }\r\n let setEntitys = new Set();\r\n let finalAry = new Array<Entity>();\r\n for (let entity of entities) {\r\n //console.log(\"entity=====\",entity)\r\n if (excludePatterns) {\r\n let isMatch = false;\r\n for (let excludePattern of excludePatterns) {\r\n if (excludePattern.test(entity.name)) {\r\n isMatch = true;\r\n break;\r\n }\r\n }\r\n if (isMatch) {\r\n continue;\r\n }\r\n }\r\n finalAry.push(entity);\r\n }\r\n return finalAry;\r\n }\r\n\r\n /**\r\n * 生成model\r\n * @param entities 实体列表\r\n * @param excludePatterns 排除的实体\r\n * @param genType 生成的类型\r\n */\r\n public static genModels(entities: Array<Entity>, excludePatterns?: Array<RegExp>, genType?: GenType): Promise<string> {\r\n const finalAry = ApiTemplateUtil.filterModels(entities, excludePatterns);\r\n let modelTemplate = ApiTemplateUtil.modelTemplate(genType);\r\n return ApiTemplateUtil.execute(modelTemplate, {\"entities\": finalAry});\r\n }\r\n\r\n public static genModelsSync(entities: Array<Entity>, excludePatterns?: Array<RegExp>, genType?: GenType): string {\r\n const finalAry = ApiTemplateUtil.filterModels(entities, excludePatterns);\r\n let modelTemplate = ApiTemplateUtil.modelTemplate(genType);\r\n return ApiTemplateUtil.executeSync(modelTemplate, {\"entities\": finalAry});\r\n }\r\n\r\n\r\n /* public static testGenModels() {\r\n let token = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiI5MWJhNjE3YWVjOTVhZmZjMzVjMTk2IiwiY3QiOjEsInB0IjoxLCJqdGkiOiIwMDAwMDE5OTk0ZmRkMzA1NzMxYWRjYzUyODEyODAxMCIsImlhdCI6MTc1OTE0MTI4Nywic3ViIjoibGl1ZGVqaWFuIiwiZXhwIjoxNzU5MjI3Njg3fQ.Fyb4TIUiaMldIV24QD6mHlCudYouwjp-GmbJiaiaWaE\";\r\n SwaggerUtil.getOpenAPI(\"http://127.0.0.1:8081/sd/v3/api-docs/uc\", token).then((openapi: OpenAPI) => {\r\n let entities = SwaggerUtil.parseModels(openapi);\r\n let execludes = new Array<RegExp>();\r\n execludes.push(new RegExp(\"Response.*\"))\r\n execludes.push(new RegExp(\"Page.*\"))\r\n execludes.push(new RegExp(\"Request.*\"))\r\n ApiTemplateUtil.genModels(entities, execludes, \"interface\").then((data: string) => {\r\n console.log(\"data====\" + data)\r\n })\r\n console.log(\"=========\", entities.length)\r\n\r\n })\r\n }*/\r\n\r\n /**\r\n * 生产APIS\r\n */\r\n /* public static testGenApis() {\r\n let url = \"http://192.168.1.95:8081/sd/v3/api-docs/gc-api\";\r\n let token = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiJmZjYzNThjZmQ4ZWY3NjY5NzRjMDc2NjdlZGZlMTA2MGE5NzRiYWNhMGU2MjJjYzVjMDg0M2U5YzM3OWY5YmZmIiwiY3QiOjEsInB0IjoxLCJqdGkiOiIwMDAwMDE5YzIxM2YxNTM2YTJkZjdlOTk0ZGI0ZTA1NiIsImlhdCI6MTc3MDA4NDMwOCwic3ViIjoibGl1ZGVqaWFuIiwiZXhwIjoxNzcwMTcwNzA4fQ.379uD5Fh3S2L6z1X56uFsh5aMbW5YZK96hH3ivEGkE0\";\r\n SwaggerUtil.getOpenAPI(url, token).then((openapi: OpenAPI) => {\r\n\r\n let map = SwaggerUtil.parseApi(openapi);\r\n map.forEach((value, key) => {\r\n console.log(`Key: ${key}, Value:`,JSON.stringify(value,null,2));\r\n });\r\n let result = ApiTemplateUtil.genApis(\"/sd\",\"Inner\", map);\r\n console.log(result)\r\n\r\n })\r\n }\r\n*/\r\n}\r\n\r\n//ApiTemplateUtil.testGenModels();\r\n\r\n//ApiTemplateUtil.testGenApis();\r\n","/**\r\n *@desc\r\n *@author liudejian\r\n *@date 2025-11-14 11:09\r\n **/\r\nexport default class DateUtil {\r\n /**\r\n * console.log(formatDate(new Date(), { year: 'numeric', month: 'long', day: 'numeric' }));\r\n * // 输出:2025年11月14日\r\n * 原生日期格式化(支持国际化)\r\n * @param date 日期对象/时间戳/ISO字符串\r\n * @param options 格式化配置\r\n * @param locale 语言(默认中文:zh-CN)\r\n * @returns 格式化后的字符串\r\n */\r\n public static formatDate(\r\n date: Date | number | string,\r\n options?: Intl.DateTimeFormatOptions,\r\n locale: string | string[] = 'zh-CN'\r\n ): string {\r\n // 处理输入:统一转为 Date 对象(兼容时间戳、ISO字符串)\r\n const targetDate = new Date(date);\r\n // 校验日期有效性\r\n if (isNaN(targetDate.getTime())) {\r\n throw new Error('无效的日期格式');\r\n }\r\n // 默认格式化配置(可覆盖)\r\n const defaultOptions: Intl.DateTimeFormatOptions = {\r\n year: 'numeric',\r\n month: '2-digit',\r\n day: '2-digit',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n second: '2-digit',\r\n hour12: false, // 24小时制\r\n };\r\n return new Intl.DateTimeFormat(locale, { ...defaultOptions, ...options }).format(targetDate);\r\n }\r\n\r\n /**\r\n * 仅日期(yyyy-MM-dd)\r\n * @param date\r\n */\r\n public static formatDateOnly(date: Date | number | string): string {\r\n return DateUtil.formatDate(date, {\r\n year: 'numeric',\r\n month: '2-digit',\r\n day: '2-digit',\r\n });\r\n }\r\n\r\n /**\r\n * 仅时间(HH:mm:ss)\r\n * @param date\r\n */\r\n public static formatTimeOnly(date: Date | number | string): string {\r\n return DateUtil.formatDate(date, {\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n second: '2-digit',\r\n hour12: false,\r\n });\r\n }\r\n\r\n /**\r\n * 带时区(yyyy-MM-dd HH:mm:ss (UTC+8))\r\n * @param date\r\n */\r\n public static formatDateWithTimezone(date: Date | number | string): string {\r\n return DateUtil.formatDate(date, {\r\n year: 'numeric',\r\n month: '2-digit',\r\n day: '2-digit',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n second: '2-digit',\r\n hour12: false,\r\n timeZoneName: 'short',\r\n });\r\n }\r\n\r\n}\r\n","import DateUtil from \"/@/util/DateUtil\";\r\n\r\n/**\r\n *@desc\r\n *@author liudejian\r\n *@date 2025-11-14 11:29\r\n **/\r\nexport default class HeaderUtil {\r\n\r\n /**\r\n * 生成头注释信息\r\n * @param desc 描述\r\n * @param author 作者\r\n */\r\n public static getHeaderAnno(desc:string,author?:string) {\r\n let annoStr = \" /**\\n\";\r\n annoStr += \" *@desc \"+desc+\" \\n\";\r\n if (author) {\r\n annoStr += \" *@author \"+ author +\" \\n\";\r\n } else {\r\n annoStr += \" *@author <a href=\\'mailto:zuiwoxing@qq.com\\'>刘IT</a> \\n\";\r\n }\r\n annoStr += \" *@date \" + DateUtil.formatDate(new Date()) + \" \\n\";\r\n annoStr +=\" */\\n\";\r\n return annoStr;\r\n }\r\n}\r\n","import {SwaggerUtil} from \"./SwaggerUtil\";\r\nimport {CodeInfo, Entity, OpenAPI, SwApi} from \"../model\";\r\nimport fs from \"fs\";\r\nimport {ApiTemplateUtil} from \"./ApiTemplateUtil\";\r\nimport path from \"path\";\r\nimport NameUtil from \"./NameUtil\";\r\nimport HeaderUtil from \"./HeaderUtil\";\r\n\r\n/**\r\n *@desc\r\n *@author liudejian\r\n *@date 2025-10-15 22:20\r\n **/\r\nexport class CodeGenUtil {\r\n\r\n\r\n\r\n /**\r\n * 生成代码 返回 CodeInfo\r\n * @param swaggerApiUrl swagger服务API地址\r\n * @param token 令牌\r\n * @param contextPath 上下文路径(前缀)\r\n * @param apiSuffix API后缀 domain+apiSuffix+Api\r\n * @param excludePrefix 需要排除的固定前缀(如 /api/gc)\r\n */\r\n public static async genCodeContent(swaggerApiUrl: string,\r\n token: string = \"\",\r\n contextPath: string = \"/\",\r\n apiSuffix:string = \"\",\r\n excludePrefix:string = \"/\") {\r\n const codeInfo = new CodeInfo();\r\n\r\n return await SwaggerUtil.getOpenAPI(swaggerApiUrl, token).then((openapi: OpenAPI) => {\r\n\r\n let entities = SwaggerUtil.parseModels(openapi);\r\n let excludeRegs = ApiTemplateUtil.getDefaultExcludes();\r\n const dynamicImports = ApiTemplateUtil.dynamicImportOrExportModel(\"import\",entities, excludeRegs);\r\n\r\n let models = ApiTemplateUtil.genModelsSync(entities, excludeRegs, \"class\");\r\n // 【1】生成类型定义\r\n let headerModelDoc = HeaderUtil.getHeaderAnno(\"实体类信息\",\"<a href='mailto:zuiwoxing@qq.com'>刘IT</a>\");\r\n models = headerModelDoc + models;\r\n codeInfo.models = models;\r\n\r\n\r\n let apiMap = SwaggerUtil.parseApi(openapi,excludePrefix);\r\n let codeApis = ApiTemplateUtil.genApis(contextPath,apiSuffix, apiMap);\r\n // 【2】生成API接口\r\n let headerDoc = HeaderUtil.getHeaderAnno(\"API接口信息\",\"<a href='mailto:zuiwoxing@qq.com'>刘IT</a>\");\r\n let apiInfos = headerDoc+dynamicImports + \"\\n\" + codeApis;\r\n codeInfo.apis = apiInfos;\r\n //【3】 生成索引index文件\r\n let contextPathName = \"\";\r\n if (contextPath == \"/\") {\r\n contextPathName = \"\";\r\n } else {\r\n contextPathName = contextPath.replace(\"/\",\"\");\r\n contextPathName = NameUtil.toPascalCase(contextPathName);\r\n }\r\n let indexApi = CodeGenUtil.genIndexContent(contextPathName,entities, excludeRegs, apiMap,apiSuffix);\r\n indexApi=headerDoc+indexApi;\r\n codeInfo.index = indexApi;\r\n return codeInfo;\r\n })\r\n\r\n\r\n\r\n }\r\n\r\n /**\r\n * 生成代码 (默认生成代码 在 outputDir/contextPath 目录下 生成(models.ts,apis.ts,index.ts)三个文件)\r\n * @param swaggerApiUrl swagger服务API地址\r\n * @param token 令牌\r\n * @param contextPath 上下文路径(前缀)\r\n * @param apiSuffix API后缀 domain+apiSuffix+Api\r\n * @param excludePrefix 需要排除的固定前缀(如 /api/gc)\r\n * @param outputDir 输出文件夹(可根据模块输出,相对于本地目录。默认本地: auto-code)\r\n */\r\n public static genCodeToFile(swaggerApiUrl: string,\r\n token: string = \"\",\r\n contextPath: string = \"/\",\r\n apiSuffix:string = \"\",\r\n excludePrefix:string = \"/\",\r\n outputDir?: string) {\r\n if (!outputDir) {\r\n outputDir = \"./auto-code\";\r\n }\r\n if (contextPath) {\r\n outputDir += contextPath;\r\n }\r\n\r\n // 创建输出目录\r\n if (!fs.existsSync(outputDir)) {\r\n fs.mkdirSync(outputDir, {recursive: true});\r\n }\r\n\r\n SwaggerUtil.getOpenAPI(swaggerApiUrl, token).then((openapi: OpenAPI) => {\r\n let entities = SwaggerUtil.parseModels(openapi);\r\n let excludeRegs = ApiTemplateUtil.getDefaultExcludes();\r\n const dynamicImports = ApiTemplateUtil.dynamicImportOrExportModel(\"import\",entities, excludeRegs);\r\n\r\n // 【1】生成类型定义\r\n let models = ApiTemplateUtil.genModelsSync(entities, excludeRegs, \"class\");\r\n if (typeof outputDir === \"string\") {\r\n let headerDoc = HeaderUtil.getHeaderAnno(\"实体类信息\",\"<a href='mailto:zuiwoxing@qq.com'>刘IT</a>\");\r\n models = headerDoc + models;\r\n fs.writeFileSync(path.join(outputDir, 'models.ts'), models);\r\n }\r\n\r\n let apiMap = SwaggerUtil.parseApi(openapi,excludePrefix);\r\n let codeApis = ApiTemplateUtil.genApis(contextPath,apiSuffix, apiMap);\r\n // 【2】生成API接口\r\n if (typeof outputDir === \"string\") {\r\n let headerDoc = HeaderUtil.getHeaderAnno(\"API接口信息\",\"<a href='mailto:zuiwoxing@qq.com'>刘IT</a>\");\r\n let apiInfos = headerDoc+dynamicImports + \"\\n\" + codeApis;\r\n fs.writeFileSync(path.join(outputDir, 'apis.ts'), apiInfos);\r\n }\r\n //【3】 生成索引index文件\r\n if (typeof outputDir === \"string\") {\r\n let contextPathName = \"\";\r\n if (contextPath == \"/\") {\r\n contextPathName = \"\";\r\n } else {\r\n contextPathName = contextPath.replace(\"/\",\"\");\r\n contextPathName = NameUtil.toPascalCase(contextPathName);\r\n }\r\n let indexApi = CodeGenUtil.genIndexContent(contextPathName,entities, excludeRegs, apiMap,apiSuffix);\r\n let headerDoc = HeaderUtil.getHeaderAnno(\"API集合索引\",\"<a href='mailto:zuiwoxing@qq.com'>刘IT</a>\");\r\n indexApi=headerDoc+indexApi;\r\n fs.writeFileSync(path.join(outputDir, 'index.ts'), indexApi);\r\n }\r\n })\r\n }\r\n\r\n\r\n /**\r\n *\r\n * @param contextPathName 上下文名称\r\n * @param entities\r\n * @param excludeRegs\r\n * @param apiMap\r\n * @param apiSuffix domain+apiSuffix+Api\r\n * @private\r\n */\r\n private static genIndexContent(contextPathName:string,entities: Array<Entity>, excludeRegs: Array<RegExp>,\r\n apiMap: Map<string, Array<SwApi>>,apiSuffix:string) {\r\n let index = \"\";\r\n index += \"\\nimport {IocContext} from \\\"@liuit/core\\\";\\n\";\r\n const exportModels = ApiTemplateUtil.dynamicImportOrExportModel(\"export\",entities, excludeRegs);\r\n index += exportModels + \"\\n\";\r\n const importApis = ApiTemplateUtil.dynamicImportOrExportApi(\"import\", apiMap,apiSuffix);\r\n index += importApis + \"\\n\";\r\n index += ApiTemplateUtil.dynamicImportApis(contextPathName,apiMap,apiSuffix);\r\n\r\n return index;\r\n }\r\n\r\n\r\n}\r\n\r\n\r\n"],"names":["HttpMethod","ReqBody","constructor","Object","defineProperty","this","ReqParam","SwApi","methodOf","method","toUpperCase","trim","GET","toString","POST","PUT","DELETE","HEADER","PATCH","OPTIONS","Error","addParam","reqParam","reqParams","Array","push","Entity","of","name","title","type","entity","addField","ef","entityFields","EntityField","format","required","minLen","maxLen","ref","minLength","maxLength","CodeInfo","NameUtil","splitWords","str","replace","split","filter","Boolean","toPascalCase","words","length","map","w","charAt","slice","toLowerCase","join","toCamelCase","pascalToCamel","removeSymbol","result","reg","test","SwaggerUtil","getSchemaType","schema","$ref","refParts","enum","v","items","properties","props","entries","forEach","propName","propSchema","index","array","isRequired","_b","_a","includes","propType","oneOf","s","anyOf","allOf","getFunctionName","path","operation","operationId","numReg","part","startsWith","endsWith","getOpenAPI","swaggerUrl","authToken","response","axios","get","headers","Authorization","data","parseModelToMap","openapi","entityMap","Map","components","schemas","schemaName","parseModel","set","getInnermostGenerics","typeStr","innermost","firstAngleIndex","indexOf","innerStr","substring","start","angleCount","i","char","child","lastChild","parseNestedGenerics","typeName","children","childStr","lastChildStr","parseModels","entityAry","convertNameToType","key","value","requestReg","responseReg","pageReg","listReg","setReg","description","types","entityField","enumValue","filterPath","pathAry","getCommonRootPath","paths","segments","p","first","commonLen","every","getSubPathAfterRoot","rootPath","fullPath","root","sub","buildPathKeyMap","excludePrefix","resultMap","processedPaths","groupMap","originalPath","firstSegment","fullGroupPrefix","has","_","groupPrefix","lastSegment","pop","pascalName","getLastPathSegment","getDomainByPath","pathMap","matchedKeys","from","keys","bestMatchKey","sort","a","b","parseApi","openapiPaths","pathDomainMap","methods","functionName","domain","resultPath","swApis","sa","tag","tags","remark","summary","requestBodyType","requestBody","content","reqBody","bodyName","bodyType","parameters","pathParams","in","queryParams","param","paramType","paramName","responseType","successResponse","responses","values","_c","_e","_d","engine","Liquid","ApiTemplateUtil","getDefaultExcludes","execludes","RegExp","modelTemplate","genType","model","apiCommonImports","dynamicImportOrExportModel","entities","excludeRegs","finalAry","filterModels","dynamicImportOrExportApi","apiMap","apiSuffix","undefined","dynamicImportApis","contextPathName","apis","domainApi","size","firstWordUp","word","genApi","baseUrl","uriPrefix","suffix","includeImport","code","api","bodyStr","params","paramStr","genApis","swApi","execute","template","parseAndRender","executeSync","parseAndRenderSync","excludePatterns","isMatch","excludePattern","genModels","genModelsSync","DateUtil","formatDate","date","options","locale","targetDate","Date","isNaN","getTime","Intl","DateTimeFormat","assign","year","month","day","hour","minute","second","hour12","formatDateOnly","formatTimeOnly","formatDateWithTimezone","timeZoneName","HeaderUtil","getHeaderAnno","desc","author","annoStr","CodeGenUtil","genCodeContent","swaggerApiUrl_1","swaggerApiUrl","token","contextPath","codeInfo","then","dynamicImports","models","codeApis","headerDoc","apiInfos","indexApi","genIndexContent","genCodeToFile","outputDir","fs","existsSync","mkdirSync","recursive","writeFileSync"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("axios"),require("fs"),require("liquidjs"),require("path")):"function"==typeof define&&define.amd?define(["exports","axios","fs","liquidjs","path"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).api={},e.axios,e.fs,e.liquidjs,e.path)}(this,function(e,t,r,n,i){"use strict";var a;e.HttpMethod=void 0,(a=e.HttpMethod||(e.HttpMethod={})).GET="GET",a.PUT="PUT",a.POST="POST",a.DELETE="DELETE",a.HEADER="HEADER",a.OPTIONS="OPTIONS",a.PATCH="PATCH";class o{constructor(){Object.defineProperty(this,"bodyName",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"bodyType",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"required",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}}class s{constructor(){Object.defineProperty(this,"paramName",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"ref",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"paramType",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"format",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"required",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"in",{enumerable:!0,configurable:!0,writable:!0,value:"query"})}}class l{constructor(){Object.defineProperty(this,"domain",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"path",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"method",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"remark",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"tag",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"operationId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"reqBody",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"reqParams",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"responseType",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}methodOf(t){if((t=t.toUpperCase().trim())===e.HttpMethod.GET.toString())return e.HttpMethod.GET;if(t===e.HttpMethod.POST.toString())return e.HttpMethod.POST;if(t===e.HttpMethod.PUT.toString())return e.HttpMethod.PUT;if(t===e.HttpMethod.DELETE.toString())return e.HttpMethod.DELETE;if(t===e.HttpMethod.HEADER.toString())return e.HttpMethod.HEADER;if(t===e.HttpMethod.PATCH.toString())return e.HttpMethod.PATCH;if(t===e.HttpMethod.OPTIONS.toString())return e.HttpMethod.OPTIONS;throw new Error("not support "+t)}addParam(e){return this.reqParams||(this.reqParams=new Array),this.reqParams.push(e),this}}class c{constructor(){Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"title",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"entityFields",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}static of(e,t,r){const n=new c;return n.name=e,n.title=t,n.type=r,n}addField(e){return null==this.entityFields&&(this.entityFields=new Array),this.entityFields.push(e),this}}class p{constructor(){Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"title",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"format",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"required",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"maxLength",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"minLength",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"ref",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}static of(e,t,r,n,i,a,o,s){const l=new p;return l.name=e,l.title=t,l.type=r,l.format=n,l.required=i,l.minLength=a,l.maxLength=o,l.ref=s,l}}class u{constructor(){Object.defineProperty(this,"models",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"apis",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"index",{enumerable:!0,configurable:!0,writable:!0,value:void 0})}}function d(e,t,r,n){return new(r||(r=Promise))(function(i,a){function o(e){try{l(n.next(e))}catch(e){a(e)}}function s(e){try{l(n.throw(e))}catch(e){a(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(o,s)}l((n=n.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;class m{static splitWords(e){return e.trim().replace(/[_\s-]+/g,"_").split("_").filter(Boolean)}static toPascalCase(e){const t=m.splitWords(e);return 0===t.length?"":t.map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("")}static toCamelCase(e){const t=m.splitWords(e);if(0===t.length)return"";return t[0].toLowerCase()+t.slice(1).map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join("")}static pascalToCamel(e){return e?e.charAt(0).toLowerCase()+e.slice(1):e}static removeSymbol(e){if(!e)return e;let t=e;const r=/<[^<>]*>/g;for(;r.test(t);)t=t.replace(r,"");return t.trim()}}class f{static getSchemaType(e){if(e.$ref){const t=e.$ref.split("/");return t[t.length-1]}if("string"===e.type)return"date-time"===e.format?"string /* date-time */":e.enum?e.enum.map(e=>`'${e}'`).join(" | "):"string";if("number"===e.type||"integer"===e.type)return e.enum?e.enum.map(e=>e.toString()).join(" | "):"number";if("boolean"===e.type)return"boolean";if("array"===e.type&&e.items)return`Array<${f.getSchemaType(e.items)}>`;if("object"===e.type&&e.properties){let t="";return Object.entries(e.properties).forEach(([r,n],i,a)=>{var o,s;const l=null!==(s=null===(o=e.required)||void 0===o?void 0:o.includes(r))&&void 0!==s&&s,c=f.getSchemaType(n);t+=`${r}${l?"":"?"}: ${c}`,i<a.length-1&&(t+="; ")}),`{ ${t} }`}return e.oneOf?e.oneOf.map(e=>f.getSchemaType(e)).join(" | "):e.anyOf?e.anyOf.map(e=>f.getSchemaType(e)).join(" | "):e.allOf?e.allOf.map(e=>f.getSchemaType(e)).join(" & "):"any"}static getFunctionName(e,t,r){if(r.operationId){let e=/.*_[0-9]+$/,t=r.operationId;return e.test(t)&&(t=t.replace(/_\d+$/,"")),t}let n=t.toLowerCase();return e.split("/").filter(e=>e).forEach(e=>{e.startsWith("{")&&e.endsWith("}")?n+=e.slice(1,-1).charAt(0).toUpperCase()+e.slice(2,-1):n+=e.charAt(0).toUpperCase()+e.slice(1)}),n}static getOpenAPI(e,r){return d(this,void 0,void 0,function*(){let n=null;n=r?yield t.get(e,{headers:{Authorization:"Bearer "+r}}):yield t.get(e);return n.data})}static parseModelToMap(e){var t;const r=new Map;return(null===(t=e.components)||void 0===t?void 0:t.schemas)&&Object.entries(e.components.schemas).forEach(([t,n])=>{let i=f.parseModel(t,n,e);r.set(i.name,i)}),r}static getInnermostGenerics(e){const t=[],r=e.trim(),n=r.indexOf("<");if(-1===n)return[r];const i=r.substring(n+1,r.length-1).trim();let a=0,o=0;for(let e=0;e<i.length;e++){const r=i[e];if("<"===r)o++;else if(">"===r)o--;else if(","===r&&0===o){const r=i.substring(a,e).trim();r&&t.push(...f.getInnermostGenerics(r)),a=e+1}}const s=i.substring(a).trim();return s&&t.push(...f.getInnermostGenerics(s)),t}static parseNestedGenerics(e){const t=e.trim(),r=t.indexOf("<");if(-1===r)return{name:t};const n=t.substring(0,r).trim(),i=t.substring(r+1,t.length-1).trim(),a=[];let o=0,s=0;for(let e=0;e<i.length;e++){const t=i[e];if("<"===t)s++;else if(">"===t)s--;else if(","===t&&0===s){const t=i.substring(o,e).trim();t&&a.push(f.parseNestedGenerics(t)),o=e+1}}const l=i.substring(o).trim();return l&&a.push(f.parseNestedGenerics(l)),{name:n,children:a}}static parseModels(e){var t;const r=new Array;return(null===(t=e.components)||void 0===t?void 0:t.schemas)&&Object.entries(e.components.schemas).forEach(([t,n])=>{let i=f.parseModel(t,n,e);r.push(i)}),r}static convertNameToType(e){if(/Request[a-zA-Z0-9]+/.test(e)){e.endsWith("RequestBo")||e.endsWith("RequestDto")||e.endsWith("RequestVo")?(e.startsWith("Request")&&(e=e.replace("Request","Request<")+">"),e.startsWith("Page")&&(e=e.replace("Page","Page<")+">")):e=e.replace("Request","Request<")+">"}if(/Response[a-zA-Z0-9]+/.test(e)&&(e=e.replace("Response","Response<")+">"),/Response<Page[a-zA-Z0-9]+>/.test(e)&&(e=e.replace("Page","Page<")+">"),/Response<List[a-zA-Z0-9]+>/.test(e)&&(e=e.replace("List","Array<")+">"),/Response<Set[a-zA-Z0-9]+>/.test(e)&&(e=e.replace("Set","Array<")+">"),/.*<Integer|Long>.*/.test(e)&&(e=(e=e.replace("<Integer>","<number>")).replace("<Long>","<number>")),/Response<String>/.test(e)&&(e=e.replace("<String>","<string>")),/Response<Boolean>/.test(e)&&(e=e.replace("<Boolean>","<boolean>")),/Response<Map[a-zA-Z0-9]+>/.test(e)){e=e.replace("Map","Map<")+">";let t=f.getInnermostGenerics(e)[0];if(/(Integer|Long|String).*/.test(t)){let r="",n="";t.startsWith("Long")?(r=t.substring(0,4),n=t.substring(4,t.length)):t.startsWith("Integer")?(r=t.substring(0,7),n=t.substring(7,t.length)):t.startsWith("String")&&(r=t.substring(0,6),n=t.substring(6,t.length)),r=r.replace("Long","number"),r=r.replace("Integer","number"),r=r.replace("String","string"),n=n.replace("Long","number"),n=n.replace("Integer","number"),n=n.replace("String","string"),e=e.replace(t,r+","+n)}}return e}static parseModel(e,t,r){let n=new c;const i=/Request.*/,a=/Response.*/,o=/Page.*/,s=/List.*/,l=/Set.*/;if(n.title=t.title||t.description||"",n.name=f.convertNameToType(e),t.oneOf||t.anyOf||t.allOf){let r="";r+=`export type ${e} = `,t.oneOf?r+=t.oneOf.map(e=>f.getSchemaType(e)).join(" | "):t.anyOf?r+=t.anyOf.map(e=>f.getSchemaType(e)).join(" | "):t.allOf&&(r+=t.allOf.map(e=>f.getSchemaType(e)).join(" & ")),r+=";\n"}else"object"===t.type&&t.properties?Object.entries(t.properties).forEach(([e,r])=>{var c,u;const d=null!==(u=null===(c=t.required)||void 0===c?void 0:c.includes(e))&&void 0!==u&&u;let m=f.getSchemaType(r),h=new p;if(h.title=r.title||r.description||"",i.test(m)){m.endsWith("RequestBo")||m.endsWith("RequestDto")||m.endsWith("RequestVo")?(m.startsWith("Request")&&(m=m.replace("Request","Request<")+">"),m.startsWith("Page")&&(m=m.replace("Page","Page<")+">")):m=m.replace("Request","Request<")+">"}a.test(m)&&(m=m.replace("Response","Response<")+">"),o.test(m)&&(m=m.replace("Page","Page<")+">"),s.test(m)&&(m=m.replace("List","Array<")+">"),l.test(m)&&(m=m.replace("Set","Array<")+">"),h.name=e,h.required=d,h.type=m,n.addField(h)}):"array"===t.type&&t.items?f.getSchemaType(t.items):t.enum?t.enum.forEach((e,t)=>{}):f.getSchemaType(t);return n}static filterPath(e){return e.filter(e=>!(e.startsWith("{")&&e.endsWith("}")))}static getCommonRootPath(e){if(!e.length)return"";const t=e.map(e=>e.split("/").filter(Boolean)),r=t[0];let n=0;for(let e=0;e<r.length;e++){if(!t.every(t=>t[e]===r[e]))break;n++}return"/"+r.slice(0,n).join("/")}static getSubPathAfterRoot(e,t){const r=e.endsWith("/")?e.slice(0,-1):e;let n=(t.endsWith("/")?t.slice(0,-1):t).replace(r,"");return n.startsWith("/")&&(n=n.slice(1)),n}static buildPathKeyMap(e,t){const r=new Map;if(!e.length)return r;const n=e.map(e=>e.startsWith(t)?e.slice(t.length):e),i=new Map;return n.forEach((r,n)=>{const a=e[n],o=r.split("/").filter(Boolean)[0]||"";if(!o)return;const s=`${t}/${o}`;i.has(s)||i.set(s,[]),i.get(s).push(a)}),i.forEach((e,t)=>{const n=t.split("/").filter(Boolean).pop()||"",i=m.toPascalCase(n);r.set(t,i)}),r}static getLastPathSegment(e){return e.split("/").filter(Boolean).pop()||""}static getDomainByPath(e,t){if(!e||!t)return"";const r=Array.from(e.keys()).filter(e=>t.startsWith(e));if(0===r.length)return"";const n=r.sort((e,t)=>t.length-e.length)[0];return e.get(n)||""}static parseApi(e,t){const r=new Map;let n=e.paths;const i=new Array;Object.entries(n).forEach(([e])=>{i.push(e)});const a=f.buildPathKeyMap(i,t);return Object.entries(n).forEach(([e,t])=>{Object.entries(t).forEach(([t,n])=>{var i,c,p,u,d;const h=f.getFunctionName(e,t,n);let g=f.getDomainByPath(a,e);if(!g||0==g.length){let t=e.split("/");if(t.length>=2){if(g=t[t.length-2],g.startsWith("{")&&g.endsWith("}")){let e=f.filterPath(t);e.length>=2&&(g=e[e.length-2])}g=m.toPascalCase(g)}}let b=r.get(g);b||(b=new Array);let y=new l;y.domain=g,y.method=y.methodOf(t),y.operationId=h,y.path=e;const v=(n.tags||["default"])[0];n.description,y.remark=n.description||n.summary||"",y.tag=v;let P="";if(n.requestBody&&(null===(i=n.requestBody)||void 0===i?void 0:i.content["application/json"])){const e=n.requestBody.content["application/json"].schema;P=f.getSchemaType(e);let t=new o;t.bodyName="data",t.bodyType=P,t.required=!0,y.reqBody=t}if(n.parameters&&n.parameters.length>0){const e=n.parameters.filter(e=>"path"===e.in),t=n.parameters.filter(e=>"query"===e.in);(e.length>0||t.length>0)&&n.parameters.forEach((e,t)=>{const r=f.getSchemaType(e.schema),n=new s;n.paramName=e.name,n.paramType=r,n.required=!!e.required&&e.required,n.in=e.in,y.addParam(n)})}let O="any";const w=n.responses[200]||n.responses[201]||Object.values(n.responses)[0];(null===(p=null===(c=null==w?void 0:w.content)||void 0===c?void 0:c["application/json"])||void 0===p?void 0:p.schema)?O=f.getSchemaType(w.content["application/json"].schema):(null===(d=null===(u=null==w?void 0:w.content)||void 0===u?void 0:u["*/*"])||void 0===d?void 0:d.schema)&&(O=f.getSchemaType(w.content["*/*"].schema)),O=f.convertNameToType(O),y.responseType=O,b.push(y),r.set(g,b)})}),r}}const h=new n.Liquid;class g{static getDefaultExcludes(){let e=new Array;return e.push(new RegExp("Response<.*")),e.push(new RegExp("Page.*")),e.push(new RegExp("Request<.*")),e}static modelTemplate(e="class"){let t="";return t+="{% for entity in entities %}",t+="{% if entity.title != ''%}",t+="/**{{entity.title}}*/ \n",t+="{% endif %}",t+="class"==e?"export class {{entity.name}} {\n":"export interface {{entity.name}} {\n",t+="{% for field in entity.entityFields %}",t+="{% if field.title !='' %}",t+="\t/** {{field.title}} */ \n",t+="{% endif %}",t+="{% if field.required == true %}",t+="class"==e?"\t{{field.name}}!:{{field.type}}; \n":"\t{{field.name}}:{{field.type}}; \n",t+="{% else %}",t+="\t{{field.name}}?:{{field.type}}; \n",t+="{% endif %}",t+="{% endfor %}",t+="}\n",t+="{% endfor %}",t}static apiCommonImports(){let e="import 'reflect-metadata';\n";return e+='import {Api, CC, MC, SC, Page,Get,Put,Delete,Post, Request, Response, Security,RA} from "@liuit/api";\n',e+='import {IocContext, Service} from "@liuit/core";\n','import \'reflect-metadata\';\nimport {Api, CC, MC, SC, Page,Get,Put,Delete,Post, Request, Response, Security,RA} from "@liuit/api";\nimport {IocContext, Service} from "@liuit/core";\n'}static dynamicImportOrExportModel(e,t,r){let n="";r||(r=g.getDefaultExcludes());const i=g.filterModels(t,r);if(i){n="import"==e?"import {":"export {";for(let e=0;e<i.length;e++){let t=i[e];e==i.length-1?n+=t.name:n+=t.name+","}n+='} from "./models"'}return n}static dynamicImportOrExportApi(e,t,r){null!=r&&null!=r&&0!=r.trim().length||(r="");let n=e+" {";return t.forEach((e,t)=>{n+=t+r+"Api,"}),n=n.substring(0,n.length-1),n+='} from "./apis"',n}static dynamicImportApis(e,t,r){null!=r&&null!=r&&0!=r.trim().length||(r="");let n="const "+e+r+"Apis = {\n";if(t){let e=0;t.forEach((i,a)=>{let o=a+r+"Api";e==t.size-1?n+="\t"+o+": IocContext.getBean<"+o+">("+o+")\n":n+="\t"+o+": IocContext.getBean<"+o+">("+o+"),\n",e++})}return n+="}\n",n+="export {"+e+r+"Apis}\n",n}static firstWordUp(e){return e=(e=e.toLowerCase()).charAt(0).toUpperCase()+e.slice(1)}static genApi(e,t,r,n,i,a,o){let s="";s+="\n",o&&(s+=g.apiCommonImports()),null!=i&&null!=i&&0!=i.trim().length||(i=""),s+="\n@Service()\n",s+="@Api(CC.of('"+e+"', '"+r+"', '"+t+"', '"+n+"'))\n",s+="export class "+t+i+"Api {\n";for(let e of a){s+="\t@"+g.firstWordUp(e.method)+"(";let t=e.path;s+="MC.of('"+f.getSubPathAfterRoot(r,t)+"','"+e.remark+"')",s+=")\n",s+="\tpublic "+e.operationId+"(";let n="";if(e.reqBody){let t=e.reqBody.bodyType;t=m.removeSymbol(t),n+=m.pascalToCamel(t)+":"+f.convertNameToType(e.reqBody.bodyType)}if(e.reqParams){let t=e.reqParams,r="";for(let e of t)r+=e.paramName,e.required||(r+="?"),r+=":"+e.paramType+",";r=r.substring(0,r.length-1),s+=n?n+","+r:r}else s+=n;s+=")";let i=e.responseType;i&&(s+=":",i&&i.startsWith("Response")&&(i=i.replace("Response","RA")),s+=i),s+=" {return RA.prototype}",s+="\n\n"}return s+="}\n",s}static genApis(e,t,r){let n="";return n+=g.apiCommonImports(),r.forEach((r,i)=>{let a=r.map(e=>e.path);const o=f.getCommonRootPath(a);let s=r[0].tag;n+=g.genApi(e,i,o,s,t,r,!1)}),n}static execute(e,t){return d(this,void 0,void 0,function*(){return yield h.parseAndRender(e,t)})}static executeSync(e,t){return h.parseAndRenderSync(e,t)}static filterModels(e,t){t||(t=g.getDefaultExcludes());let r=new Array;for(let n of e){if(t){let e=!1;for(let r of t)if(r.test(n.name)){e=!0;break}if(e)continue}r.push(n)}return r}static genModels(e,t,r){const n=g.filterModels(e,t);let i=g.modelTemplate(r);return g.execute(i,{entities:n})}static genModelsSync(e,t,r){const n=g.filterModels(e,t);let i=g.modelTemplate(r);return g.executeSync(i,{entities:n})}}class b{static formatDate(e,t,r="zh-CN"){const n=new Date(e);if(isNaN(n.getTime()))throw new Error("无效的日期格式");return new Intl.DateTimeFormat(r,Object.assign(Object.assign({},{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}),t)).format(n)}static formatDateOnly(e){return b.formatDate(e,{year:"numeric",month:"2-digit",day:"2-digit"})}static formatTimeOnly(e){return b.formatDate(e,{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}static formatDateWithTimezone(e){return b.formatDate(e,{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1,timeZoneName:"short"})}}class y{static getHeaderAnno(e,t){let r=" /**\n";return r+=" *@desc "+e+" \n",r+=t?" *@author "+t+" \n":" *@author <a href='mailto:zuiwoxing@qq.com'>刘IT</a> \n",r+=" *@date "+b.formatDate(new Date)+" \n",r+=" */\n",r}}class v{static genCodeContent(e){return d(this,arguments,void 0,function*(e,t="",r="/",n="",i="/"){const a=new u;return yield f.getOpenAPI(e,t).then(e=>{let t=f.parseModels(e),o=g.getDefaultExcludes();const s=g.dynamicImportOrExportModel("import",t,o);let l=g.genModelsSync(t,o,"class");l=y.getHeaderAnno("实体类信息","<a href='mailto:zuiwoxing@qq.com'>刘IT</a>")+l,a.models=l;let c=f.parseApi(e,i),p=g.genApis(r,n,c),u=y.getHeaderAnno("API接口信息","<a href='mailto:zuiwoxing@qq.com'>刘IT</a>"),d=u+s+"\n"+p;a.apis=d;let h="";"/"==r?h="":(h=r.replace("/",""),h=m.toPascalCase(h));let b=v.genIndexContent(h,t,o,c,n);return b=u+b,a.index=b,a})})}static genCodeToFile(e,t="",n="/",a="",o="/",s){s||(s="./auto-code"),n&&(s+=n),r.existsSync(s)||r.mkdirSync(s,{recursive:!0}),f.getOpenAPI(e,t).then(e=>{let t=f.parseModels(e),l=g.getDefaultExcludes();const c=g.dynamicImportOrExportModel("import",t,l);let p=g.genModelsSync(t,l,"class");if("string"==typeof s){p=y.getHeaderAnno("实体类信息","<a href='mailto:zuiwoxing@qq.com'>刘IT</a>")+p,r.writeFileSync(i.join(s,"models.ts"),p)}let u=f.parseApi(e,o),d=g.genApis(n,a,u);if("string"==typeof s){let e=y.getHeaderAnno("API接口信息","<a href='mailto:zuiwoxing@qq.com'>刘IT</a>")+c+"\n"+d;r.writeFileSync(i.join(s,"apis.ts"),e)}if("string"==typeof s){let e="";"/"==n?e="":(e=n.replace("/",""),e=m.toPascalCase(e));let o=v.genIndexContent(e,t,l,u,a);o=y.getHeaderAnno("API集合索引","<a href='mailto:zuiwoxing@qq.com'>刘IT</a>")+o,r.writeFileSync(i.join(s,"index.ts"),o)}})}static genIndexContent(e,t,r,n,i){let a="";a+='\nimport {IocContext} from "@liuit/core";\n';a+=g.dynamicImportOrExportModel("export",t,r)+"\n";return a+=g.dynamicImportOrExportApi("import",n,i)+"\n",a+=g.dynamicImportApis(e,n,i),a}}e.ApiTemplateUtil=g,e.CodeGenUtil=v,e.CodeInfo=u,e.Entity=c,e.EntityField=p,e.ReqBody=o,e.ReqParam=s,e.SwApi=l,e.SwaggerUtil=f});
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*@desc
|
|
3
|
+
*@author liudejian
|
|
4
|
+
*@date 2025-10-09 18:28
|
|
5
|
+
**/
|
|
6
|
+
export interface OpenAPI {
|
|
7
|
+
openapi: string;
|
|
8
|
+
info: {
|
|
9
|
+
title: string;
|
|
10
|
+
version: string;
|
|
11
|
+
};
|
|
12
|
+
paths: Record<string, Record<string, Operation>>;
|
|
13
|
+
components?: {
|
|
14
|
+
schemas?: Record<string, Schema>;
|
|
15
|
+
parameters?: Record<string, Parameter>;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export interface Operation {
|
|
19
|
+
operationId?: string;
|
|
20
|
+
summary?: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
parameters?: Parameter[];
|
|
23
|
+
requestBody?: {
|
|
24
|
+
content: Record<string, {
|
|
25
|
+
schema: Schema;
|
|
26
|
+
}>;
|
|
27
|
+
};
|
|
28
|
+
responses: Record<string, {
|
|
29
|
+
description: string;
|
|
30
|
+
content?: Record<string, {
|
|
31
|
+
schema: Schema;
|
|
32
|
+
}>;
|
|
33
|
+
}>;
|
|
34
|
+
tags?: string[];
|
|
35
|
+
}
|
|
36
|
+
export interface Parameter {
|
|
37
|
+
name: string;
|
|
38
|
+
in: 'query' | 'path' | 'header' | 'cookie';
|
|
39
|
+
required?: boolean;
|
|
40
|
+
schema: Schema;
|
|
41
|
+
description?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface Schema {
|
|
44
|
+
type?: string;
|
|
45
|
+
format?: string;
|
|
46
|
+
$ref?: string;
|
|
47
|
+
items?: Schema;
|
|
48
|
+
properties?: Record<string, Schema>;
|
|
49
|
+
required?: string[];
|
|
50
|
+
enum?: any[];
|
|
51
|
+
oneOf?: Schema[];
|
|
52
|
+
anyOf?: Schema[];
|
|
53
|
+
allOf?: Schema[];
|
|
54
|
+
description?: string;
|
|
55
|
+
title?: string;
|
|
56
|
+
}
|
|
57
|
+
export declare enum HttpMethod {
|
|
58
|
+
GET = "GET",
|
|
59
|
+
PUT = "PUT",
|
|
60
|
+
POST = "POST",
|
|
61
|
+
DELETE = "DELETE",
|
|
62
|
+
HEADER = "HEADER",
|
|
63
|
+
OPTIONS = "OPTIONS",
|
|
64
|
+
PATCH = "PATCH"
|
|
65
|
+
}
|
|
66
|
+
export declare class ReqBody {
|
|
67
|
+
/**
|
|
68
|
+
* body关联对象
|
|
69
|
+
*/
|
|
70
|
+
bodyName: string;
|
|
71
|
+
/**
|
|
72
|
+
* body类型(array|ref|basic)
|
|
73
|
+
*/
|
|
74
|
+
bodyType: string;
|
|
75
|
+
/**
|
|
76
|
+
* 是否必填
|
|
77
|
+
*/
|
|
78
|
+
required: boolean;
|
|
79
|
+
}
|
|
80
|
+
export declare class ReqParam {
|
|
81
|
+
/**
|
|
82
|
+
* 参数名称
|
|
83
|
+
*/
|
|
84
|
+
paramName: string;
|
|
85
|
+
/**
|
|
86
|
+
* 是否应用对象
|
|
87
|
+
*/
|
|
88
|
+
ref: boolean;
|
|
89
|
+
/**
|
|
90
|
+
* 参数类型
|
|
91
|
+
*/
|
|
92
|
+
paramType: string;
|
|
93
|
+
/**
|
|
94
|
+
* 格式化
|
|
95
|
+
*/
|
|
96
|
+
format: string;
|
|
97
|
+
/**
|
|
98
|
+
* 是否必填
|
|
99
|
+
*/
|
|
100
|
+
required: boolean;
|
|
101
|
+
/**
|
|
102
|
+
* 作用于 'query' | 'path' | 'header' | 'cookie'
|
|
103
|
+
*/
|
|
104
|
+
in: "query" | "path" | "header" | "cookie";
|
|
105
|
+
}
|
|
106
|
+
export declare class SwApi {
|
|
107
|
+
/**
|
|
108
|
+
* 业务域
|
|
109
|
+
*/
|
|
110
|
+
domain: string;
|
|
111
|
+
/**
|
|
112
|
+
* 路径
|
|
113
|
+
*/
|
|
114
|
+
path: string;
|
|
115
|
+
/**
|
|
116
|
+
* 请求方法
|
|
117
|
+
*/
|
|
118
|
+
method: HttpMethod;
|
|
119
|
+
/**
|
|
120
|
+
* API描述
|
|
121
|
+
*/
|
|
122
|
+
remark: string;
|
|
123
|
+
tag: string;
|
|
124
|
+
/**
|
|
125
|
+
* 操作ID
|
|
126
|
+
*/
|
|
127
|
+
operationId: string;
|
|
128
|
+
/**
|
|
129
|
+
* 请求对象
|
|
130
|
+
*/
|
|
131
|
+
reqBody: ReqBody;
|
|
132
|
+
/**
|
|
133
|
+
* 请求参数
|
|
134
|
+
*/
|
|
135
|
+
reqParams: Array<ReqParam>;
|
|
136
|
+
/**
|
|
137
|
+
* 响应对象类型
|
|
138
|
+
*/
|
|
139
|
+
responseType: string;
|
|
140
|
+
methodOf(method: string): HttpMethod;
|
|
141
|
+
/**
|
|
142
|
+
* 添加参数
|
|
143
|
+
* @param reqParam
|
|
144
|
+
* @return
|
|
145
|
+
*/
|
|
146
|
+
addParam(reqParam: ReqParam): SwApi;
|
|
147
|
+
}
|
|
148
|
+
export declare class Entity {
|
|
149
|
+
name: string;
|
|
150
|
+
title: string;
|
|
151
|
+
/**
|
|
152
|
+
* object/basic
|
|
153
|
+
*/
|
|
154
|
+
type: string;
|
|
155
|
+
entityFields: Array<EntityField>;
|
|
156
|
+
static of(name: string, title: string, type: string): Entity;
|
|
157
|
+
addField(ef: EntityField): Entity;
|
|
158
|
+
}
|
|
159
|
+
export declare class EntityField {
|
|
160
|
+
name: string;
|
|
161
|
+
title: string;
|
|
162
|
+
type: string;
|
|
163
|
+
format: string;
|
|
164
|
+
required: boolean;
|
|
165
|
+
maxLength?: number;
|
|
166
|
+
minLength?: number;
|
|
167
|
+
ref?: string;
|
|
168
|
+
static of(name: string, title: string, type: string, format: string, required: boolean, minLen?: number, maxLen?: number, ref?: string): EntityField;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* 代码信息
|
|
172
|
+
*/
|
|
173
|
+
export declare class CodeInfo {
|
|
174
|
+
models: string;
|
|
175
|
+
apis: string;
|
|
176
|
+
index: string;
|
|
177
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { Entity, SwApi } from "../model";
|
|
2
|
+
export type GenType = "class" | "interface";
|
|
3
|
+
/**
|
|
4
|
+
* https://liquid.mdn.cn/basics/introduction/ 模板介绍
|
|
5
|
+
*@desc API 模板工具
|
|
6
|
+
*@author liudejian
|
|
7
|
+
*@date 2025-10-14 17:10
|
|
8
|
+
**/
|
|
9
|
+
export declare class ApiTemplateUtil {
|
|
10
|
+
/**
|
|
11
|
+
* 获取默认 排除正则
|
|
12
|
+
*/
|
|
13
|
+
static getDefaultExcludes(): RegExp[];
|
|
14
|
+
/**
|
|
15
|
+
* https://liquid.mdn.cn/basics/introduction/
|
|
16
|
+
* @param genType
|
|
17
|
+
*/
|
|
18
|
+
static modelTemplate(genType?: GenType): string;
|
|
19
|
+
/**
|
|
20
|
+
* import {LoginLogBo} from "./models";
|
|
21
|
+
*/
|
|
22
|
+
static apiCommonImports(): string;
|
|
23
|
+
/**
|
|
24
|
+
* 动态导入|导出 的实体
|
|
25
|
+
* @param entities
|
|
26
|
+
* @param excludeRegs
|
|
27
|
+
*/
|
|
28
|
+
static dynamicImportOrExportModel(type: "import" | "export", entities: Array<Entity>, excludeRegs?: Array<RegExp>): string;
|
|
29
|
+
/**
|
|
30
|
+
* 动态导入或者导出API
|
|
31
|
+
* @param type
|
|
32
|
+
* @param apiMap
|
|
33
|
+
*/
|
|
34
|
+
static dynamicImportOrExportApi(type: "import" | "export", apiMap: Map<string, Array<SwApi>>, apiSuffix: string): string;
|
|
35
|
+
/**
|
|
36
|
+
* 动态导入API集合
|
|
37
|
+
* const SdApis = {
|
|
38
|
+
* LoginLogApi: IocContext.getBean<LoginLogApi>(LoginLogApi),
|
|
39
|
+
* }
|
|
40
|
+
* export {SdApis}
|
|
41
|
+
* @param apiMap
|
|
42
|
+
* @private
|
|
43
|
+
*/
|
|
44
|
+
static dynamicImportApis(contextPathName: string, apiMap: Map<string, Array<SwApi>>, apiSuffix: string): string;
|
|
45
|
+
private static firstWordUp;
|
|
46
|
+
/**
|
|
47
|
+
*
|
|
48
|
+
* @param baseUrl
|
|
49
|
+
* @param domain
|
|
50
|
+
* @param uriPrefix
|
|
51
|
+
* @param tag
|
|
52
|
+
* @param apis
|
|
53
|
+
* @param suffix API统一后缀【可选 】
|
|
54
|
+
* @param includeImport 是否包含import信息
|
|
55
|
+
*/
|
|
56
|
+
static genApi(baseUrl: string, domain: string, uriPrefix: string, tag: string, suffix: string, apis: Array<SwApi>, includeImport?: boolean): string;
|
|
57
|
+
/**
|
|
58
|
+
* 生成API
|
|
59
|
+
* @param baseUrl
|
|
60
|
+
* @param suffix API统一后缀 domain+suffix+Api
|
|
61
|
+
* @param apiMap
|
|
62
|
+
*/
|
|
63
|
+
static genApis(baseUrl: string, suffix: string, apiMap: Map<string, Array<SwApi>>): string;
|
|
64
|
+
/**
|
|
65
|
+
* 执行模板
|
|
66
|
+
* @param template 模板
|
|
67
|
+
* @param data 数据
|
|
68
|
+
*/
|
|
69
|
+
static execute(template: string, data: any): Promise<string>;
|
|
70
|
+
/**
|
|
71
|
+
* 同步执行
|
|
72
|
+
* @param template
|
|
73
|
+
* @param data
|
|
74
|
+
*/
|
|
75
|
+
static executeSync(template: string, data: any): string;
|
|
76
|
+
/**
|
|
77
|
+
* 过滤模型
|
|
78
|
+
* @param entities 实体列表
|
|
79
|
+
* @param excludePatterns 排除的实体
|
|
80
|
+
*/
|
|
81
|
+
static filterModels(entities: Array<Entity>, excludePatterns?: Array<RegExp>): Entity[];
|
|
82
|
+
/**
|
|
83
|
+
* 生成model
|
|
84
|
+
* @param entities 实体列表
|
|
85
|
+
* @param excludePatterns 排除的实体
|
|
86
|
+
* @param genType 生成的类型
|
|
87
|
+
*/
|
|
88
|
+
static genModels(entities: Array<Entity>, excludePatterns?: Array<RegExp>, genType?: GenType): Promise<string>;
|
|
89
|
+
static genModelsSync(entities: Array<Entity>, excludePatterns?: Array<RegExp>, genType?: GenType): string;
|
|
90
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { CodeInfo } from "../model";
|
|
2
|
+
/**
|
|
3
|
+
*@desc
|
|
4
|
+
*@author liudejian
|
|
5
|
+
*@date 2025-10-15 22:20
|
|
6
|
+
**/
|
|
7
|
+
export declare class CodeGenUtil {
|
|
8
|
+
/**
|
|
9
|
+
* 生成代码 返回 CodeInfo
|
|
10
|
+
* @param swaggerApiUrl swagger服务API地址
|
|
11
|
+
* @param token 令牌
|
|
12
|
+
* @param contextPath 上下文路径(前缀)
|
|
13
|
+
* @param apiSuffix API后缀 domain+apiSuffix+Api
|
|
14
|
+
* @param excludePrefix 需要排除的固定前缀(如 /api/gc)
|
|
15
|
+
*/
|
|
16
|
+
static genCodeContent(swaggerApiUrl: string, token?: string, contextPath?: string, apiSuffix?: string, excludePrefix?: string): Promise<CodeInfo>;
|
|
17
|
+
/**
|
|
18
|
+
* 生成代码 (默认生成代码 在 outputDir/contextPath 目录下 生成(models.ts,apis.ts,index.ts)三个文件)
|
|
19
|
+
* @param swaggerApiUrl swagger服务API地址
|
|
20
|
+
* @param token 令牌
|
|
21
|
+
* @param contextPath 上下文路径(前缀)
|
|
22
|
+
* @param apiSuffix API后缀 domain+apiSuffix+Api
|
|
23
|
+
* @param excludePrefix 需要排除的固定前缀(如 /api/gc)
|
|
24
|
+
* @param outputDir 输出文件夹(可根据模块输出,相对于本地目录。默认本地: auto-code)
|
|
25
|
+
*/
|
|
26
|
+
static genCodeToFile(swaggerApiUrl: string, token?: string, contextPath?: string, apiSuffix?: string, excludePrefix?: string, outputDir?: string): void;
|
|
27
|
+
/**
|
|
28
|
+
*
|
|
29
|
+
* @param contextPathName 上下文名称
|
|
30
|
+
* @param entities
|
|
31
|
+
* @param excludeRegs
|
|
32
|
+
* @param apiMap
|
|
33
|
+
* @param apiSuffix domain+apiSuffix+Api
|
|
34
|
+
* @private
|
|
35
|
+
*/
|
|
36
|
+
private static genIndexContent;
|
|
37
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*@desc
|
|
3
|
+
*@author liudejian
|
|
4
|
+
*@date 2025-11-14 11:09
|
|
5
|
+
**/
|
|
6
|
+
export default class DateUtil {
|
|
7
|
+
/**
|
|
8
|
+
* console.log(formatDate(new Date(), { year: 'numeric', month: 'long', day: 'numeric' }));
|
|
9
|
+
* // 输出:2025年11月14日
|
|
10
|
+
* 原生日期格式化(支持国际化)
|
|
11
|
+
* @param date 日期对象/时间戳/ISO字符串
|
|
12
|
+
* @param options 格式化配置
|
|
13
|
+
* @param locale 语言(默认中文:zh-CN)
|
|
14
|
+
* @returns 格式化后的字符串
|
|
15
|
+
*/
|
|
16
|
+
static formatDate(date: Date | number | string, options?: Intl.DateTimeFormatOptions, locale?: string | string[]): string;
|
|
17
|
+
/**
|
|
18
|
+
* 仅日期(yyyy-MM-dd)
|
|
19
|
+
* @param date
|
|
20
|
+
*/
|
|
21
|
+
static formatDateOnly(date: Date | number | string): string;
|
|
22
|
+
/**
|
|
23
|
+
* 仅时间(HH:mm:ss)
|
|
24
|
+
* @param date
|
|
25
|
+
*/
|
|
26
|
+
static formatTimeOnly(date: Date | number | string): string;
|
|
27
|
+
/**
|
|
28
|
+
* 带时区(yyyy-MM-dd HH:mm:ss (UTC+8))
|
|
29
|
+
* @param date
|
|
30
|
+
*/
|
|
31
|
+
static formatDateWithTimezone(date: Date | number | string): string;
|
|
32
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*@desc
|
|
3
|
+
*@author liudejian
|
|
4
|
+
*@date 2025-10-22 14:02
|
|
5
|
+
**/
|
|
6
|
+
export default class NameUtil {
|
|
7
|
+
private static splitWords;
|
|
8
|
+
/**
|
|
9
|
+
* 转帕斯卡:每个单词首字母大写,然后拼接
|
|
10
|
+
* @param str
|
|
11
|
+
*/
|
|
12
|
+
static toPascalCase(str: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* 转驼峰:首词小写,后续单词首字母大写,然后拼接
|
|
15
|
+
* @param str
|
|
16
|
+
*/
|
|
17
|
+
static toCamelCase(str: string): string;
|
|
18
|
+
static pascalToCamel(str: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* 移除符号以及尖括号<>
|
|
21
|
+
* @param str
|
|
22
|
+
*/
|
|
23
|
+
static removeSymbol(str: string): string;
|
|
24
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { Entity, OpenAPI, Schema, SwApi } from '../model';
|
|
2
|
+
/**
|
|
3
|
+
*@desc
|
|
4
|
+
*@author liudejian
|
|
5
|
+
*@date 2025-09-09 14:55
|
|
6
|
+
**/
|
|
7
|
+
export declare class SwaggerUtil {
|
|
8
|
+
/**
|
|
9
|
+
* 获取schema类型
|
|
10
|
+
* @param schema
|
|
11
|
+
* @param openapi
|
|
12
|
+
*/
|
|
13
|
+
static getSchemaType(schema: Schema): string;
|
|
14
|
+
/**
|
|
15
|
+
* 获取方法名
|
|
16
|
+
* @param path
|
|
17
|
+
* @param method
|
|
18
|
+
* @param operation
|
|
19
|
+
*/
|
|
20
|
+
private static getFunctionName;
|
|
21
|
+
/**
|
|
22
|
+
* 获取OPEN API
|
|
23
|
+
* @param swaggerUrl
|
|
24
|
+
* @param authToken
|
|
25
|
+
*/
|
|
26
|
+
static getOpenAPI(swaggerUrl: string, authToken?: string): Promise<OpenAPI>;
|
|
27
|
+
/**
|
|
28
|
+
* 返回Map
|
|
29
|
+
* @param openapi
|
|
30
|
+
*/
|
|
31
|
+
static parseModelToMap(openapi: OpenAPI): Map<string, Entity>;
|
|
32
|
+
/**
|
|
33
|
+
* 提取嵌套尖括号中最内部的字符(最内层类型)
|
|
34
|
+
* @param typeStr 嵌套尖括号字符串(如 "Response<Data<Long>>")
|
|
35
|
+
* @returns 最内层字符数组(可能多个同级最内层)
|
|
36
|
+
*/
|
|
37
|
+
static getInnermostGenerics(typeStr: string): string[];
|
|
38
|
+
/**
|
|
39
|
+
* 解析嵌套尖括号类型字符串,返回结构化的类型信息
|
|
40
|
+
* @param typeStr 嵌套尖括号类型字符串(如 "Response<Data<Long>>")
|
|
41
|
+
* @returns 结构化的类型信息,包含类型名称和子类型
|
|
42
|
+
*/
|
|
43
|
+
static parseNestedGenerics(typeStr: string): {
|
|
44
|
+
name: string;
|
|
45
|
+
children?: ReturnType<typeof SwaggerUtil.parseNestedGenerics>[];
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* 解析模型
|
|
49
|
+
* @param openapi
|
|
50
|
+
*/
|
|
51
|
+
static parseModels(openapi: OpenAPI): Array<Entity>;
|
|
52
|
+
/**
|
|
53
|
+
* 转换名称类型
|
|
54
|
+
* @param name
|
|
55
|
+
*/
|
|
56
|
+
static convertNameToType(name: string): string;
|
|
57
|
+
/**
|
|
58
|
+
* 解析模型
|
|
59
|
+
* @param schemaName
|
|
60
|
+
* @param schema
|
|
61
|
+
* @param openapi
|
|
62
|
+
*/
|
|
63
|
+
private static parseModel;
|
|
64
|
+
/**
|
|
65
|
+
* 过滤掉{xxx} 的路径
|
|
66
|
+
* @param pathAry
|
|
67
|
+
* @private
|
|
68
|
+
*/
|
|
69
|
+
private static filterPath;
|
|
70
|
+
/**
|
|
71
|
+
* 从多个 URL 路径中,提取公共根路径
|
|
72
|
+
* @param paths 路径数组
|
|
73
|
+
* @returns 相同的最长根路径
|
|
74
|
+
*/
|
|
75
|
+
static getCommonRootPath(paths: Array<string>): string;
|
|
76
|
+
/**
|
|
77
|
+
* 2. 获取【根路径之后的子路径】(去掉前面公共部分)
|
|
78
|
+
* @param rootPath 公共根路径
|
|
79
|
+
* @param fullPath 原始完整路径
|
|
80
|
+
* @returns 根路径后面的路径(不带前导斜杠)
|
|
81
|
+
*/
|
|
82
|
+
static getSubPathAfterRoot(rootPath: string, fullPath: string): string;
|
|
83
|
+
/**
|
|
84
|
+
* 生成路径映射 Map
|
|
85
|
+
* key: 公共根路径
|
|
86
|
+
* value: 公共根路径最后一段转帕斯卡命名=作用域
|
|
87
|
+
*/
|
|
88
|
+
/**
|
|
89
|
+
* 优化版:根据路径分组生成映射Map
|
|
90
|
+
* @param paths 路径数组
|
|
91
|
+
* @param excludePrefix 需要排除的固定前缀(如 /api/gc)
|
|
92
|
+
* @returns Map<完整公共路径, 帕斯卡命名>
|
|
93
|
+
*/
|
|
94
|
+
private static buildPathKeyMap;
|
|
95
|
+
/**
|
|
96
|
+
* 获取路径最后一段
|
|
97
|
+
*/
|
|
98
|
+
private static getLastPathSegment;
|
|
99
|
+
/**
|
|
100
|
+
* 根据完整路径,从公共路径映射Map中找到对应的作用域
|
|
101
|
+
* 匹配规则:path.startsWith(key),并自动选择【最长匹配】的前缀(最精准)
|
|
102
|
+
* @param pathMap Map<公共路径前缀, 作用域>
|
|
103
|
+
* @param fullPath 完整接口路径
|
|
104
|
+
* @returns 匹配到的作用域 | undefined
|
|
105
|
+
*/
|
|
106
|
+
static getDomainByPath(pathMap: Map<string, string>, fullPath: string): string;
|
|
107
|
+
/**
|
|
108
|
+
* 解析API
|
|
109
|
+
* @param openapi
|
|
110
|
+
* @param excludePrefix 需要排除的固定前缀(如 /api/gc)
|
|
111
|
+
* @return key=domain
|
|
112
|
+
* value=swaggerApi
|
|
113
|
+
*/
|
|
114
|
+
static parseApi(openapi: OpenAPI, excludePrefix: string): Map<string, Array<SwApi>>;
|
|
115
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@liuit/apigen",
|
|
3
|
+
"private": false,
|
|
4
|
+
"version": "0.0.2",
|
|
5
|
+
"description": "基于swagger生成API",
|
|
6
|
+
"main": "dist/index.esm.js",
|
|
7
|
+
"module": "dist/index.esm.js",
|
|
8
|
+
"unpkg": "dist/index.esm.js",
|
|
9
|
+
"jsdelivr": "dist/index.esm.js",
|
|
10
|
+
"types": "dist/index.d.ts",
|
|
11
|
+
"author": "ldj <zuiwoxing@qq.com>",
|
|
12
|
+
"license": "GNU AGPL v3",
|
|
13
|
+
"type": "module",
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"types",
|
|
17
|
+
"index.js"
|
|
18
|
+
],
|
|
19
|
+
"exports": {
|
|
20
|
+
".": [
|
|
21
|
+
{
|
|
22
|
+
"import": "./dist/index.esm.js",
|
|
23
|
+
"require": "./dist/index.esm.js",
|
|
24
|
+
"default": "./dist/index.esm.js"
|
|
25
|
+
},
|
|
26
|
+
"./dist/index.esm.js"
|
|
27
|
+
],
|
|
28
|
+
"./package.json": "./package.json"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"dev": "rollup --config rollup.config.dev.js",
|
|
32
|
+
"build": "rollup --config rollup.config.build.js"
|
|
33
|
+
},
|
|
34
|
+
"keywords": [
|
|
35
|
+
"tools",
|
|
36
|
+
"swagger-to-api"
|
|
37
|
+
],
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"@apidevtools/swagger-parser": "^12.0.0",
|
|
40
|
+
"@babel/core": "^7.18.6",
|
|
41
|
+
"@babel/plugin-external-helpers": "^7.18.6",
|
|
42
|
+
"@babel/plugin-transform-runtime": "^7.18.6",
|
|
43
|
+
"@babel/preset-env": "^7.18.6",
|
|
44
|
+
"@rollup/plugin-babel": "^5.3.1",
|
|
45
|
+
"axios": "^1.12.2",
|
|
46
|
+
"esno": "^0.17.0",
|
|
47
|
+
"liquidjs": "^10.22.0",
|
|
48
|
+
"openapi-types": "^12.1.3",
|
|
49
|
+
"path": "^0.12.7",
|
|
50
|
+
"reflect-metadata": "^0.2.2",
|
|
51
|
+
"rollup-plugin-node-builtins": "^2.1.2",
|
|
52
|
+
"rollup-plugin-node-globals": "^1.4.0"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@rollup/plugin-commonjs": "^24.0.1",
|
|
56
|
+
"@rollup/plugin-eslint": "^9.0.3",
|
|
57
|
+
"@rollup/plugin-json": "^6.0.0",
|
|
58
|
+
"@rollup/plugin-node-resolve": "^15.0.1",
|
|
59
|
+
"@rollup/plugin-terser": "^0.4.4",
|
|
60
|
+
"@rollup/plugin-typescript": "^11.0.0",
|
|
61
|
+
"@types/js-cookie": "^3.0.2",
|
|
62
|
+
"@types/jsrsasign": "^10.5.5",
|
|
63
|
+
"@types/node": "^24.7.2",
|
|
64
|
+
"@typescript-eslint/parser": "^6.12.0",
|
|
65
|
+
"core-js": "^3.34.0",
|
|
66
|
+
"eslint": "^8.32.0",
|
|
67
|
+
"eslint-plugin-prettier": "^4.2.1",
|
|
68
|
+
"prettier": "^2.8.3",
|
|
69
|
+
"rollup": "^3.29.4",
|
|
70
|
+
"rollup-plugin-auto-external": "^2.0.0",
|
|
71
|
+
"rollup-plugin-delete": "^2.0.0",
|
|
72
|
+
"rollup-plugin-dts": "^5.3.1",
|
|
73
|
+
"rollup-plugin-typescript2": "^0.36.0",
|
|
74
|
+
"tslib": "^2.6.2",
|
|
75
|
+
"typescript": "^5.3.3"
|
|
76
|
+
}
|
|
77
|
+
}
|