sy-api-pro 1.0.3 → 1.0.4

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.
Files changed (2) hide show
  1. package/dist/index.umd.js +10 -10
  2. package/package.json +2 -1
package/dist/index.umd.js CHANGED
@@ -1,13 +1,13 @@
1
- (function(y,b){typeof exports=="object"&&typeof module!="undefined"?b(require("axios")):typeof define=="function"&&define.amd?define(["axios"],b):(y=typeof globalThis!="undefined"?globalThis:y||self,b(y.axios))})(this,function(y){"use strict";var v=(y,b,P)=>new Promise((A,p)=>{var h=m=>{try{N(P.next(m))}catch(j){p(j)}},a=m=>{try{N(P.throw(m))}catch(j){p(j)}},N=m=>m.done?A(m.value):Promise.resolve(m.value).then(h,a);N((P=P.apply(y,b)).next())});const b=c=>{var t;const n=(c||"").toLowerCase(),i={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}=((t=new RegExp("^list<(?<listType>.+)>$").exec(n))==null?void 0:t.groups)||{};return l?`Array<${i[l]||"any"}>`:i[n]||"any"},P=require("chalk"),A=Object.freeze({_getDesc(c){const n=(c.title||"").trim();return n?` // ${n}`:""},getInterface:function({list:c,config:{ignoreParamsDTO:n,deleteParentDTO:i}}){const l=c.map((s,o)=>s.level===0&&!n.includes(s.type)?o:null).filter(s=>s!==null);return(l.length>0?l.concat(c.length).map((s,o,r)=>c.slice(s,r[o+1])):[c]).filter(s=>s.length).map(s=>{const o=s[0];if(o.json){const r=o.json.split(`
2
- `);return r.forEach((e,d)=>{var q;const u=new RegExp('(?<space>\\s*)"(?<name>[a-zA-Z0-9]+)"\\s?:\\s*"(?<desc>[\\S\\s]*)"\\s*,?\\s*$');if(u.test(e)){const{space:x,name:B,desc:z}=((q=u.exec(e))==null?void 0:q.groups)||{},F=(B||"").trim(),L=(z||"").trim(),M=c.filter(D=>{const R=(D.name||"").trim()+(D.title||"").trim();return JSON.stringify(R).replace(/^"([\s\S]+)"$/,"$1")===F+L});if(M.length>=1){const[{type:D}]=M,R=o.required?"?":"",T=L?` // ${L}`:"";r[d]=`${x+F+R}: ${b(D)};${T}`}else console.log(P.yellowBright(`【warning】${F} 的类型错误,请手动处理`))}else r[d]=r[d].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}>;")}),i.some(e=>{const d=Object.prototype.toString.call(e);if(d==="[object RegExp]")return e.test(o.type);if(d==="[object String]")return e===o.type})?r.slice(1,-1).join(`
1
+ (function(y,b){typeof exports=="object"&&typeof module!="undefined"?b(require("axios")):typeof define=="function"&&define.amd?define(["axios"],b):(y=typeof globalThis!="undefined"?globalThis:y||self,b(y.axios))})(this,function(y){"use strict";var v=(y,b,P)=>new Promise((A,p)=>{var h=m=>{try{N(P.next(m))}catch(j){p(j)}},c=m=>{try{N(P.throw(m))}catch(j){p(j)}},N=m=>m.done?A(m.value):Promise.resolve(m.value).then(h,c);N((P=P.apply(y,b)).next())});const b=a=>{var t;const n=(a||"").toLowerCase(),i={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}=((t=new RegExp("^list<(?<listType>.+)>$").exec(n))==null?void 0:t.groups)||{};return l?`Array<${i[l]||"any"}>`:i[n]||"any"},P=require("chalk"),A=Object.freeze({_getDesc(a){const n=(a.title||"").trim();return n?` // ${n}`:""},getInterface:function({list:a,config:{ignoreParamsDTO:n,deleteParentDTO:i}}){const l=a.map((s,o)=>s.level===0?o:null).filter(s=>s!==null);return(l.length>0?l.concat(a.length).map((s,o,r)=>a.slice(s,r[o+1])):[a]).filter(s=>s.length).filter(s=>!n.includes(s[0].type)).map(s=>{const o=s[0];if(o.json){const r=o.json.split(`
2
+ `);return r.forEach((e,d)=>{var q;const u=new RegExp('(?<space>\\s*)"(?<name>[a-zA-Z0-9]+)"\\s?:\\s*"(?<desc>[\\S\\s]*)"\\s*,?\\s*$');if(u.test(e)){const{space:x,name:B,desc:z}=((q=u.exec(e))==null?void 0:q.groups)||{},F=(B||"").trim(),M=(z||"").trim(),R=s.filter(D=>{const L=(D.name||"").trim()+(D.title||"").trim();return JSON.stringify(L).replace(/^"([\s\S]+)"$/,"$1")===F+M});if(R.length>=1){const[{type:D}]=R,L=o.required?"?":"",T=M?` // ${M}`:"";r[d]=`${x+F+L}: ${b(D)};${T}`}else console.log(P.yellowBright(`【warning】${F} 的类型错误,请手动处理`))}else r[d]=r[d].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}>;")}),i.some(e=>{const d=Object.prototype.toString.call(e);if(d==="[object RegExp]")return e.test(o.type);if(d==="[object String]")return e===o.type})?r.slice(1,-1).join(`
3
3
  `):[` ${o.name}${o.required?"":"?"}: {${this._getDesc(o)}`,...r.slice(1,-1).map(e=>` ${e}`)," };"].join(`
4
- `)}else return` ${o.name}${o.required?"":"?"}: ${b(o.type)};${this._getDesc(o)}`})}}),p=require("fs"),h=require("path"),a=require("chalk");y.interceptors.response.use(c=>{var n,i;return(i=(n=c.data)==null?void 0:n.head)!=null&&i.successful?c:Promise.reject(c)},c=>{throw c});const N=class{constructor(n){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,n),this.getApiData()}getApiData(){return v(this,null,function*(){const{api:n,branchId:i,projectId:l,outputDirName:t,outputPath:s,methodId:o}=this.config;try{const{data:r}=yield y.get(`${n}/api/project/getProjectWithBranchById?id=${l}`);this.config.outputPath=h.join(process.cwd(),s,t||r.body.name);const g=r.body.branchList.find(d=>d.id===i);if(g)console.log(a.blueBright(`【info】正在使用 branchName: ${g.name} branchId: ${i} methodId: ${o}`));else throw a.red(`【error】branchId ${i} 不存在`);const e=yield y.get(`${n}/api/method/getMethodById?id=${o}`);this.apiList=[e.data.body]}catch(r){console.log(a.red("【error】: 接口获取异常")),console.log(r);return}try{yield this.checkApiOutputDir()}catch(r){console.log(a.red("【error】: 检查输出目录异常")),console.log(r);return}try{yield this.createFile()}catch(r){console.log(a.red("【error】: createFile 异常")),console.log(r)}})}checkApiOutputDir(){const{outputPath:n}=this.config;console.log(a.blueBright(`【info】输出目录 ${n}`));try{p.statSync(n,{bigint:!0})}catch(i){p.mkdirSync(n,{recursive:!0})}}createFile(){return v(this,null,function*(){const{apiBaseName:n,outputPath:i,customMethodName:l}=this.config;this.apiList.forEach(t=>{var D,R,T;const s=f=>f.replace(/(-[a-z])|(^[a-z])/g,$=>$.replace("-","").toLocaleUpperCase()),o=t.path.startsWith("/")?t.path:`/${t.path}`,r=n.startsWith("/")?n:`/${n}`,g=new RegExp(`(${r})?(/)?(?<apiDirName>[a-zA-Z0-9_]+)/.*$`),{apiDirName:e}=((D=g.exec(o))==null?void 0:D.groups)||{},d=l||t.name,u=s(`${e}-`+d);try{p.statSync(h.join(i,e)).isDirectory()}catch(f){p.mkdirSync(h.join(i,e))}let q="";try{q=p.readFileSync(h.join(i,e,"models.ts")).toString()}catch(f){p.writeFileSync(h.join(i,`./${e}/models.ts`),"")}let x=[],B=[];try{const f=A.getInterface({list:t.paramList||[],config:this.config});x=(R=t.paramList)!=null&&R.length&&f.length?[q?"":"/* ************************************************ */",`/** ${t.title} RequestModel */`,`export interface ${u}ReqModel {`,...f,"}",""]:[];const $=A.getInterface({list:t.returnList||[],config:this.config});B=(T=t.returnList)!=null&&T.length&&$.length?[x.length?"":"/* ************************************************ */",`/** ${t.title} ResponseModel */`,`export interface ${u}ResModel {`,...$,"}",""]:[]}catch(f){throw console.log(a.red(`【error】类型生成失败 projectId: ${this.config.projectId} methodId: ${t.id} path: ${o}`)),a.red(f)}q.includes(`export interface ${u}ReqModel {`)?console.log(a.yellowBright(`【warning】./${e}/models.ts 已存在 ${u}ReqModel`)):x.length&&(p.appendFileSync(h.join(i,`./${e}/models.ts`),x.join(`
5
- `)),console.log(a.greenBright(`【success】./${e}/models.ts 成功添加 ${u}ReqModel`))),q.includes(`export interface ${u}ResModel {`)?console.log(a.yellowBright(`【warning】./${e}/models.ts 已存在 ${u}ResModel`)):B.length&&(p.appendFileSync(h.join(i,`./${e}/models.ts`),B.join(`
6
- `)),console.log(a.greenBright(`【success】./${e}/models.ts 成功添加 ${u}ResModel`)));const L=[t.title&&` /** ${t.title} */`,` ${d}(${x.length?`params: M.${u}ReqModel`:""}) {`,` return axios.${t.method.toLowerCase()}<ApiResponse<${B.length?`M.${u}ResModel`:"any"}>>(`,` \`\${ApiPrefix}${o}\`,`,x.length&&` ${["post","put","patch"].includes(t.method.toLowerCase())?"params":"{ params }"},`," );"," },"].filter(Boolean);/^[a-zA-Z]+$/.test((t.method||"").trim())||console.log(a.yellowBright(`【warning】接口请求类型异常,请手动补全 method:${t.method} path: ${o} methodId: ${this.config.methodId} projectId: ${this.config.projectId}`));const M=`${s(e)}Api`;try{const f=p.readFileSync(h.join(i,e,"api.ts")).toString(),$=f.split(`
7
- `);if(!f.includes("import"))throw Error("null");if(f.includes(` ${d}(`)){const w=$.findIndex(I=>I.includes(` ${d}(`)),_=$.findIndex((I,k)=>k>w&&I===" },");console.log(a.yellowBright([`【warning】./${e}/api.ts 已存在api`,...$.slice(w,_+1).map(I=>` ${I}`)].join(`
8
- `))),console.log(a.yellowBright(`【warning】当前需要生成的 path 为 ${o}, methodName 为 ${d}`))}else $.splice($.map(w=>w.includes("}")).lastIndexOf(!0),0,L.join(`
4
+ `)}else return` ${o.name}${o.required?"":"?"}: ${b(o.type)};${this._getDesc(o)}`})}}),p=require("fs"),h=require("path"),c=require("chalk");y.interceptors.response.use(a=>{var n,i;return(i=(n=a.data)==null?void 0:n.head)!=null&&i.successful?a:Promise.reject(a)},a=>{throw a});const N=class{constructor(n){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,n),this.getApiData()}getApiData(){return v(this,null,function*(){const{api:n,branchId:i,projectId:l,outputDirName:t,outputPath:s,methodId:o}=this.config;try{const{data:r}=yield y.get(`${n}/api/project/getProjectWithBranchById?id=${l}`);this.config.outputPath=h.join(process.cwd(),s,t||r.body.name);const g=r.body.branchList.find(d=>d.id===i);if(g)console.log(c.blueBright(`【info】正在使用 branchName: ${g.name} branchId: ${i} methodId: ${o}`));else throw c.red(`【error】branchId ${i} 不存在`);const e=yield y.get(`${n}/api/method/getMethodById?id=${o}`);this.apiList=[e.data.body]}catch(r){console.log(c.red("【error】: 接口获取异常")),console.log(r);return}try{yield this.checkApiOutputDir()}catch(r){console.log(c.red("【error】: 检查输出目录异常")),console.log(r);return}try{yield this.createFile()}catch(r){console.log(c.red("【error】: createFile 异常")),console.log(r)}})}checkApiOutputDir(){const{outputPath:n}=this.config;console.log(c.blueBright(`【info】输出目录 ${n}`));try{p.statSync(n,{bigint:!0})}catch(i){p.mkdirSync(n,{recursive:!0})}}createFile(){return v(this,null,function*(){const{apiBaseName:n,outputPath:i,customMethodName:l}=this.config;this.apiList.forEach(t=>{var D,L,T;const s=f=>f.replace(/(-[a-z])|(^[a-z])/g,$=>$.replace("-","").toLocaleUpperCase()),o=t.path.startsWith("/")?t.path:`/${t.path}`,r=n.startsWith("/")?n:`/${n}`,g=new RegExp(`(${r})?(/)?(?<apiDirName>[a-zA-Z0-9_]+)/.*$`),{apiDirName:e}=((D=g.exec(o))==null?void 0:D.groups)||{},d=l||t.name,u=s(`${e}-`+d);try{p.statSync(h.join(i,e)).isDirectory()}catch(f){p.mkdirSync(h.join(i,e))}let q="";try{q=p.readFileSync(h.join(i,e,"models.ts")).toString()}catch(f){p.writeFileSync(h.join(i,`./${e}/models.ts`),"")}let x=[],B=[];try{const f=A.getInterface({list:t.paramList||[],config:this.config});x=(L=t.paramList)!=null&&L.length&&f.length?[q?"":"/* ************************************************ */",`/** ${t.title} RequestModel */`,`export interface ${u}ReqModel {`,...f,"}",""]:[];const $=A.getInterface({list:t.returnList||[],config:this.config});B=(T=t.returnList)!=null&&T.length&&$.length?[x.length?"":"/* ************************************************ */",`/** ${t.title} ResponseModel */`,`export interface ${u}ResModel {`,...$,"}",""]:[]}catch(f){throw console.log(c.red(`【error】类型生成失败 projectId: ${this.config.projectId} methodId: ${t.id} path: ${o}`)),c.red(f)}q.includes(`export interface ${u}ReqModel {`)?console.log(c.yellowBright(`【warning】./${e}/models.ts 已存在 ${u}ReqModel`)):x.length&&(p.appendFileSync(h.join(i,`./${e}/models.ts`),x.join(`
5
+ `)),console.log(c.greenBright(`【success】./${e}/models.ts 成功添加 ${u}ReqModel`))),q.includes(`export interface ${u}ResModel {`)?console.log(c.yellowBright(`【warning】./${e}/models.ts 已存在 ${u}ResModel`)):B.length&&(p.appendFileSync(h.join(i,`./${e}/models.ts`),B.join(`
6
+ `)),console.log(c.greenBright(`【success】./${e}/models.ts 成功添加 ${u}ResModel`)));const M=[t.title&&` /** ${t.title} */`,` ${d}(${x.length?`params: M.${u}ReqModel`:""}) {`,` return axios.${t.method.toLowerCase()}<ApiResponse<${B.length?`M.${u}ResModel`:"any"}>>(`,` \`\${ApiPrefix}${o}\`,`,x.length&&` ${["post","put","patch"].includes(t.method.toLowerCase())?"params":"{ params }"},`," );"," },"].filter(Boolean);/^[a-zA-Z]+$/.test((t.method||"").trim())||console.log(c.yellowBright(`【warning】接口请求类型异常,请手动补全 method:${t.method} path: ${o} methodId: ${this.config.methodId} projectId: ${this.config.projectId}`));const R=`${s(e)}Api`;try{const f=p.readFileSync(h.join(i,e,"api.ts")).toString(),$=f.split(`
7
+ `);if(!f.includes("import"))throw Error("null");if(f.includes(` ${d}(`)){const w=$.findIndex(I=>I.includes(` ${d}(`)),_=$.findIndex((I,k)=>k>w&&I===" },");console.log(c.yellowBright([`【warning】./${e}/api.ts 已存在api`,...$.slice(w,_+1).map(I=>` ${I}`)].join(`
8
+ `))),console.log(c.yellowBright(`【warning】当前需要生成的 path 为 ${o}, methodName 为 ${d}`))}else $.splice($.map(w=>w.includes("}")).lastIndexOf(!0),0,M.join(`
9
9
  `)),p.writeFileSync(h.join(i,`./${e}/api.ts`),$.join(`
10
- `)),console.log(a.greenBright(`【success】./${e}/api.ts 成功添加 ${M}.${d}`))}catch(f){const $=["import { axios, ApiResponse } from '../axios';","","import * as M from './models';","import { ApiPrefix } from '../apiPrefix';","","export * from './models';"],{apiHeaderTemplate:w}=this.config;p.writeFileSync(h.join(i,`./${e}/api.ts`),[...w!=null&&w.length?w:$,"",`export const ${M} = {`,...L,"};",""].join(`
11
- `)),console.log(a.greenBright(`【success】./${e}/api.ts 成功添加 ${M}.${d}`));const _=p.readFileSync(h.join(i,"index.ts")).toString();if(!_.includes(`export * from './${e}/api'`)){const I=_.split(`
10
+ `)),console.log(c.greenBright(`【success】./${e}/api.ts 成功添加 ${R}.${d}`))}catch(f){const $=["import { axios, ApiResponse } from '../axios';","","import * as M from './models';","import { ApiPrefix } from '../apiPrefix';","","export * from './models';"],{apiHeaderTemplate:w}=this.config;p.writeFileSync(h.join(i,`./${e}/api.ts`),[...w!=null&&w.length?w:$,"",`export const ${R} = {`,...M,"};",""].join(`
11
+ `)),console.log(c.greenBright(`【success】./${e}/api.ts 成功添加 ${R}.${d}`));const _=p.readFileSync(h.join(i,"index.ts")).toString();if(!_.includes(`export * from './${e}/api'`)){const I=_.split(`
12
12
  `);I.push(`export * from './${e}/api';`);const k=I.slice(1).filter(Boolean);k.sort((C,E)=>C.localeCompare(E)),p.writeFileSync(h.join(i,"index.ts"),[I[0]||"","",...k,""].join(`
13
- `))}}})})}},m=require("fs"),j=require("path"),{program:O}=require("commander"),S=require("chalk");O.name("sy-api-pro").version(require(j.resolve(__dirname,"../package.json")).version),O.command("init").description("初始化配置文件").option("-p, --path <char>","","./src/apis").action((c,n,i)=>{const l=j.join(process.cwd(),c.path),t=j.join(l,".api-config.ts");try{if(m.existsSync(l)||m.mkdirSync(l),m.existsSync(t))return console.log(S.yellowBright(`【warning】: ${t} 配置文件已存在`));const s=m.readFileSync(j.join(__dirname,"../template/config/.api-config.ts"));m.writeFileSync(t,s),console.log(S.greenBright(`【success】: 配置文件已生成, 路径:${t}`))}catch(s){console.log(S.red("【error】: 配置文件生成异常")),console.log(s)}}),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((c,n,i)=>{const{id:l,name:t,config:s,projectId:o}=c;if(!l||!/^\d+$/.test(l))throw S.red("【error】请传入正确的 id");const r=require(j.resolve(process.cwd(),s)),g=(r.projects||[]).find(e=>+e.projectId==+o);if(g){if(!g.branchId)throw S.red("【error】请传入正确的 branchId");if(!r.api)throw S.red("【error】请传入正确的 api");new N({api:r.api,methodId:l,customMethodName:t,outputPath:r.outputPath||"./src/apis",projectId:g.projectId,branchId:+g.branchId,outputDirName:g.outputDirName||"",apiBaseName:g.apiBaseName||"",ignoreParamsDTO:g.ignoreParamsDTO||[],deleteParentDTO:g.deleteParentDTO||[],apiHeaderTemplate:r.apiHeaderTemplate||[]})}else console.log(S.red(`【error】config 配置文件中 projects 未包含传入的 projectId ${o}`))}),O.parse()});
13
+ `))}}})})}},m=require("fs"),j=require("path"),{program:O}=require("commander"),S=require("chalk");O.name("sy-api-pro").version(require(j.resolve(__dirname,"../package.json")).version),O.command("init").description("初始化配置文件").option("-p, --path <char>","","./src/apis").action((a,n,i)=>{const l=j.join(process.cwd(),a.path),t=j.join(l,".api-config.ts");try{if(m.existsSync(l)||m.mkdirSync(l),m.existsSync(t))return console.log(S.yellowBright(`【warning】: ${t} 配置文件已存在`));const s=m.readFileSync(j.join(__dirname,"../template/config/.api-config.ts"));m.writeFileSync(t,s),console.log(S.greenBright(`【success】: 配置文件已生成, 路径:${t}`))}catch(s){console.log(S.red("【error】: 配置文件生成异常")),console.log(s)}}),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,n,i)=>{const{id:l,name:t,config:s,projectId:o}=a;if(!l||!/^\d+$/.test(l))throw S.red("【error】请传入正确的 id");const r=require(j.resolve(process.cwd(),s)),g=(r.projects||[]).find(e=>+e.projectId==+o);if(g){if(!g.branchId)throw S.red("【error】请传入正确的 branchId");if(!r.api)throw S.red("【error】请传入正确的 api");new N({api:r.api,methodId:l,customMethodName:t,outputPath:r.outputPath||"./src/apis",projectId:g.projectId,branchId:+g.branchId,outputDirName:g.outputDirName||"",apiBaseName:g.apiBaseName||"",ignoreParamsDTO:g.ignoreParamsDTO||[],deleteParentDTO:g.deleteParentDTO||[],apiHeaderTemplate:r.apiHeaderTemplate||[]})}else console.log(S.red(`【error】config 配置文件中 projects 未包含传入的 projectId ${o}`))}),O.parse()});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sy-api-pro",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "main": "./bin/index.ts",
5
5
  "types": "./bin/model.d.ts",
6
6
  "bin": {
@@ -21,6 +21,7 @@
21
21
  ],
22
22
  "scripts": {
23
23
  "build": "vite build",
24
+ "api0": "ts-node src/index.ts create --config ./src/.api-config.ts --project-id 801 -i 1885221",
24
25
  "api1": "ts-node src/index.ts create --config ./src/.api-config.ts --project-id 801 -i 1885357",
25
26
  "api2": "ts-node src/index.ts create --config ./src/.api-config.ts --project-id 801 -i 1758417",
26
27
  "api3": "ts-node src/index.ts create --config ./src/.api-config.ts --project-id 801 -i 199003",