sy-api-pro 2.0.1 → 2.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 CHANGED
@@ -26,8 +26,7 @@ const config: ConfigModels = {
26
26
  api: 'http://xxx.com', //
27
27
  projects: [
28
28
  {
29
- projectId: null, // apidocs, url的 projectId 部分(与 package.json scripts 中 --project-id 必须一致)
30
- // branchId: null, // apidocs, url的 branchId 部分(v2 已移除)
29
+ projectId: null, // walle, url的 projectId 部分(与 package.json scripts 中 --project-id 必须一致)
31
30
  outputDirName: '', // 默认为获取到的appName
32
31
  apiBaseName: '', // string | RegExp
33
32
  creatBaseFile: true, // 生成基础文件 默认 true
package/dist/index.umd.js CHANGED
@@ -1,9 +1,9 @@
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.filter(e=>e._id==o),!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()});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(require(`fs`),require(`path`),require(`commander`),require(`chalk`),require(`axios`)):typeof define==`function`&&define.amd?define([`fs`,`path`,`commander`,`chalk`,`axios`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.fs,e.path,e.commander,e.chalk,e.axios))})(this,function(e,t,n,r,i){var a=Object.create,o=Object.defineProperty,s=Object.getOwnPropertyDescriptor,c=Object.getOwnPropertyNames,l=Object.getPrototypeOf,u=Object.prototype.hasOwnProperty,d=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=c(t),a=0,l=i.length,d;a<l;a++)d=i[a],!u.call(e,d)&&d!==n&&o(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(r=s(t,d))||r.enumerable});return e},f=(e,t,n)=>(n=e==null?{}:a(l(e)),d(t||!e||!e.__esModule?o(n,`default`,{value:e,enumerable:!0}):n,e));e=f(e),t=f(t),r=f(r),i=f(i);var 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,...t)=>{console.log(r.default.red(e),...t)},redBright:(e,...t)=>{console.log(r.default.redBright(e),...t)},bgRed:(e,...t)=>{console.log(r.default.bgRed(e),...t)},bgRedBright:(e,...t)=>{console.log(r.default.bgRedBright(e),...t)},blue:(e,...t)=>{console.log(r.default.blue(e),...t)},blueBright:(e,...t)=>{console.log(r.default.blueBright(e),...t)},bgBlue:(e,...t)=>{console.log(r.default.bgBlue(e),...t)},bgBlueBright:(e,...t)=>{console.log(r.default.bgBlueBright(e),...t)},yellow:(e,...t)=>{console.log(r.default.yellow(e),...t)},yellowBright:(e,...t)=>{console.log(r.default.yellowBright(e),...t)},bgYellow:(e,...t)=>{console.log(r.default.bgYellow(e),...t)},bgYellowBright:(e,...t)=>{console.log(r.default.bgYellowBright(e),...t)},green:(e,...t)=>{console.log(r.default.green(e),...t)},greenBright:(e,...t)=>{console.log(r.default.greenBright(e),...t)},bgGreen:(e,...t)=>{console.log(r.default.bgGreen(e),...t)},bgGreenBright:(e,...t)=>{console.log(r.default.bgGreenBright(e),...t)}};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)})}}i.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:n,projectId:r,outputPath:a,outputDirName:o,methodId:s}=e.config;try{let c=`${n}/api/project/getGenCodeDataV2?projectId=${r}`,{data:l}=yield i.default.get(c);if(e.config.outputPath=t.join(process.cwd(),a,o||l.data.project.appCode),e.apiList=l.data.apis.filter(e=>e._id==s),!e.apiList.length){h.green(`apiPath:`,c),h.green(`methodId:`,s),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:t}=this.config;console.log(r.default.blueBright(`【info】输出目录 ${t}`));try{e.default.statSync(t,{bigint:!0})}catch(n){e.default.mkdirSync(t,{recursive:!0})}}creatBaseFile(){var n=this;return x(function*(){let{outputPath:r}=n.config,i=t.join(__dirname,`../template/api`),a=e.default.readdirSync(i),o=e.default.readdirSync(r);for(let n of a)if(!o.includes(n))try{let a=e.default.readFileSync(t.join(i,n));e.default.writeFileSync(t.join(r,n),a)}catch(e){h.red(`【error】: 基础文件生成异常`),console.log(e)}})()}createFile(){var n=this;return x(function*(){let{apiBaseName:i,outputPath:a,customMethodName:o}=n.config;for(let c of n.apiList){var s;let l=e=>e.replace(/(-[a-z])|(^[a-z])/g,e=>e.replace(`-`,``).toLocaleUpperCase()),u=c.path.startsWith(`/`)?c.path:`/${c.path}`,d=typeof i==`string`?i.startsWith(`/`)?i:`/${i}`:i,f=u.replace(d,``),{apiDirName:p}=((s=RegExp(`(/)?(?<apiDirName>[a-zA-Z0-9_-]+)`).exec(f))==null?void 0:s.groups)||{},g=JSON.parse(c.responseJson)[0],_=g.fullName.replace(g.oName,``).split(`.`).at(-4)||``,v=o||_;console.log(v);let y=l(`${p}-`+v);try{e.default.statSync(t.join(a,p)).isDirectory()}catch(n){e.default.mkdirSync(t.join(a,p))}let b=``;try{b=e.default.readFileSync(t.join(a,p,`models.ts`)).toString()}catch(n){e.default.writeFileSync(t.join(a,`./${p}/models.ts`),``)}let x=[],S=[];try{x=m.getInterface({list:JSON.parse(c.bodyJson||c.queryJson)||[],config:n.config}),S=m.getInterface({list:JSON.parse(c.responseJson)||[],config:n.config,res:!0}),[{name:`ReqModel`,list:x,isNewLine:!b},{name:`ResModel`,list:S,isNewLine:!x.length}].filter(e=>e.list.length).forEach(n=>{let i=y+n.name;b.includes(`export interface ${i} {`)?(console.log(Object.keys(r.default)),h.yellowBright(`【warning】./${p}/models.ts 已存在 ${i}`)):e.default.appendFileSync(t.join(a,`./${p}/models.ts`),[n.isNewLine?`/* ************************************************ */`:``,`/** ${c.title} ${n.name} */`,`export interface ${i} {`,...n.list,`}`,``].join(`
2
+ `))})}catch(e){throw h.red(`【error】类型生成失败 projectId: ${n.config.projectId} methodId: ${c._id} path: ${u}`),r.default.red(e)}let C=[c.title&&` /** ${c.title} */`,` ${v}(${x.length?`params: M.${y}ReqModel`:``}) {`,` return axios.${c.method.toLowerCase()}<ApiResponse<${S.length?`M.${y}ResModel`:`any`}>>(`,` \`\${ApiPrefix}${u}\`,`,x.length&&` ${[`post`,`put`,`patch`].includes(c.method.toLowerCase())?`params`:`{ params }`},`,` );`,` },`].filter(Boolean);/^[a-zA-Z]+$/.test((c.method||``).trim())||console.log(r.default.yellowBright(`【warning】接口请求类型异常,请手动补全 method:${c.method} path: ${u} methodId: ${n.config.methodId} projectId: ${n.config.projectId}`));let w=`${l(p)}Api`;try{let n=e.default.readFileSync(t.join(a,p,`api.ts`)).toString(),r=n.split(`
3
+ `);if(!n.includes(`import`))throw Error(`null`);if(n.includes(` ${v}(`)){let e=r.findIndex(e=>e.includes(` ${v}(`)),t=r.findIndex((t,n)=>n>e&&t===` },`);h.yellowBright([`【warning】./${p}/api.ts 已存在api`,...r.slice(e,t+1).map(e=>` ${e}`)].join(`
4
+ `)),h.yellowBright(`【warning】当前需要生成的 path 为 ${u}, methodName 为 ${v}`)}else r.splice(r.map(e=>e.includes(`}`)).lastIndexOf(!0),0,C.join(`
5
+ `)),e.default.writeFileSync(t.join(a,`./${p}/api.ts`),r.join(`
6
+ `)),h.greenBright(`【success】./${p}/api.ts 成功添加 ${w}.${v}`)}catch(r){yield n.creatBaseFile();let i=[`import { axios, ApiResponse } from '../axios';`,``,`import * as M from './models';`,`import { ApiPrefix } from '../apiPrefix';`,``,`export * from './models';`],{apiHeaderTemplate:o}=n.config;e.default.writeFileSync(t.join(a,`./${p}/api.ts`),[...o!=null&&o.length?o:i,``,`export const ${w} = {`,...C,`};`,``].join(`
7
+ `)),h.greenBright(`【success】./${p}/api.ts 成功添加 ${w}.${v}`);let s=e.default.readFileSync(t.join(a,`index.ts`)).toString();if(!s.includes(`export * from './${p}/api'`)){let n=s.split(`
8
+ `);n.push(`export * from './${p}/api\';`);let r=n.slice(1).filter(Boolean);r.sort((e,t)=>e.localeCompare(t)),e.default.writeFileSync(t.join(a,`index.ts`),[n[0]||``,``,...r,``].join(`
9
+ `))}}}})()}};n.program.name(`sy-api-pro`).version(require(t.resolve(__dirname,`../package.json`)).version),n.program.command(`init`).description(`初始化配置文件`).option(`-p, --path <char>`,``,`./src/apis`).action((n,i,a)=>{let o=t.join(process.cwd(),n.path),s=t.join(o,`.api-config.ts`);try{if(e.default.existsSync(o)||e.default.mkdirSync(o),e.default.existsSync(s))return console.log(r.default.yellowBright(`【warning】: ${s} 配置文件已存在`));let n=e.default.readFileSync(t.join(__dirname,`../template/config/.api-config.ts`));e.default.writeFileSync(s,n),console.log(r.default.greenBright(`【success】: 配置文件已生成, 路径:${s}`))}catch(e){console.log(r.default.red(`【error】: 配置文件生成异常`)),console.log(e)}}),n.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,i)=>{let{id:a,name:o,config:s,projectId:c}=e;if(!a||!/^\d+$/.test(a))throw r.default.red(`【error】请传入正确的 id`);let l=require(t.resolve(process.cwd(),s)),u=(l.projects||[]).find(e=>+e.projectId==+c);if(u){if(!l.api)throw r.default.red(`【error】请传入正确的 api`);new S({api:l.api,methodId:a,customMethodName:o,outputPath:l.outputPath||`./src/apis`,projectId:u.projectId,outputDirName:u.outputDirName||``,apiBaseName:u.apiBaseName||``,ignoreParamsDTO:u.ignoreParamsDTO||[],deleteParentDTO:u.deleteParentDTO||[],resOnlyInclude:u.resOnlyInclude||``,apiHeaderTemplate:l.apiHeaderTemplate||[]})}else console.log(r.default.red(`【error】config 配置文件中 projects 未包含传入的 projectId ${c}`))}),n.program.parse()});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sy-api-pro",
3
- "version": "2.0.1",
3
+ "version": "2.0.2",
4
4
  "main": "./bin/index.ts",
