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 +4 -3
- package/bin/model.d.ts +2 -1
- package/dist/index.umd.js +9 -13
- package/package.json +10 -11
- package/tsconfig.json +4 -1
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(
|
|
2
|
-
`)
|
|
3
|
-
`)
|
|
4
|
-
`)
|
|
5
|
-
`)),
|
|
6
|
-
`)),
|
|
7
|
-
`)
|
|
8
|
-
`)
|
|
9
|
-
`)),
|
|
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": "
|
|
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
|
|
26
|
-
"api1": "ts-node src/index.ts create --config ./src/.api-config.ts --project-id
|
|
27
|
-
"api2": "ts-node src/index.ts create --config ./src/.api-config.ts --project-id
|
|
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": "^
|
|
36
|
-
"axios": "^1.6
|
|
37
|
-
"chalk": "
|
|
38
|
-
"commander": "
|
|
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": "^
|
|
39
|
+
"typescript": "^6.0.2"
|
|
41
40
|
},
|
|
42
41
|
"devDependencies": {
|
|
43
42
|
"rollup-plugin-terser": "^7.0.2",
|
|
44
|
-
"vite": "^
|
|
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": "
|
|
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",
|