sy-api-pro 1.0.7 → 2.0.0

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 CHANGED
@@ -27,12 +27,13 @@ const config: ConfigModels = {
27
27
  projects: [
28
28
  {
29
29
  projectId: null, // apidocs, url的 projectId 部分(与 package.json scripts 中 --project-id 必须一致)
30
- branchId: null, // apidocs, url的 branchId 部分
30
+ // branchId: null, // apidocs, url的 branchId 部分(v2 已移除)
31
31
  outputDirName: '', // 默认为获取到的appName
32
- apiBaseName: '', //
32
+ apiBaseName: '', // string | RegExp
33
33
  creatBaseFile: true, // 生成基础文件 默认 true
34
34
  ignoreParamsDTO: [], // string[];
35
- deleteParentDTO: [], // (string | RegExp)[];
35
+ deleteParentDTO: [], // (string | RegExp)[]
36
+ resOnlyInclude: '', // string | RegExp;
36
37
  },
37
38
  ],
38
39
  apiHeaderTemplate: [], // api文件头部模版
package/bin/model.d.ts CHANGED
@@ -3,12 +3,13 @@ export interface ConfigModels {
3
3
  api: string;
4
4
  projects: {
5
5
  projectId: number | undefined;
6
- branchId: number | undefined;
6
+ // branchId: number | undefined;
7
7
  creatBaseFile?: boolean;
8
8
  outputDirName?: string;
9
9
  apiBaseName?: string | RegExp;
10
10
  ignoreParamsDTO?: string[];
11
11
  deleteParentDTO?: (string | RegExp)[];
12
+ resOnlyInclude?: string | RegExp;
12
13
  }[];
13
14
  apiHeaderTemplate?: string[];
14
15
  }
package/dist/index.umd.js CHANGED
@@ -1,13 +1,9 @@
1
- (function(w,q){typeof exports=="object"&&typeof module!="undefined"?q(require("axios")):typeof define=="function"&&define.amd?define(["axios"],q):(w=typeof globalThis!="undefined"?globalThis:w||self,q(w.axios))})(this,function(w){"use strict";var v=(w,q,B)=>new Promise((A,s)=>{var d=g=>{try{N(B.next(g))}catch(I){s(I)}},c=g=>{try{N(B.throw(g))}catch(I){s(I)}},N=g=>g.done?A(g.value):Promise.resolve(g.value).then(d,c);N((B=B.apply(w,q)).next())});const q=a=>{var h;const t=(a||"").toLowerCase(),o={int:"number",integer:"number",long:"number",bigdecimal:"number",float:"number",double:"number",localdatetime:"string",date:"string",char:"string",byte:"string",short:"string",character:"string",string:"string",multipartfile:"string",boolean:"boolean",void:"void"},{listType:l}=((h=new RegExp("^list<(?<listType>.+)>$").exec(t))==null?void 0:h.groups)||{};return l?`Array<${o[l]||"any"}>`:o[t]||"any"},B=require("chalk"),A=Object.freeze({_getDesc(a){const t=(a.title||"").trim();return t?` // ${t}`:""},getInterface:function({list:a,config:{ignoreParamsDTO:t,deleteParentDTO:o}}){const l=a.map((n,i)=>n.level===0?i:null).filter(n=>n!==null);return(l.length>0?l.concat(a.length).map((n,i,e)=>a.slice(n,e[i+1])):[a]).filter(n=>n.length).filter(n=>!t.includes(n[0].type)).map(n=>{const i=n[0];if(i.json){const e=i.json.split(`
2
- `);return e.forEach((p,y)=>{var r;const _=new RegExp('(?<space>\\s*)"(?<name>[a-zA-Z0-9]+)"\\s?:\\s*"(?<desc>[\\S\\s]*)"\\s*,?\\s*$');if(_.test(p)){const{space:b,name:$,desc:F}=((r=_.exec(p))==null?void 0:r.groups)||{},j=($||"").trim(),P=(F||"").trim(),z=n.filter(R=>{const M=(R.name||"").trim()+(R.title||"").trim();return JSON.stringify(M).replace(/^"([\s\S]+)"$/,"$1")===j+P});if(z.length>=1){const[{type:R}]=z,M=i.required?"?":"",L=P?` // ${P}`:"";e[y]=`${b+j+M}: ${q(R)};${L}`}else console.log(B.yellowBright(`【warning】${j} 的类型错误,请手动处理`))}else e[y]=e[y].replace(/(\s*)"([a-zA-Z0-9]+)"\s?(:\s*[\S\s]+)$/,"$1$2$3").replace(/([\S\s]*)\[\s+{$/,"$1Array<{").replace(/([\S\s]*)}\s*][\S\s]*$/,"$1}>;")}),o.some(p=>{const y=Object.prototype.toString.call(p);if(y==="[object RegExp]")return p.test(i.type);if(y==="[object String]")return p===i.type})?e.slice(1,-1).join(`
3
- `):[` ${i.name}${i.required?"":"?"}: {${this._getDesc(i)}`,...e.slice(1,-1).map(p=>` ${p}`)," };"].join(`
4
- `)}else return` ${i.name}${i.required?"":"?"}: ${q(i.type)};${this._getDesc(i)}`})}}),s=require("fs"),d=require("path"),c=require("chalk");w.interceptors.response.use(a=>{var t,o;return(o=(t=a.data)==null?void 0:t.head)!=null&&o.successful?a:Promise.reject(a)},a=>{throw a});const N=class{constructor(t){this.config={api:"",customMethodName:"",projectId:void 0,branchId:void 0,methodId:void 0,outputPath:"",outputDirName:"",apiBaseName:"",ignoreParamsDTO:[],deleteParentDTO:[],apiHeaderTemplate:[]},this.apiList=[],this.enums=[],Object.assign(this.config,t),this.getApiData()}getApiData(){return v(this,null,function*(){const{api:t,branchId:o,projectId:l,outputDirName:h,outputPath:n,methodId:i}=this.config;try{const{data:e}=yield w.get(`${t}/api/project/getProjectWithBranchById?id=${l}`);this.config.outputPath=d.join(process.cwd(),n,h||e.body.name);const m=e.body.branchList.find(y=>y.id===o);if(m)console.log(c.blueBright(`【info】正在使用 branchName: ${m.name} branchId: ${o} methodId: ${i}`));else throw c.red(`【error】branchId ${o} 不存在`);const p=yield w.get(`${t}/api/method/getMethodById?id=${i}`);this.apiList=[p.data.body]}catch(e){console.log(c.red("【error】: 接口获取异常")),console.log(e);return}try{yield this.checkApiOutputDir()}catch(e){console.log(c.red("【error】: 检查输出目录异常")),console.log(e);return}try{yield this.createFile()}catch(e){console.log(c.red("【error】: createFile 异常")),console.log(e)}})}checkApiOutputDir(){const{outputPath:t}=this.config;console.log(c.blueBright(`【info】输出目录 ${t}`));try{s.statSync(t,{bigint:!0})}catch(o){s.mkdirSync(t,{recursive:!0})}}creatBaseFile(){return v(this,null,function*(){const{outputPath:t}=this.config,o=d.join(__dirname,"../template/api"),l=s.readdirSync(o),h=s.readdirSync(t);for(const n of l)if(!h.includes(n))try{const i=s.readFileSync(d.join(o,n));s.writeFileSync(d.join(t,n),i)}catch(i){console.log(c.red("【error】: 基础文件生成异常")),console.log(i)}})}createFile(){return v(this,null,function*(){var h,n,i;const{apiBaseName:t,outputPath:o,customMethodName:l}=this.config;for(const e of this.apiList){const m=u=>u.replace(/(-[a-z])|(^[a-z])/g,f=>f.replace("-","").toLocaleUpperCase()),p=e.path.startsWith("/")?e.path:`/${e.path}`,y=typeof t=="string"?t.startsWith("/")?t:`/${t}`:t,_=p.replace(y,""),{apiDirName:r}=((h=new RegExp("(/)?(?<apiDirName>[a-zA-Z0-9_-]+)/.*$").exec(_))==null?void 0:h.groups)||{},b=l||e.name,$=m(`${r}-`+b);try{s.statSync(d.join(o,r)).isDirectory()}catch(u){s.mkdirSync(d.join(o,r))}let F="";try{F=s.readFileSync(d.join(o,r,"models.ts")).toString()}catch(u){s.writeFileSync(d.join(o,`./${r}/models.ts`),"")}let j=[],P=[];try{const u=A.getInterface({list:e.paramList||[],config:this.config});j=(n=e.paramList)!=null&&n.length&&u.length?[F?"":"/* ************************************************ */",`/** ${e.title} RequestModel */`,`export interface ${$}ReqModel {`,...u,"}",""]:[];const f=A.getInterface({list:e.returnList||[],config:this.config});P=(i=e.returnList)!=null&&i.length&&f.length?[j.length?"":"/* ************************************************ */",`/** ${e.title} ResponseModel */`,`export interface ${$}ResModel {`,...f,"}",""]:[]}catch(u){throw console.log(c.red(`【error】类型生成失败 projectId: ${this.config.projectId} methodId: ${e.id} path: ${p}`)),c.red(u)}F.includes(`export interface ${$}ReqModel {`)?console.log(c.yellowBright(`【warning】./${r}/models.ts 已存在 ${$}ReqModel`)):j.length&&(s.appendFileSync(d.join(o,`./${r}/models.ts`),j.join(`
5
- `)),console.log(c.greenBright(`【success】./${r}/models.ts 成功添加 ${$}ReqModel`))),F.includes(`export interface ${$}ResModel {`)?console.log(c.yellowBright(`【warning】./${r}/models.ts 已存在 ${$}ResModel`)):P.length&&(s.appendFileSync(d.join(o,`./${r}/models.ts`),P.join(`
6
- `)),console.log(c.greenBright(`【success】./${r}/models.ts 成功添加 ${$}ResModel`)));const M=[e.title&&` /** ${e.title} */`,` ${b}(${j.length?`params: M.${$}ReqModel`:""}) {`,` return axios.${e.method.toLowerCase()}<ApiResponse<${P.length?`M.${$}ResModel`:"any"}>>(`,` \`\${ApiPrefix}${p}\`,`,j.length&&` ${["post","put","patch"].includes(e.method.toLowerCase())?"params":"{ params }"},`," );"," },"].filter(Boolean);/^[a-zA-Z]+$/.test((e.method||"").trim())||console.log(c.yellowBright(`【warning】接口请求类型异常,请手动补全 method:${e.method} path: ${p} methodId: ${this.config.methodId} projectId: ${this.config.projectId}`));const L=`${m(r)}Api`;try{const u=s.readFileSync(d.join(o,r,"api.ts")).toString(),f=u.split(`
7
- `);if(!u.includes("import"))throw Error("null");if(u.includes(` ${b}(`)){const S=f.findIndex(x=>x.includes(` ${b}(`)),T=f.findIndex((x,k)=>k>S&&x===" },");console.log(c.yellowBright([`【warning】./${r}/api.ts 已存在api`,...f.slice(S,T+1).map(x=>` ${x}`)].join(`
8
- `))),console.log(c.yellowBright(`【warning】当前需要生成的 path ${p}, methodName 为 ${b}`))}else f.splice(f.map(S=>S.includes("}")).lastIndexOf(!0),0,M.join(`
9
- `)),s.writeFileSync(d.join(o,`./${r}/api.ts`),f.join(`
10
- `)),console.log(c.greenBright(`【success】./${r}/api.ts 成功添加 ${L}.${b}`))}catch(u){yield this.creatBaseFile();const f=["import { axios, ApiResponse } from '../axios';","","import * as M from './models';","import { ApiPrefix } from '../apiPrefix';","","export * from './models';"],{apiHeaderTemplate:S}=this.config;s.writeFileSync(d.join(o,`./${r}/api.ts`),[...S!=null&&S.length?S:f,"",`export const ${L} = {`,...M,"};",""].join(`
11
- `)),console.log(c.greenBright(`【success】./${r}/api.ts 成功添加 ${L}.${b}`));const T=s.readFileSync(d.join(o,"index.ts")).toString();if(!T.includes(`export * from './${r}/api'`)){const x=T.split(`
12
- `);x.push(`export * from './${r}/api';`);const k=x.slice(1).filter(Boolean);k.sort((C,E)=>C.localeCompare(E)),s.writeFileSync(d.join(o,"index.ts"),[x[0]||"","",...k,""].join(`
13
- `))}}}})}},g=require("fs"),I=require("path"),{program:O}=require("commander"),D=require("chalk");O.name("sy-api-pro").version(require(I.resolve(__dirname,"../package.json")).version),O.command("init").description("初始化配置文件").option("-p, --path <char>","","./src/apis").action((a,t,o)=>{const l=I.join(process.cwd(),a.path),h=I.join(l,".api-config.ts");try{if(g.existsSync(l)||g.mkdirSync(l),g.existsSync(h))return console.log(D.yellowBright(`【warning】: ${h} 配置文件已存在`));const n=g.readFileSync(I.join(__dirname,"../template/config/.api-config.ts"));g.writeFileSync(h,n),console.log(D.greenBright(`【success】: 配置文件已生成, 路径:${h}`))}catch(n){console.log(D.red("【error】: 配置文件生成异常")),console.log(n)}}),O.command("create").description("生成api文件及类型定义").requiredOption("-i, --id <id>","methodId").option("-n, --name <name>","customMethodName").requiredOption("--config <filePath>","configFilePath").requiredOption("--project-id <id>","projectId").action((a,t,o)=>{const{id:l,name:h,config:n,projectId:i}=a;if(!l||!/^\d+$/.test(l))throw D.red("【error】请传入正确的 id");const e=require(I.resolve(process.cwd(),n)),m=(e.projects||[]).find(p=>+p.projectId==+i);if(m){if(!m.branchId)throw D.red("【error】请传入正确的 branchId");if(!e.api)throw D.red("【error】请传入正确的 api");new N({api:e.api,methodId:l,customMethodName:h,outputPath:e.outputPath||"./src/apis",projectId:m.projectId,branchId:+m.branchId,outputDirName:m.outputDirName||"",apiBaseName:m.apiBaseName||"",ignoreParamsDTO:m.ignoreParamsDTO||[],deleteParentDTO:m.deleteParentDTO||[],apiHeaderTemplate:e.apiHeaderTemplate||[]})}else console.log(D.red(`【error】config 配置文件中 projects 未包含传入的 projectId ${i}`))}),O.parse()});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(require(`commander`),require(`chalk`),require(`axios`)):typeof define==`function`&&define.amd?define([`commander`,`chalk`,`axios`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.commander,e.chalk,e.axios))})(this,function(e,t,n){var r=Object.create,i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.getPrototypeOf,c=Object.prototype.hasOwnProperty,l=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),u=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var s=o(t),l=0,u=s.length,d;l<u;l++)d=s[l],!c.call(e,d)&&d!==n&&i(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(r=a(t,d))||r.enumerable});return e},d=(e,t,n)=>(n=e==null?{}:r(s(e)),u(t||!e||!e.__esModule?i(n,`default`,{value:e,enumerable:!0}):n,e));t=d(t),n=d(n);var f=d(l(((e,t)=>{t.exports={}}))()),p=e=>{var t;let n=(e||``).toLowerCase(),r={int:`number`,integer:`number`,long:`number`,bigdecimal:`number`,float:`number`,double:`number`,localdatetime:`string`,date:`string`,char:`string`,byte:`string`,short:`string`,character:`string`,string:`string`,multipartfile:`string`,boolean:`boolean`,void:`void`},{listType:i}=((t=RegExp(`^list<(?<listType>.+)>$`,``).exec(n))==null?void 0:t.groups)||{};return i?`Array<${r[i]||`any`}>`:r[n]||`any`},m=Object.freeze({getInterface:function({list:e,config:{ignoreParamsDTO:t,deleteParentDTO:n,resOnlyInclude:r},res:i=!1}){let a=e.filter(e=>!t.includes(e.name));if(n.length&&(a=a.flatMap(e=>n.some(t=>{let n=Object.prototype.toString.call(t);if(n===`[object RegExp]`)return t.test(e.oType);if(n===`[object String]`)return t===e.oType})||!e.name?(e==null?void 0:e.properties)||[]:[e])),i&&r){var o;a=((o=a.find(e=>{let t=Object.prototype.toString.call(r);if(t===`[object RegExp]`)return r.test(e.name);if(t===`[object String]`)return r===e.name}))==null?void 0:o.properties)||[]}let s=[],c=(e,t)=>{for(let r of e){var n;let e=Array(t).fill(` `).join(``),i=r.required?``:`?`,a=[`object`,`array`].includes(r.type)?`{`:p(r.type)+`;`;r.description&&s.push(`${e}/* ${r.description} */`),s.push(`${e+(r.name||`定义错误手动修改`)+i}: ${a}`),(n=r.properties)!=null&&n.length&&c(r.properties,t+1),[`object`,`array`].includes(r.type)&&([`array`].includes(r.type)?s.push(`${e}}[];`):s.push(`${e}};`))}};return c(a,1),s}}),h={red:(e,...n)=>{console.log(t.default.red(e),...n)},redBright:(e,...n)=>{console.log(t.default.redBright(e),...n)},bgRed:(e,...n)=>{console.log(t.default.bgRed(e),...n)},bgRedBright:(e,...n)=>{console.log(t.default.bgRedBright(e),...n)},blue:(e,...n)=>{console.log(t.default.blue(e),...n)},blueBright:(e,...n)=>{console.log(t.default.blueBright(e),...n)},bgBlue:(e,...n)=>{console.log(t.default.bgBlue(e),...n)},bgBlueBright:(e,...n)=>{console.log(t.default.bgBlueBright(e),...n)},yellow:(e,...n)=>{console.log(t.default.yellow(e),...n)},yellowBright:(e,...n)=>{console.log(t.default.yellowBright(e),...n)},bgYellow:(e,...n)=>{console.log(t.default.bgYellow(e),...n)},bgYellowBright:(e,...n)=>{console.log(t.default.bgYellowBright(e),...n)},green:(e,...n)=>{console.log(t.default.green(e),...n)},greenBright:(e,...n)=>{console.log(t.default.greenBright(e),...n)},bgGreen:(e,...n)=>{console.log(t.default.bgGreen(e),...n)},bgGreenBright:(e,...n)=>{console.log(t.default.bgGreenBright(e),...n)}};function g(e){"@babel/helpers - typeof";return g=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},g(e)}function _(e,t){if(g(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(g(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function v(e){var t=_(e,`string`);return g(t)==`symbol`?t:t+``}function y(e,t,n){return(t=v(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function b(e,t,n,r,i,a,o){try{var s=e[a](o),c=s.value}catch(e){n(e);return}s.done?t(c):Promise.resolve(c).then(r,i)}function x(e){return function(){var t=this,n=arguments;return new Promise(function(r,i){var a=e.apply(t,n);function o(e){b(a,r,i,o,s,`next`,e)}function s(e){b(a,r,i,o,s,`throw`,e)}o(void 0)})}}n.default.interceptors.response.use(e=>{var t;return((t=e.data)==null?void 0:t.errcode)==0?e:Promise.reject(e)},e=>{throw e});var S=class{constructor(e){y(this,`config`,{api:``,customMethodName:``,projectId:void 0,methodId:0,outputPath:``,outputDirName:``,apiBaseName:``,ignoreParamsDTO:[],deleteParentDTO:[],resOnlyInclude:``,apiHeaderTemplate:[]}),y(this,`apiList`,[]),y(this,`enums`,[]),Object.assign(this.config,e),this.getApiData()}getApiData(){var e=this;return x(function*(){let{api:t,projectId:r,outputPath:i,outputDirName:a,methodId:o}=e.config;try{let s=`${t}/api/project/getGenCodeDataV2?projectId=${r}`,{data:c}=yield n.default.get(s);if(e.config.outputPath=f.default.join(process.cwd(),i,a||c.data.project.appCode),e.apiList=c.data.apis.slice(0,50),!e.apiList.length){h.green(`apiPath:`,s),h.green(`methodId:`,o),h.red(`【error】: 未找到接口`);return}}catch(e){h.red(`【error】: 接口获取异常`),console.log(e);return}try{yield e.checkApiOutputDir()}catch(e){h.red(`【error】: 检查输出目录异常`),console.log(e);return}try{yield e.createFile()}catch(e){h.red(`【error】: createFile 异常`),console.log(e)}})()}checkApiOutputDir(){let{outputPath:e}=this.config;console.log(t.default.blueBright(`【info】输出目录 ${e}`));try{f.default.statSync(e,{bigint:!0})}catch(t){f.default.mkdirSync(e,{recursive:!0})}}creatBaseFile(){var e=this;return x(function*(){let{outputPath:t}=e.config,n=f.default.join(__dirname,`../template/api`),r=f.default.readdirSync(n),i=f.default.readdirSync(t);for(let e of r)if(!i.includes(e))try{let r=f.default.readFileSync(f.default.join(n,e));f.default.writeFileSync(f.default.join(t,e),r)}catch(e){h.red(`【error】: 基础文件生成异常`),console.log(e)}})()}createFile(){var e=this;return x(function*(){let{apiBaseName:n,outputPath:r,customMethodName:i}=e.config;for(let o of e.apiList){var a;let s=e=>e.replace(/(-[a-z])|(^[a-z])/g,e=>e.replace(`-`,``).toLocaleUpperCase()),c=o.path.startsWith(`/`)?o.path:`/${o.path}`,l=typeof n==`string`?n.startsWith(`/`)?n:`/${n}`:n,u=c.replace(l,``),{apiDirName:d}=((a=RegExp(`(/)?(?<apiDirName>[a-zA-Z0-9_-]+)`).exec(u))==null?void 0:a.groups)||{},p=JSON.parse(o.responseJson)[0],g=p.fullName.replace(p.oName,``).split(`.`).at(-4)||``,_=i||g;console.log(_);let v=s(`${d}-`+_);try{f.default.statSync(f.default.join(r,d)).isDirectory()}catch(e){f.default.mkdirSync(f.default.join(r,d))}let y=``;try{y=f.default.readFileSync(f.default.join(r,d,`models.ts`)).toString()}catch(e){f.default.writeFileSync(f.default.join(r,`./${d}/models.ts`),``)}let b=[],x=[];try{b=m.getInterface({list:JSON.parse(o.bodyJson||o.queryJson)||[],config:e.config}),x=m.getInterface({list:JSON.parse(o.responseJson)||[],config:e.config,res:!0}),[{name:`ReqModel`,list:b,isNewLine:!y},{name:`ResModel`,list:x,isNewLine:!b.length}].filter(e=>e.list.length).forEach(e=>{let n=v+e.name;y.includes(`export interface ${n} {`)?(console.log(Object.keys(t.default)),h.yellowBright(`【warning】./${d}/models.ts 已存在 ${n}`)):f.default.appendFileSync(f.default.join(r,`./${d}/models.ts`),[e.isNewLine?`/* ************************************************ */`:``,`/** ${o.title} ${e.name} */`,`export interface ${n} {`,...e.list,`}`,``].join(`
2
+ `))})}catch(n){throw h.red(`【error】类型生成失败 projectId: ${e.config.projectId} methodId: ${o._id} path: ${c}`),t.default.red(n)}let S=[o.title&&` /** ${o.title} */`,` ${_}(${b.length?`params: M.${v}ReqModel`:``}) {`,` return axios.${o.method.toLowerCase()}<ApiResponse<${x.length?`M.${v}ResModel`:`any`}>>(`,` \`\${ApiPrefix}${c}\`,`,b.length&&` ${[`post`,`put`,`patch`].includes(o.method.toLowerCase())?`params`:`{ params }`},`,` );`,` },`].filter(Boolean);/^[a-zA-Z]+$/.test((o.method||``).trim())||console.log(t.default.yellowBright(`【warning】接口请求类型异常,请手动补全 method:${o.method} path: ${c} methodId: ${e.config.methodId} projectId: ${e.config.projectId}`));let C=`${s(d)}Api`;try{let e=f.default.readFileSync(f.default.join(r,d,`api.ts`)).toString(),t=e.split(`
3
+ `);if(!e.includes(`import`))throw Error(`null`);if(e.includes(` ${_}(`)){let e=t.findIndex(e=>e.includes(` ${_}(`)),n=t.findIndex((t,n)=>n>e&&t===` },`);h.yellowBright([`【warning】./${d}/api.ts 已存在api`,...t.slice(e,n+1).map(e=>` ${e}`)].join(`
4
+ `)),h.yellowBright(`【warning】当前需要生成的 path ${c}, methodName ${_}`)}else t.splice(t.map(e=>e.includes(`}`)).lastIndexOf(!0),0,S.join(`
5
+ `)),f.default.writeFileSync(f.default.join(r,`./${d}/api.ts`),t.join(`
6
+ `)),h.greenBright(`【success】./${d}/api.ts 成功添加 ${C}.${_}`)}catch(t){yield e.creatBaseFile();let n=[`import { axios, ApiResponse } from '../axios';`,``,`import * as M from './models';`,`import { ApiPrefix } from '../apiPrefix';`,``,`export * from './models';`],{apiHeaderTemplate:i}=e.config;f.default.writeFileSync(f.default.join(r,`./${d}/api.ts`),[...i!=null&&i.length?i:n,``,`export const ${C} = {`,...S,`};`,``].join(`
7
+ `)),h.greenBright(`【success】./${d}/api.ts 成功添加 ${C}.${_}`);let a=f.default.readFileSync(f.default.join(r,`index.ts`)).toString();if(!a.includes(`export * from './${d}/api'`)){let e=a.split(`
8
+ `);e.push(`export * from './${d}/api\';`);let t=e.slice(1).filter(Boolean);t.sort((e,t)=>e.localeCompare(t)),f.default.writeFileSync(f.default.join(r,`index.ts`),[e[0]||``,``,...t,``].join(`
9
+ `))}}}})()}};e.program.name(`sy-api-pro`).version(require(f.default.resolve(__dirname,`../package.json`)).version),e.program.command(`init`).description(`初始化配置文件`).option(`-p, --path <char>`,``,`./src/apis`).action((e,n,r)=>{let i=f.default.join(process.cwd(),e.path),a=f.default.join(i,`.api-config.ts`);try{if(f.default.existsSync(i)||f.default.mkdirSync(i),f.default.existsSync(a))return console.log(t.default.yellowBright(`【warning】: ${a} 配置文件已存在`));let e=f.default.readFileSync(f.default.join(__dirname,`../template/config/.api-config.ts`));f.default.writeFileSync(a,e),console.log(t.default.greenBright(`【success】: 配置文件已生成, 路径:${a}`))}catch(e){console.log(t.default.red(`【error】: 配置文件生成异常`)),console.log(e)}}),e.program.command(`create`).description(`生成api文件及类型定义`).requiredOption(`-i, --id <id>`,`methodId`).option(`-n, --name <name>`,`customMethodName`).requiredOption(`--config <filePath>`,`configFilePath`).requiredOption(`--project-id <id>`,`projectId`).action((e,n,r)=>{let{id:i,name:a,config:o,projectId:s}=e;if(!i||!/^\d+$/.test(i))throw t.default.red(`【error】请传入正确的 id`);let c=require(f.default.resolve(process.cwd(),o)),l=(c.projects||[]).find(e=>+e.projectId==+s);if(l){if(!c.api)throw t.default.red(`【error】请传入正确的 api`);new S({api:c.api,methodId:i,customMethodName:a,outputPath:c.outputPath||`./src/apis`,projectId:l.projectId,outputDirName:l.outputDirName||``,apiBaseName:l.apiBaseName||``,ignoreParamsDTO:l.ignoreParamsDTO||[],deleteParentDTO:l.deleteParentDTO||[],resOnlyInclude:l.resOnlyInclude||``,apiHeaderTemplate:c.apiHeaderTemplate||[]})}else console.log(t.default.red(`【error】config 配置文件中 projects 未包含传入的 projectId ${s}`))}),e.program.parse()});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sy-api-pro",
3
- "version": "1.0.7",
3
+ "version": "2.0.0",
4
4
  "main": "./bin/index.ts",
5
5
  "types": "./bin/model.d.ts",
6
6
  "bin": {
@@ -22,25 +22,24 @@
22
22
  "scripts": {
23
23
  "build": "vite build",
24
24
  "api:init": "ts-node src/index.ts init -p ./src/dist/",
25
- "api0": "ts-node src/index.ts create --config ./src/.api-config.ts --project-id 801 -i 1885221",
26
- "api1": "ts-node src/index.ts create --config ./src/.api-config.ts --project-id 801 -i 1885357",
27
- "api2": "ts-node src/index.ts create --config ./src/.api-config.ts --project-id 801 -i 1758417",
28
- "api3": "ts-node src/index.ts create --config ./src/.api-config.ts --project-id 801 -i 199003",
25
+ "api0": "ts-node src/index.ts create --config ./src/.api-config.ts --project-id 4333 -i 747673",
26
+ "api1": "ts-node src/index.ts create --config ./src/.api-config.ts --project-id 832 -i 152457",
27
+ "api2": "ts-node src/index.ts create --config ./src/.api-config.ts --project-id 196 -i 149585",
29
28
  "test:dist-init": "ts-node bin/index.ts init -p ./src/dist/",
30
29
  "test:dist-create1": "ts-node bin/index.ts create --config ./src/dist/.api-config.ts --project-id 801 -i 1885221",
31
30
  "test:dist-create2": "ts-node bin/index.ts create --config ./src/dist/.api-config.ts --project-id 801 -i 1885357"
32
31
  },
33
32
  "description": "...",
34
33
  "dependencies": {
35
- "@types/node": "^20.12.12",
36
- "axios": "^1.6.8",
37
- "chalk": "4.1.2",
38
- "commander": "11.1.0",
34
+ "@types/node": "^25.5.0",
35
+ "axios": "^1.13.6",
36
+ "chalk": "5.6.2",
37
+ "commander": "14.0.3",
39
38
  "ts-node": "^10.9.2",
40
- "typescript": "^5.4.5"
39
+ "typescript": "^6.0.2"
41
40
  },
42
41
  "devDependencies": {
43
42
  "rollup-plugin-terser": "^7.0.2",
44
- "vite": "^5.2.11"
43
+ "vite": "^8.0.2"
45
44
  }
46
45
  }
package/tsconfig.json CHANGED
@@ -1,5 +1,8 @@
1
1
  {
2
2
  "compilerOptions": {
3
+ "types": ["node"], // 引入 Node.js 类型
4
+ // "moduleResolution": "node", // 使用 Node.js 模块解析策略
5
+ // "esModuleInterop": true, // 便于导入默认导出
3
6
  /* Visit https://aka.ms/tsconfig.json to read more about this file */
4
7
 
5
8
  /* Projects */
@@ -11,7 +14,7 @@
11
14
  // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
12
15
 
13
16
  /* Language and Environment */
14
- "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
17
+ "target": "esnext", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
15
18
  "lib": [
16
19
  "ES5",
17
20
  "ES6",