5
5
  "types": "./bin/model.d.ts",
6
6
  "bin": {
@@ -25,14 +25,16 @@
25
25
  "api0": "ts-node src/index.ts create --config ./src/.api-config.ts --project-id 4333 -i 747673",
26
26
  "api1": "ts-node src/index.ts create --config ./src/.api-config.ts --project-id 832 -i 152457",
27
27
  "api2": "ts-node src/index.ts create --config ./src/.api-config.ts --project-id 196 -i 149585",
28
+ "api3": "ts-node src/index.ts create --config ./src/.api-config.ts --project-id 5386 -i 1273413",
28
29
  "test:dist-init": "ts-node bin/index.ts init -p ./src/dist/",
29
- "test:dist-create1": "ts-node bin/index.ts create --config ./src/dist/.api-config.ts --project-id 801 -i 1885221",
30
- "test:dist-create2": "ts-node bin/index.ts create --config ./src/dist/.api-config.ts --project-id 801 -i 1885357"
30
+ "test:dist-create1": "ts-node bin/index.ts create --config ./src/.api-config.ts --project-id 801 -i 1885221",
31
+ "test:dist-create2": "ts-node bin/index.ts create --config ./src/.api-config.ts --project-id 801 -i 1885357",
32
+ "test:dist-create3": "ts-node bin/index.ts create --config ./src/.api-config.ts --project-id 5386 -i 1273413"
31
33
  },
32
34
  "description": "...",
33
35
  "dependencies": {
34
- "@types/node": "^25.5.0",
35
- "axios": "^1.13.6",
36
+ "@types/node": "^25.5.2",
37
+ "axios": "^1.14.0",
36
38
  "chalk": "5.6.2",
37
39
  "commander": "14.0.3",
38
40
  "ts-node": "^10.9.2",
@@ -40,6 +42,6 @@
40
42
  },
41
43
  "devDependencies": {
42
44
  "rollup-plugin-terser": "^7.0.2",
43
- "vite": "^8.0.2"
45
+ "vite": "^8.0.5"
44
46
  }
45
47
  }
package/tsconfig.json CHANGED
@@ -1,8 +1,6 @@
1
1
  {
2
2
  "compilerOptions": {
3
- "types": ["node"], // 引入 Node.js 类型
4
- // "moduleResolution": "node", // 使用 Node.js 模块解析策略
5
- // "esModuleInterop": true, // 便于导入默认导出
3
+ "types": ["node"],
6
4
  /* Visit https://aka.ms/tsconfig.json to read more about this file */
7
5
 
8
6
  /* Projects */
@@ -14,71 +12,71 @@
14
12
  // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
15
13
 
16
14
  /* Language and Environment */
17
- "target": "esnext", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
18
- "lib": [
19
- "ES5",
20
- "ES6",
21
- "ES2015",
22
- "ES2015.Collection",
23
- "ES2015.Core",
24
- "ES2015.Generator",
25
- "ES2015.Iterable",
26
- "ES2015.Promise",
27
- "ES2015.Proxy",
28
- "ES2015.Reflect",
29
- "ES2015.Symbol.WellKnown",
30
- "ES2015.Symbol",
31
- "ES2016",
32
- "ES2016.Array.Include",
33
- "ES2017",
34
- "ES2017.Intl",
35
- "ES2017.Object",
36
- "ES2017.SharedMemory",
37
- "ES2017.String",
38
- "ES2017.TypedArrays",
39
- "ES2018",
40
- "ES2018.AsyncGenerator",
41
- "ES2018.AsyncIterable",
42
- "ES2018.Intl",
43
- "ES2018.Promise",
44
- "ES2018.Regexp",
45
- "ES2019",
46
- "ES2019.Array",
47
- "ES2019.Object",
48
- "ES2019.String",
49
- "ES2019.Symbol",
50
- "ES2020",
51
- "ES2020.BigInt",
52
- "ES2020.Promise",
53
- "ES2020.String",
54
- "ES2020.Symbol.WellKnown",
55
- "ESNext",
56
- "ESNext.Array",
57
- "ESNext.AsyncIterable",
58
- "ESNext.BigInt",
59
- "ESNext.Intl",
60
- "ESNext.Promise",
61
- "ESNext.String",
62
- "ESNext.Symbol",
63
- "DOM",
64
- "DOM.Iterable",
65
- "ScriptHost",
66
- "WebWorker",
67
- "WebWorker.ImportScripts",
68
- "Webworker.Iterable",
69
- "ES7",
70
- "ES2021",
71
- "ES2020.SharedMemory",
72
- "ES2020.Intl",
73
- "ES2021.Promise",
74
- "ES2021.String",
75
- "ES2021.WeakRef",
76
- "ESNext.WeakRef",
77
- "es2021.intl"
78
- ], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
15
+ "target": "esnext" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,
16
+ "lib": [
17
+ "ES5",
18
+ "ES6",
19
+ "ES2015",
20
+ "ES2015.Collection",
21
+ "ES2015.Core",
22
+ "ES2015.Generator",
23
+ "ES2015.Iterable",
24
+ "ES2015.Promise",
25
+ "ES2015.Proxy",
26
+ "ES2015.Reflect",
27
+ "ES2015.Symbol.WellKnown",
28
+ "ES2015.Symbol",
29
+ "ES2016",
30
+ "ES2016.Array.Include",
31
+ "ES2017",
32
+ "ES2017.Intl",
33
+ "ES2017.Object",
34
+ "ES2017.SharedMemory",
35
+ "ES2017.String",
36
+ "ES2017.TypedArrays",
37
+ "ES2018",
38
+ "ES2018.AsyncGenerator",
39
+ "ES2018.AsyncIterable",
40
+ "ES2018.Intl",
41
+ "ES2018.Promise",
42
+ "ES2018.Regexp",
43
+ "ES2019",
44
+ "ES2019.Array",
45
+ "ES2019.Object",
46
+ "ES2019.String",
47
+ "ES2019.Symbol",
48
+ "ES2020",
49
+ "ES2020.BigInt",
50
+ "ES2020.Promise",
51
+ "ES2020.String",
52
+ "ES2020.Symbol.WellKnown",
53
+ "ESNext",
54
+ "ESNext.Array",
55
+ "ESNext.AsyncIterable",
56
+ "ESNext.BigInt",
57
+ "ESNext.Intl",
58
+ "ESNext.Promise",
59
+ "ESNext.String",
60
+ "ESNext.Symbol",
61
+ "DOM",
62
+ "DOM.Iterable",
63
+ "ScriptHost",
64
+ "WebWorker",
65
+ "WebWorker.ImportScripts",
66
+ "Webworker.Iterable",
67
+ "ES7",
68
+ "ES2021",
69
+ "ES2020.SharedMemory",
70
+ "ES2020.Intl",
71
+ "ES2021.Promise",
72
+ "ES2021.String",
73
+ "ES2021.WeakRef",
74
+ "ESNext.WeakRef",
75
+ "es2021.intl"
76
+ ] /* Specify a set of bundled library declaration files that describe the target runtime environment. */,
79
77
  // "jsx": "preserve", /* Specify what JSX code is generated. */
80
- "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */
81
- "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
78
+ "experimentalDecorators": true /* Enable experimental support for TC39 stage 2 draft decorators. */,
79
+ "emitDecoratorMetadata": true /* Emit design-type metadata for decorated declarations in source files. */,
82
80
  // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */
83
81
  // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
84
82
  // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */
@@ -87,9 +85,9 @@
87
85
  // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
88
86
 
89
87
  /* Modules */
90
- "module": "commonjs", /* Specify what module code is generated. */
88
+ "module": "commonjs" /* Specify what module code is generated. */,
91
89
  // "rootDir": "./", /* Specify the root folder within your source files. */
92
- "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */
90
+ "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */,
93
91
  // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
94
92
  // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
95
93
  // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
@@ -105,7 +103,7 @@
105
103
  // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */
106
104
 
107
105
  /* Emit */
108
- "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
106
+ "declaration": true /* Generate .d.ts files from TypeScript and JavaScript files in your project. */,
109
107
  // "declarationMap": true, /* Create sourcemaps for d.ts files. */
110
108
  // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
111
109
  // "sourceMap": true, /* Create source map files for emitted JavaScript files. */
@@ -132,12 +130,12 @@
132
130
  /* Interop Constraints */
133
131
  // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
134
132
  // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
135
- "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */
133
+ "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */,
136
134
  // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
137
- "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
135
+ "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
138
136
 
139
137
  /* Type Checking */
140
- "strict": true, /* Enable all strict type-checking options. */
138
+ "strict": true /* Enable all strict type-checking options. */,
141
139
  // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */
142
140
  // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */
143
141
  // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
@@ -159,6 +157,6 @@
159
157
 
160
158
  /* Completeness */
161
159
  // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
162
- "skipLibCheck": true /* Skip type checking all .d.ts files. */
160
+ "skipLibCheck": true /* Skip type checking all .d.ts files. */
163
161
  }
164
162
  }