cli-z-develop 0.0.40 → 0.0.43

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.js +1 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{program as e}from"commander";import t from"chalk";import i from"shelljs";import n from"fs-extra";import s from"minimist";import r from"node:fs";import o from"node:path";import a,{AxiosError as c}from"axios";import l from"dayjs";import u from"node:os";import d from"child_process";import p from"inquirer";import m from"inquirer/lib/prompts/base.js";import f from"inquirer/lib/utils/paginator.js";import h from"inquirer/lib/utils/events.js";import"inquirer/lib/objects/choices.js";import{map as g,takeUntil as y,filter as v}from"rxjs";import b from"figures";import j from"ora";import $ from"lint-staged";var k={name:"cli-z-develop",version:"0.0.40",description:"前端本地开发命令行工具",main:"dist/index.js",bin:{z:"bin/z.js","z-develop":"bin/z.js"},scripts:{prepare:"husky",dev:"rollup -c -w --environment DEBUG:true",build:"rollup -c",eslint:"eslint '**/*.{ts,js}' --fix",prettier:"prettier -wu .",upload:"npm version patch && npm run build && npm publish --access public --registry https://registry.npmjs.org/"},type:"module",repository:{type:"git",url:"http://git.cxlqd.com/fe-base/cli-z-develop.git"},author:"z",devDependencies:{"@commitlint/cli":"^19.3.0","@commitlint/config-conventional":"^19.2.2","@rollup/plugin-json":"^6.1.0","@rollup/plugin-node-resolve":"^15.2.3","@rollup/plugin-replace":"^5.0.7","@rollup/plugin-terser":"^0.4.4","@types/fs-extra":"^11.0.4","@types/inquirer":"^9.0.7","@types/minimist":"^1.2.5","@types/node":"^20.14.9","@types/shelljs":"^0.8.15","@types/tough-cookie":"^4.0.5","@typescript-eslint/eslint-plugin":"^7.14.1","@typescript-eslint/parser":"^7.14.1",eslint:"^8.57.0","eslint-config-alloy":"^5.1.2","eslint-config-prettier":"^9.1.0",husky:"^9.0.11",prettier:"^3.3.2",rollup:"^4.18.0","rollup-plugin-typescript2":"^0.36.0",tslib:"^2.6.3",typescript:"^5.5.2"},dependencies:{"@inquirer/prompts":"^5.1.0",axios:"^1.7.2",chalk:"^5.3.0",commander:"^12.1.0",dayjs:"^1.11.11",figures:"^6.1.0","fs-extra":"^11.2.0",inquirer:"9.3.1","lint-staged":"^15.2.7",minimist:"^1.2.8",ora:"^8.0.1",rxjs:"^7.8.1",shelljs:"^0.8.5"}};function w(e,t,i,n){return new(i||(i=Promise))((function(s,r){function o(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,a)}c((n=n.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;const x='{\n "printWidth": 120,\n "tabWidth": 2,\n "useTabs": false,\n "semi": true,\n "singleQuote": false,\n "quoteProps": "as-needed",\n "jsxSingleQuote": false,\n "trailingComma": "all",\n "bracketSpacing": true,\n "bracketSameLine": false,\n "arrowParens": "always",\n "requirePragma": false,\n "insertPragma": false,\n "proseWrap": "preserve",\n "htmlWhitespaceSensitivity": "css",\n "vueIndentScriptAndStyle": false,\n "endOfLine": "lf",\n "embeddedLanguageFormatting": "auto",\n "singleAttributePerLine": false\n}\n',S="# 系统 信息文件\n.DS_Store/\nThumbs.db\n\n# 编辑器配置文件\n.idea/\n.vscode/\n\n# 输出目录\ndist/\n\n# Log files\n*.log\n\n# 本地配置文件\n*.local\n\n# 缓存文件\n*.cache\n\n# 垃圾文件\n.Trashes\n",z={Java:{"**/*.{java}":"./run.sh pmd -d ../../../src/main/java/ -f text -R rulesets/java/quickstart.xml"},JavaScript:{"**/*.{vue,js,jsx,cjs,mjs,ts,tsx,cts,mts}":"eslint --fix","*":"prettier -wu"}},N=".z",O="develop-config.json",E=".z",T=".commit-msg-tpl",_="project.json",q=[{name:"开发环境 - dev",value:"dev"},{name:"测试环境 - test",value:"test"},{name:"预发环境 - release",value:"release"},{name:"正式环境 - production",value:"production"}],D=[{name:"网页 - h5",value:"h5"},{name:"依赖包 - npm",value:"npm"}],C=["master","dev","test","release"],I={1:"研发",2:"测试",3:"产品",4:"设计",5:"运营",6:"销售",7:"行政",8:"财务",9:"其他"},P="http://git.cxlqd.com",A={PROJECT_NAME:"fe-pages-tpl",GIT_URL:`${P}/fe-component/fe-pages-tpl.git`},L=["fe-biz","fe-base","fe-tpl","fe-component","fe-demo"],U="fe-biz7tvsd";function B(e=""){return o.join(E,e)}function J(){return B(_)}function W(){return B(T)}function R(){d.spawnSync("git",["config","core.hooksPath",B()]),d.spawnSync("git",["config","commit.template",W()])}function K(e=""){return o.resolve(u.homedir(),N,e)}function F(){return K(O)}function M(){return r.existsSync(K())&&r.existsSync(F())}const{red:V,green:G,blue:H,magenta:Q}=t;function Z(...e){console.log(G(...e))}function Y(e,t=!1){let i=e;e instanceof Error?(i=e.message,a.isAxiosError(e)&&(i=`请求失败:${e.message}`),console.log(V(i)),console.log(Q(e.stack))):console.log(V(e)),t||process.exit(1)}function X(e){return!!r.existsSync(e)&&r.lstatSync(e).isDirectory()}function ee(e=process.cwd()){if(X(e)){return r.readdirSync(e).filter((t=>X(o.resolve(e,t))))}return[]}function te(e=process.cwd()){if(X(e)){return r.readdirSync(e).filter((t=>!X(o.resolve(e,t))))}return[]}function ie(e){return w(this,arguments,void 0,(function*(e,t={removeTailLinkBreak:!0,silent:!0}){let n=yield new Promise(((n,s)=>{try{n(i.exec(e,{silent:t.silent}))}catch(e){s(e)}}));return n=n.toString(),t.removeTailLinkBreak&&(n=n.replace(/\n$/,"")),n}))}function ne(){return l(Date.now()).format("YYMMDD")}function se(){r.existsSync(B())||Y("当前不在项目根目录。请切换到项目根目录")}function re(){r.existsSync(o.resolve(".git"))||Y("当前不是git项目根目录,请先执行git init,或切换到根目录")}function oe(){return w(this,void 0,void 0,(function*(){""!==(yield ie("git status -s"))&&Y("请先提交代码变动,再进行操作")}))}function ae(e){return["fe-biz"].includes(e)}const ce={profile:{ldapAccount:"",ldapPassword:"",gitToken:"",gitUserId:0,gitName:"",gitEnglishName:"",gitEmail:"",weWorkName:"",weWorkUserId:"",jobType:"fe",zenTaoToken:"",k8sToken:""},main:{version:k.version,latestCheckVersionTimestamp:0,versionCheckDuring:3,weWorkListCache:[]},constants:{ZenTaoDomain:"",K8sDomain:"",FEServerDomain:""}};function le(e,t){void 0!==t?ce.profile[e]=t:ce.profile=Object.assign(Object.assign({},ce.profile),e)}function ue(e,t){ce.constants=Object.assign(Object.assign({},ce.constants),e)}function de(e,t){void 0!==t?ce.main[e]=t:ce.main=Object.assign(Object.assign({},ce.main),e)}function pe(e){return e?ce.profile[e]:ce.profile}function me(e){return e?ce.main[e]:ce.main}function fe(e){return e?ce.constants[e]:ce.constants}let he=null,ge=null;function ye(){if(he)return he;const e=o.join("package.json");return r.existsSync(e)||Y(`当前目录(${i.pwd()})不存在${e}文件,请在项目根目录执行该命令。`),he=n.readJsonSync(e),he}function ve(){if(ge)return ge;const e=J();return r.existsSync(e)||Y(`当前目录(${i.pwd()})不存在${e}文件,请在项目根目录执行该命令,或者初始化项目(z init .)。`),ge=n.readJsonSync(e),ge}function be(e){ge=ge?Object.assign(Object.assign({},ge),e):e,n.writeJSONSync(J(),ge,{spaces:2})}const je={id:0,name:"",group:"",sourceBranch:"",mergeRequestUrl:""};function $e(){return w(this,void 0,void 0,(function*(){if(!je.name){const e=ye();je.name=e.name}if(!je.group){const e=ve();e.repository.group&&(je.group=e.repository.group)}if(!je.id)try{const e=je.group?`${je.group}/${je.name}`:je.name,[t]=yield Ae(e);je.mergeRequestUrl=t.web_url+"/merge_requests",je.id=t.id,je.group=t.namespace.path;const i=ve();i.repository.group||be({repository:Object.assign(Object.assign({},i.repository),{group:t.namespace.path})})}catch(e){Y(e)}return je.sourceBranch||(je.sourceBranch=yield ie("git branch --show-current")),je}))}function ke(){n.writeJSONSync(F(),{main:me(),profile:pe(),constants:fe()},{spaces:2})}function we(e){return w(this,void 0,void 0,(function*(){const t=K(),n=process.cwd(),s=o.join(t,A.PROJECT_NAME);r.existsSync(s)?(i.cd(s),yield ie("git pull"),i.cd(n)):(i.cd(t),yield ie(`git clone ${A.GIT_URL} --depth=1`),i.cd(n));const a=o.join(s,"src",e);return r.existsSync(a)||Y("模板库错误!"),a}))}function xe(e){return e.split("-").map((e=>e.charAt(0).toUpperCase()+e.slice(1))).join("")}function Se(e,t){const i=r.readFileSync(e,"utf-8"),n=t.replace(/\//g,"-"),s=i.replace(/name: "-_-NAME-_-"/g,`name: "${xe(n)}"`).replace(/class="-_-NAME-_-"/g,`class="${n}"`).replace(/.-_-NAME-_-/g,`.${n}`);r.writeFileSync(e,s,"utf-8")}function ze(e){return w(this,void 0,void 0,(function*(){var i;const n=e.method||"get",s=e.headers||{},r=e.data||{},o=e.dataKey||["GET","get"].includes(n)?"params":"data";try{const i={url:e.url,method:n,[o]:r,headers:s};t.magenta(i.method.toUpperCase()),t.yellow(i.url),JSON.stringify(i.headers),t.gray(JSON.stringify(i[o],null,2));const c=yield a(i);return t.green("Response"),t.grey(JSON.stringify(c.data,null,2)),Promise.resolve(c.data)}catch(e){return e instanceof c&&(t.red("Error"),t.grey(JSON.stringify(null===(i=null==e?void 0:e.response)||void 0===i?void 0:i.data))),Promise.reject(e)}}))}function Ne(){return w(this,void 0,void 0,(function*(){const e=pe("gitToken");if(e)return e;{const{access_token:e}=yield ze({url:`${P}/oauth/token`,method:"post",data:{grant_type:"password",username:pe("ldapAccount"),password:pe("ldapPassword")}}),t=`Bearer ${e}`;return le("gitToken",t),ke(),t}}))}function Oe(e){return w(this,void 0,void 0,(function*(){return ze(Object.assign(Object.assign({},e),{headers:{Authorization:yield Ne()}}))}))}function Ee(){return w(this,void 0,void 0,(function*(){const e=pe("zenTaoToken");if(e)return e;{const{token:e}=yield ze({url:`${fe("ZenTaoDomain")}/api.php/v1/tokens`,method:"post",data:{account:pe("ldapAccount"),password:pe("ldapPassword")}});return le("zenTaoToken",e),ke(),e}}))}function Te(e){return w(this,void 0,void 0,(function*(){const t=yield ze(Object.assign(Object.assign({},e),{headers:{Token:yield Ee()}}));if("string"==typeof t){const e=JSON.parse(t.slice(0,t.indexOf("<script>")));return JSON.parse(e.data)}if("object"==typeof t)return"Unauthorized"===t.error||t.data.indexOf("<script>")<0?(le("zenTaoToken",""),Te(Object.assign({},e))):t}))}function _e(){return w(this,void 0,void 0,(function*(){const e=pe("k8sToken");if(e)return e;{const{access_token:e}=yield ze({url:`${fe("K8sDomain")}/oauth/login/LDAP`,method:"post",headers:{"Content-Type":"application/x-www-form-urlencoded"},data:{username:pe("ldapAccount"),password:pe("ldapPassword")}}),t=`Bearer ${e}`;return le("k8sToken",t),ke(),t}}))}function qe(e){return w(this,void 0,void 0,(function*(){const t=yield ze(Object.assign(Object.assign({},e),{headers:{Authorization:yield _e()}}));return 401===t.code?(le("k8sToken",""),qe(Object.assign({},e))):t}))}const De=()=>`${P}/api/v4`,Ce=e=>De()+"/projects/100/repository/files/"+encodeURIComponent(e)+"/raw?ref=master";function Ie(){return Oe({url:Ce("src/data/template-projects.json")})}function Pe(){return Oe({url:Ce("src/data/z-develop-config.json")})}function Ae(e){return Oe({url:`${De()}/projects`,data:{search:e,search_namespaces:!0}})}function Le(e,i){let n="";return e.forEach(((e,s)=>{if(e.disabled)n=`${n} - ${e.name} (Disabled)`;else{n+=s===i?t.cyan(b.pointer)+" ":" ",n+=(e.checked||!1?t.green(b.radioOn):b.radioOff)+" "+e.name}n+="\n"})),n.replace(/\n$/,"")}class Ue extends m{constructor(e,t,i){super(e,t,i),this.pointer=0,this.opt.choices||this.throwParamError("choices"),this.opt.choices.forEach(((e,t)=>{const i=e;i.checked=!1,i.id=t}));if(this.opt.choices.find((e=>"separator"===e.type)))throw new Error("Separator is not allowed in choices.");Array.isArray(this.opt.default)&&this.opt.choices.forEach((e=>{"separator"!==e.type&&this.opt.default.includes(e.value)&&(e.checked=!0)})),this.pointer=0,this.selection=[],this.done=e=>{console.log(e)},this.opt.default=null,this.paginator=new f(this.screen,{isInfinite:!0}),this.filterList=this.allList=this.opt.choices.choices}_run(e){this.done=e;const t=h(this.rl),i=this.handleSubmitEvents(t.line.pipe(g(this.getCurrentValue.bind(this))));i.success.forEach(this.onEnd.bind(this)),i.error.forEach(this.onError.bind(this)),t.normalizedUpKey.pipe(y(i.success)).forEach(this.onUpKey.bind(this)),t.normalizedDownKey.pipe(y(i.success)).forEach(this.onDownKey.bind(this)),t.spaceKey.pipe(y(i.success)).forEach(this.onSpaceKey.bind(this));const n=["up","down","space"];return t.keypress.pipe(v((e=>!e.key.ctrl&&!n.includes(e.key.name||"")))).pipe(y(i.success)).forEach(this.onKeyPress.bind(this)),this.render(),this}render(e){let i=this.getQuestion(),n="";if(this.getCurrentValue(),"answered"===this.status)i+=t.cyan(this.selection.join(","));else{this.selection.length?i+=t.magenta(`[已选: ${this.selection.join(",")}]`):i+="("+t.blue.bold("空格键")+"选择,"+t.blue.bold("回车键")+"提交,"+t.blue.bold("输入中文")+"搜索)",i+=t.bgYellowBright(t.black(this.rl.line));const e=Le(this.filterList,this.pointer);n=this.paginator.paginate(e,this.pointer,this.opt.pageSize)}e&&(n=t.red(">> ")+e),this.screen.render(i,n)}getCurrentValue(){const e=this.allList.filter((e=>e.checked&&!e.disabled));return this.selection=e.map((e=>e.short)),e.map((e=>e.value))}toggleChoice(e){const t=this.filterList[e];t&&(this.allList[t.id].checked=!t.checked)}filterChoices(){this.filterList=this.allList.filter((e=>{var t;return null===(t=e.name)||void 0===t?void 0:t.includes(this.rl.line.trim())}))}onSpaceKey(){this.toggleChoice(this.pointer),this.render(),this.rl.resume()}onDownKey(){const e=this.filterList.length;this.pointer=this.pointer<e-1?this.pointer+1:0,this.render()}onUpKey(){const e=this.filterList.length;this.pointer=this.pointer>0?this.pointer-1:e-1,this.render()}onKeyPress(){this.pointer=0,this.filterChoices(),this.render()}onEnd(e){this.status="answered",this.render(),this.screen.done(),this.done(e.value)}onError(e){this.render(e.isValid)}}function Be(){return w(this,void 0,void 0,(function*(){const e=s(process.argv.slice(2));if(!(e.h||e.help||e.v||e.version)&&(!["init","i"].includes(e._[0])||[".","prepare"].includes(e._[1])))if(M()){const e=n.readJSONSync(F());le(e.profile),de(e.main),ue(e.constants),yield function(){return w(this,void 0,void 0,(function*(){const e=me("latestCheckVersionTimestamp"),i=me("versionCheckDuring");if(Date.now()-Number(e)>24*Number(i)*3600*1e3){ue(yield Pe());const e=yield ie(`npm view ${k.name} version --registry https://registry.npmjs.org/`);if(e!==k.version){console.log(`${t.blue(k.name)}本地版本为${k.version},低于线上版本${e},开始升级`);try{yield ie(`npm i -g ${k.name}@${e} --registry https://registry.npmjs.org/`),de("latestCheckVersionTimestamp",Date.now()),ke(),console.log(t.green(`升级完成,当前版本${e}`)),process.exit(0)}catch(e){console.log("升级出错!请重试,或者手动升级"),Y(e)}}}}))}()}else Y("请先初始化z-develop(执行 z i)。更多见https://hxhtbr8t8uy.feishu.cn/docx/RnOhdtqJWo5UooxHTaUcQFwtnKg")}))}function Je(){return w(this,void 0,void 0,(function*(){const e=yield Oe({url:`${De()}/groups`}),t=L.map((t=>{const i=e.find((e=>e.name===t));return!!i&&{name:i.name,id:i.id,description:i.description}})).filter((e=>!!e));n.writeJSONSync(K("fe-groups.json"),{groups:t},{spaces:2})}))}function We(e){return w(this,void 0,void 0,(function*(){const t=`${fe("FEServerDomain")}/api`,{data:i}=yield ze({url:`${t}/auth/z-develop/login`,method:"post"}),n=yield ze({url:t+e.url,headers:{Authorization:`Bearer ${i}`},data:e.data,method:e.method||"post"});return 0!==n.code&&Y(`${n.code}: ${n.message}`),n.data}))}function Re(e){return We({url:"/wework-approval/approval/detail",data:e})}function Ke(){return w(this,void 0,void 0,(function*(){const e=(yield We({url:"/user/list"})).filter((e=>[1,2,3].includes(e.title))).map((e=>({name:`${e.nick} - ${I[e.title]}`,value:e.weWorkUserId}))),t=me("weWorkListCache"),i=t.map((e=>e.value)),n=[];return e.forEach((e=>{const s=i.indexOf(e.value);n.push(Object.assign(Object.assign({},e),{usageCount:s>-1?t[s].usageCount:0}))})),n.sort(((e,t)=>t.usageCount-e.usageCount))}))}function Fe(e,t){return w(this,void 0,void 0,(function*(){const i=yield Ke(),{notify:n}=yield p.prompt([{type:"search-checkbox",name:"notify",message:e,choices:i,validate:t}]);return function(e,t){const i=[];t.forEach((t=>{e.includes(t.value)&&i.push(t)}));const n=me("weWorkListCache"),s=n.map((e=>e.value));i.forEach((e=>{const t=s.indexOf(e.value);t>-1?n[t].usageCount+=1:n.push(Object.assign(Object.assign({},e),{usageCount:1}))})),de({weWorkListCache:n.sort(((e,t)=>t.usageCount-e.usageCount))}),ke()}(n,i),n}))}function Me(){return w(this,void 0,void 0,(function*(){const{processId:e}=yield p.prompt([{type:"input",name:"processId",message:"请输入的企微审批编号"}]);return e}))}function Ve(e,t){return w(this,void 0,void 0,(function*(){const{status:i,applierId:n,form:s}=yield(r={id:e},We({url:"/wework-approval/approval/detail",data:r}));var r;2!==i&&Y("审批单的状态不是已通过"),n!==pe("weWorkUserId")&&Y("提交审批者与当前执行命令的用户不是同一人");const o={projectName:"",branch:"",rollback:""};s.forEach((({label:e,value:t})=>{"项目"===e&&(o.projectName=t),"分支"===e&&(o.branch=t),"回滚"===e&&(o.rollback=t)})),t.name!==o.projectName&&Y("审批单中的项目与当前项目不是同一个项目"),t.branch&&t.branch!==o.branch&&Y("审批单中的分支与当前分支不是同一个项目"),t.rollback&&"否"===o.rollback&&Y("审批单中没有选择回滚")}))}function Ge(){return w(this,void 0,void 0,(function*(){try{if(M()){const{isRemove:e}=yield p.prompt([{type:"confirm",name:"isRemove",message:"系统中已存在z的配置文件,确认重新配置?"}]);e?i.rm("-rf",F()):process.exit(0)}r.mkdirSync(K(),{recursive:!0});const{jobType:e,account:t,password:n}=yield p.prompt([{type:"list",name:"jobType",message:"请选择岗位类型",choices:[{name:"前端",value:"fe"},{name:"后端",value:"be"}]},{type:"input",name:"account",message:"请输入LDAP账号:"},{type:"input",name:"password",message:"请输入LDAP密码:"}]);le("jobType",e),le("ldapAccount",t),le("ldapPassword",n);ue(yield Pe());const s=yield Ke(),o=yield Fe('"请选择你自己(用于企微通知):',(e=>e.length>1?"只能选一个":!(e.length<1)||"请选一个")),{name:a,value:c}=s.find((e=>e.value===o[0]));le({weWorkName:a,weWorkUserId:c})}catch(e){Y(e)}const e=j("配置信息初始化中").start();try{const t=yield Oe({url:`${De()}/user`});le({gitUserId:t.id,gitName:t.name,gitEnglishName:t.username,gitEmail:t.email}),de("latestCheckVersionTimestamp",Date.now()),ke(),yield Je(),e.succeed("配置信息初始化完成"),process.exit(0)}catch(t){e.fail("配置信息初始化失败"),a.isAxiosError(t)&&Y("请检查你的域名及令牌配置"),Y(t)}}))}let He;function Qe(e,t){return w(this,void 0,void 0,(function*(){if(e)i.rm("-rf",E);else if(r.existsSync(B())){const{isRemove:e}=yield p.prompt([{type:"confirm",name:"isRemove",message:`当前项目中已存在配置文件夹${E},确认重新配置?`}]);e?i.rm("-rf",E):process.exit(0)}r.mkdirSync(B(),{recursive:!0}),yield function(e,t){return w(this,void 0,void 0,(function*(){const i=yield ie("git remote get-url --push origin");i||Y("获取项目远程地址失败,请配置后重试");let n=e;if(!n){const{language:e}=yield p.prompt([{type:"list",name:"language",message:"请选择项目语言",choices:[{name:"JavaScript",value:"JavaScript"},{name:"Java",value:"Java"}]}]);n=e}let s=t;if(!s){const e=ye(),t=yield Ae(e.name);if(1===t.length)s=t[0].namespace.path;else if(t.length>1){const{groupName:e}=yield p.prompt([{type:"list",name:"groupName",message:"请选择当前项目所属分组",choices:t.map((e=>({name:e.namespace.path,value:e.namespace.path})))}]);s=e}}He=j("项目初始化中").start(),be({language:n,"lint-staged":z[n],repository:{url:i,group:s}})}))}(e,t),yield function(){return w(this,void 0,void 0,(function*(){r.writeFileSync(W(),"",{mode:493}),r.writeFileSync(B("commit-msg"),"#!/usr/bin/env sh\nz lint commit-msg",{mode:493}),r.writeFileSync(B("pre-commit"),"#!/usr/bin/env sh\nz lint commit-files",{mode:493}),r.writeFileSync(B(".prettierrc.json"),x,{mode:493}),r.writeFileSync(B(".prettierignore"),S,{mode:493}),r.writeFileSync(B(".gitignore"),".commit-msg-tpl\n",{mode:493}),R()}))}(),null==He||He.succeed("初始化完成。"),process.exit(0)}))}function Ze(e){return w(this,void 0,void 0,(function*(){if(!e)return"不能为空";if(!/^[a-z0-9-]+$/.test(e))return"格式为小写字母、中横线(可选)、数字(不推荐)。如apple, apple-tree";if(ee().includes(e))return"当前目录下已存在同名文件夹,请先处理。";return!(yield Ae(e)).find((t=>t.name===e))||"远程仓库中已存在同名项目"}))}function Ye(e){return!!e||"不能为空"}function Xe(e){return e?!!/^[a-zA-Z0-9]+$/.test(e)||"格式为大小写字母、数字,小驼峰命名。如userInfo、systemRouter3":"不能为空"}function et(e){if(!e)return"目录名称不能为空";if(!/^[a-z][a-z0-9\-\/]*$/.test(e))return"支持小写字母、数字,连字符(-)命名,小写字母开头,多层目录使用/隔开。如user、modules-3、setting/profile";if(e.includes("/")){const t=e.split("/");for(const e of t){if(!e)return"子级目录/页面名称不能为空";if(!/^[a-z][a-z0-9\-]*$/.test(e))return"支持小写字母、数字,连字符(-)命名,小写字母开头。如user、modules-3"}}let t,i;t=e.includes("/")?o.resolve("src","pages",...e.split("/")):o.resolve("src","pages",e);const n=o.resolve(t,"..");return i=!!r.existsSync(n)&&r.readdirSync(n).map((e=>{const t=e.lastIndexOf(".");return t>-1?e.slice(0,t):e})).includes(e),!i||"本地目录已存在该文件"}function tt(){return w(this,void 0,void 0,(function*(){var e,s,a,c,l,u;try{const d={},m=()=>w(this,void 0,void 0,(function*(){const e=ee(),{projects:t}=yield Ie(),i=t.map((t=>{const i={name:`${t.name} [${t.desc}]`,value:t.name,disabled:!1};return e.includes(t.name)&&(i.disabled="目录下已存在同名文件夹"),i})),{project:n}=yield p.prompt([{type:"list",name:"project",message:"请选择一个项目模板",choices:i}]),s=t.find((e=>e.name===n));d.tplName=s.name,d.tplUrl=s.url,d.tplLanguage=s.language})),f=()=>w(this,void 0,void 0,(function*(){var e;const{groups:t}=function(){const e=K("fe-groups.json");return r.existsSync(e)?n.readJSONSync(e):{groups:[]}}(),{group:i}=yield p.prompt([{type:"list",name:"group",message:"请选择一个分组",choices:t.map((e=>({name:`${e.name} [${e.description}]`,value:e.id,short:e.name})))}]);d.group={id:i,name:null===(e=t.find((e=>e.id===i)))||void 0===e?void 0:e.name}})),h=()=>w(this,void 0,void 0,(function*(){const{name:e}=yield p.prompt([{type:"input",name:"name",message:"请输入项目名称",validate:Ze}]);d.projectName=e;const{desc:t}=yield p.prompt([{type:"input",name:"desc",message:"请输入项目描述",validate:Ye}]);d.projectDesc=t}));yield m(),yield f(),yield h();const g=`${P}/${null===(e=d.group)||void 0===e?void 0:e.name}/${d.projectName}.git`,y=j("模版初始化中").start();yield ie(`git clone --depth=1 ${d.tplUrl}`),r.renameSync(d.tplName,d.projectName),i.cd(d.projectName),i.rm("-rf",".git"),yield ie("git init --initial-branch=master"),yield ie(`git remote add origin ${g}`),yield ie(`git config user.name ${pe("gitName")}`),yield ie(`git config user.email ${pe("gitEmail")}`);const v=ye();u=Object.assign(Object.assign({},v),{name:d.projectName,description:d.projectDesc,scripts:Object.assign(Object.assign({},v.scripts),{prepare:"z init prepare"})}),he=he?Object.assign(Object.assign({},he),u):u,n.writeJSONSync(o.join("package.json"),he,{spaces:2}),yield n.writeFile(o.resolve("README.md"),function(e="项目中文名",t="项目描述"){return`\n# ${e}\n${t}\n\n## 快速开始\n### 安装依赖\n\`\`\`bash\n npm i\n\`\`\`\n\n### 本地开发\n\`\`\`bash\n npm run dev:{environment}:{platform}\n\`\`\`\n\n> 查看更多关于 [platform](https://zxf-fe.yuque.com/org-wiki-zxf-fe-ex4bve/qi89vg/nttvbeif4a62gtpz#faWqt) 和 [environment](https://zxf-fe.yuque.com/org-wiki-zxf-fe-ex4bve/qi89vg/nttvbeif4a62gtpz#faWqt)\n\n### 打包代码\n\`\`\`bash\n npm run build:{environment}:{platform}\n\`\`\`\n\n### 格式化、修复代码语法\n\`\`\`bash\n z lint prettier\n\`\`\`\n\n> [ESLint相关规范](https://zxf-fe.yuque.com/org-wiki-zxf-fe-ex4bve/qi89vg/ul914hdkqz8fr02g#AkvQ4)\n\n### 格式化文档\n\`\`\`bash\n z lint prettier\n\`\`\`\n\n> [Prettier相关规范](https://zxf-fe.yuque.com/org-wiki-zxf-fe-ex4bve/qi89vg/ul914hdkqz8fr02g#ojpwI)\n\n## 常见问题\n列出开发中常见的问题和解决方案\n\n## 了解更多\n在此处放入语雀文档链接。请在[前端团队-项目手册](https://zxf-fe.yuque.com/org-wiki-zxf-fe-ex4bve/qi89vg/bfrcicwzosoyaifg)中按照分类新建文档。\n`}(d.projectName,d.projectDesc)),y.succeed("模版初始化完成"),yield Qe(d.tplLanguage,null===(s=d.group)||void 0===s?void 0:s.name);const b=j("依赖安装中").start();yield ie("npm install"),b.succeed("依赖安装完成");const $=j("项目推送中").start();yield ie('git add . && git commit -m "chore: init"');const k=yield(l={name:d.projectName,description:d.projectDesc,path:d.projectName,visibility:"private",namespace_id:null===(a=d.group)||void 0===a?void 0:a.id},Oe({url:`${De()}/projects`,method:"post",data:l}));yield ie("git push -u origin master"),$.succeed(`项目已推送到远程,地址: ${t.blue(g)}`);const x=j("初始化分支中").start(),S=`feat_init_${ne()}`,z=ae(null===(c=d.group)||void 0===c?void 0:c.name)?["dev","test","release",S]:[S],N=yield Promise.allSettled(z.map((e=>function(e){return Oe({url:`${De()}/projects/${e.id}/repository/branches`,method:"post",data:e})}({id:k.id,branch:e,ref:"master"})))),O=[];N.forEach((({status:e},t)=>{"fulfilled"===e&&O.push(z[t])})),yield ie("git pull"),O.includes(S)?(yield ie(`git checkout -b ${S} origin/${S}`),x.succeed(`项目已切换到初始分支: ${t.blue(S)}`)):x.warn("开发分支检出失败!项目当前在主分支,请自行检出开发分支。");const E=`cd ${d.projectName} && z start`;console.log(`输入 ${t.green(E)} 开始开发吧~`),process.exit(0)}catch(e){Y(e)}}))}e.command("init").alias("i").argument("[type]","非必填。不传为初始化工具配置;传 . 为初始化当前项目。").description("初始化工具配置、项目配置").action((function(e){return w(this,void 0,void 0,(function*(){e?"."===e?(re(),yield Qe(void 0,void 0)):"prepare"===e?(re(),yield function(){return w(this,void 0,void 0,(function*(){r.existsSync(B())&&r.existsSync(W())?R():yield Qe(),process.exit(0)}))}()):Y("参数错误。执行 z init -h 查看帮助。"):yield Ge()}))}));const it=e=>`${fe("ZenTaoDomain")}${e}`;function nt(e){return 0!==e.length||"请选择项"}function st(){return w(this,void 0,void 0,(function*(){const{type:e}=yield p.prompt({type:"list",name:"type",message:"请选择你要创建的模板类型",choices:[{name:"feat - 业务需求开发",value:"feat"},{name:"fix - bug修复",value:"fix"},{name:"refactor - 技术内部需求",value:"refactor"},{name:"chore - 其他",value:"chore"}]});if(["feat","refactor"].includes(e)){const e=yield function(){return w(this,void 0,void 0,(function*(){const e=yield Te({url:it("/my-work-task.json?tid=mrrferp8"),method:"get"});return null==e?void 0:e.tasks.map((({id:e,name:t})=>({value:{name:t,value:e},name:t})))}))}(),{tasks:t}=yield p.prompt({type:"checkbox",name:"tasks",message:"请关联开发任务(可多选):",validate:nt,choices:e.map((e=>Object.assign(Object.assign({},e),{name:`[${e.value.value}]: ${e.name}`})))});rt("feat",t)}else if("fix"===e){const e=yield function(){return w(this,void 0,void 0,(function*(){const e=yield Te({url:it("/my-work-bug.json?tid=mrrferp8"),method:"get"});return null==e?void 0:e.bugs.map((({id:e,title:t})=>({name:t,value:{name:t,value:e}})))}))}(),{bugs:t}=yield p.prompt({type:"checkbox",name:"bugs",message:"请关联Bug(可多选):",validate:nt,choices:e.map((e=>Object.assign(Object.assign({},e),{name:`[${e.value.value}]: ${e.name}`})))});rt("fix",t)}else if("chore"===e){const{msg:e}=yield p.prompt({type:"input",name:"msg",message:"请输入commit msg:",validate:e=>0!==e.length||"请输入commit msg"});rt("chore",[e])}}))}function rt(e,i){let n="";if(["feat","refactor","fix"].includes(e)){n=`${e}(${i.map((e=>e.value)).join(",")}): ${i.map((e=>e.name)).join(";")}`}"chore"===e&&(n=`${e}: ${i[0]}`),r.writeFileSync(W(),n,"utf-8"),console.log(t.yellow(n)),Z("commit msg模板写入成功,可以进行提交了")}function ot(e){return qe({url:`${fe("K8sDomain")}/kapis/clusters/youshou-local/devops.kubesphere.io/v1alpha3/namespaces/${U}/pipelines/${e.projectName}/pipelineruns?branch=${e.branchName}`,method:"post",data:e.params})}function at(e){return w(this,void 0,void 0,(function*(){const{targetBranch:t,platform:i,notify:n,processId:s,projectName:r}=e,o=n?[...new Set([pe("weWorkUserId"),...n])]:[pe("weWorkUserId")];yield ot({projectName:r,branchName:t,params:{parameters:[{name:"platform",value:i},{name:"notify",value:o.join(",")},{name:"processId",value:s||""},{name:"promoterName",value:pe("weWorkName")},{name:"promoterId",value:pe("weWorkUserId")},{name:"rollback",value:String(e.rollback)}]}})}))}function ct(e,t){return w(this,void 0,void 0,(function*(){se(),re(),yield oe();let i=e;if(i&&!C.includes(i)&&Y("仅支持发布指定环境分支"),!i){const{environment:e}=yield p.prompt([{type:"list",name:"environment",message:"请选择部署环境",choices:q}]);i="production"===(n=e)?"master":n}var n;const{platform:s}=yield p.prompt([{type:"list",name:"platform",message:"请选择平台",choices:D}]),r=yield Fe("请选择部署成功要通知的人员:",(e=>!(e.length<1)||"至少选一个"));var o;!function(e,t){var i,n,s,r,o;const a=ye(),c=ve();(null===(i=null==c?void 0:c.repository)||void 0===i?void 0:i.url)||Y(".z/project.json中缺少repository.url");const l=`build:${e}`;(null==a?void 0:a.scripts[l])||Y(`项目package.json文件scripts不存在命令${l}。`);["alipay","weapp"].includes(t)&&(a.mini||Y("请在package.json配置mini字段"),"alipay"===t&&((null===(s=null===(n=a.mini)||void 0===n?void 0:n.alipay)||void 0===s?void 0:s.appid)||Y("请在package.json配置mini.alipay.appid字段")),"weapp"===t&&((null===(o=null===(r=a.mini)||void 0===r?void 0:r.weapp)||void 0===o?void 0:o.appid)||Y("请在package.json配置mini.weapp.appid字段")))}("master"===(o=i)?"production":o,s);const a=ye();let c=t||"";"master"===i&&(c||(c=yield Me(),yield Ve(c,{name:a.name}),yield Re({id:c,state:2}))),yield at({projectName:a.name,targetBranch:i,platform:s,notify:r,processId:c,rollback:!1})}))}function lt(){const e=J();if(r.existsSync(e)){const t=n.readJsonSync(e);if(t["lint-staged"])return t["lint-staged"];throw new Error("未找到lint配置")}throw new Error("请先初始化项目(z i .)。")}e.command("create").alias("c").argument("[type]","可选值为project|pr, branch|b, commit-msg|cm, page|p, component|co").description("创建项目/分支/提交信息/页面/组件").action((function(e){return w(this,void 0,void 0,(function*(){let t;if(e)["project","pr"].includes(e)?t="project":["branch","b"].includes(e)?t="branch":["page","pa"].includes(e)?t="page":["component","co"].includes(e)?t="component":["commit-msg","cm"].includes(e)?t="commit-msg":Y("参数输入错误");else{t=(yield p.prompt({type:"list",name:"type",message:"请选择你要创建的类型",choices:[{name:"提交信息(commit message)",value:"commit-msg"},{name:"分支(branch)",value:"branch"},{name:"页面(page)",value:"page"},{name:"组件(component)",value:"component"},{name:"项目(project)",value:"project"}]})).type}"project"===t?yield tt():"branch"===t?(se(),re(),yield oe(),yield function(){return w(this,void 0,void 0,(function*(){se(),re(),yield oe();const{type:e,purpose:t}=yield p.prompt([{name:"type",type:"list",message:"请选择创建分支的类型",choices:[{name:"开发新功能(feat)",value:"feat"},{name:"修复BUG(fix)",value:"fix"},{name:"重构/优化代码(refactor)",value:"refactor"}]},{name:"purpose",type:"input",message:"请输入创建分支的目的(大小写字母、数字,小驼峰式命名。如userInfo)",validate:Xe}]),i=`${e}_${t}_${ne()}`;yield ie("git fetch origin master"),yield ie(`git checkout -b ${i} origin/master`),yield ie("git push -u origin feat_new-feature")}))}()):"commit-msg"===t?(se(),re(),yield st()):"page"===t?(se(),re(),yield function(){return w(this,void 0,void 0,(function*(){const e="pages",t=yield we(e);r.mkdirSync(o.resolve("src",e),{recursive:!0});const{dirPageName:n}=yield p.prompt([{name:"dirPageName",type:"input",message:"请输入目录及页面名称(如user/list,不带文件后缀)",validate:et}]);let s;if(n.includes("/")){const t=n.split("/");t.pop(),s=o.resolve("src",e,...n.split("/")),r.mkdirSync(o.resolve("src",e,...t),{recursive:!0})}else s=o.resolve("src",e,n);const{pages:a}=yield Ie(),c=r.readdirSync(t),{tplName:l}=yield p.prompt([{name:"tplName",type:"list",message:"请选择模版",choices:a.map((e=>!!c.includes(e.name)&&{name:`${e.name}: ${e.desc}(${e.author})`,value:e.name})).filter((e=>e))}]),u=j("页面生成中...").start(),d=s+o.extname(o.join(t,l));i.cp("-r",o.join(t,l),d),X(d)?te(d).forEach((e=>{Se(o.join(d,e),n)})):Se(d,n),u.succeed("页面生成成功")}))}()):"component"===t&&(se(),re(),yield function(){return w(this,void 0,void 0,(function*(){const e="components",t=yield we("components");r.mkdirSync(o.resolve("src",e),{recursive:!0});const{dirPageName:n}=yield p.prompt([{name:"dirPageName",type:"input",message:"请输入目录及组件名称(如user/list,不带文件后缀)",validate:et}]);let s;if(n.includes("/")){const t=n.split("/"),i=t.pop();s=o.resolve("src",e,...t.split("/"),xe(i)),r.mkdirSync(o.resolve("src",e,...t),{recursive:!0})}else s=o.resolve("src",e,xe(n));const{components:a}=yield Ie(),c=r.readdirSync(t),{tplName:l}=yield p.prompt([{name:"tplName",type:"list",message:"请选择模版",choices:a.map((e=>!!c.includes(e.name)&&{name:`${e.name}: ${e.desc}(${e.author})`,value:e.name})).filter((e=>e))}]),u=j("组件生成中...").start(),d=s+o.extname(o.join(t,l));i.cp("-r",o.join(t,l),d),X(d)?te(d).forEach((e=>{Se(o.join(d,e),n)})):Se(d,n),u.succeed("组件生成成功")}))}())}))})),e.command("merge").alias("m").description("合并当前分支到指定远程分支,并部署。").action((function(){return w(this,void 0,void 0,(function*(){var e;se(),re(),yield oe();const i=yield $e();C.includes(i.sourceBranch)&&Y(`当前分支${i.sourceBranch}不可作为源分支合并到目标分支。`);const n=yield(s=i.id,Oe({url:`${De()}/projects/${s}/repository/branches`}));var s;const r=ae(i.group),o=n.filter((e=>![i.sourceBranch].includes(e.name))).map((e=>{let i=e.name;return r&&C.includes(i)&&(i=t.bold.blue(i)),{name:i,value:e.name}})),{target:c}=yield p.prompt([{type:"list",name:"target",message:"请选择要合并到的目标分支:",choices:o}]);let l;"master"===c&&(l=yield Me(),yield Ve(l,{name:i.name,branch:i.sourceBranch}),yield Re({id:l,state:1}));const u=j(`${i.sourceBranch}分支推送中`).start();(yield ie(`git ls-remote --heads origin ${i.sourceBranch}`))&&(yield ie("git pull")),yield ie(`git push -u origin ${i.sourceBranch}`),u.succeed(`${i.sourceBranch}已推送到远程`),yield function(e,t,i){return w(this,void 0,void 0,(function*(){const n=`origin/${e}`,s=yield ie("git log -b origin/master -1 --format=%H"),r=yield ie(`git log -b origin/${e} -1 --format=%H`),o=yield ie(`git log ${s}...${r} -b ${n}`);if(o||Y(`分支${e}上不存在新的commit,合并终止。`),"master"===t){if(i){const e=o.split("\n").filter((e=>e)),t=yield ie("git log -b origin/test -1 --format=%H");(function(e,t){for(let i of t)if(!e.includes(i))return!1;return!0})((yield ie(`git log ${s}...${t} -b origin/test`)).split("\n").filter((e=>e)),e)||Y("请先在测试环境发布要部署的代码")}}else{(yield ie(`git branch --contains ${s} -r ${n}`))||Y(`请先将最新的主分支(master)代码合并到${n},再进行部署。推荐命令:git merge origin/master`)}}))}(i.sourceBranch,c,r);const d=j("分支合并中").start();let m=0;try{const{iid:e}=yield(f={title:"MR by z-develop",id:i.id,source_branch:i.sourceBranch,target_branch:c,remove_source_branch:"master"===c},Oe({url:`${De()}/projects/${f.id}/merge_requests`,method:"post",data:f}));m=e}catch(t){if(a.isAxiosError(t)){409===(null===(e=null==t?void 0:t.response)||void 0===e?void 0:e.status)&&Y(`存在重复的合并请求,前往查看${i.mergeRequestUrl}`)}Y(t)}var f;const h=()=>w(this,void 0,void 0,(function*(){var e;try{yield new Promise((e=>{setTimeout(e,5e3)})),yield function(e){return Oe({url:`${De()}/projects/${e.id}/merge_requests/${e.iid}/merge`,method:"put"})}({id:i.id,iid:m})}catch(t){if(a.isAxiosError(t)){406===(null===(e=null==t?void 0:t.response)||void 0===e?void 0:e.status)?yield h():(yield function(e){return Oe({url:`${De()}/projects/${e.id}/merge_requests/${e.iid}`,method:"put",data:e})}({id:i.id,iid:m,state_event:"close"}),d.fail("合并过程中出现冲突,MR已关闭。建议在本地完成合并。"),process.exit(1))}else Y(t)}}));yield h(),d.succeed("分支合并成功"),"master"===c&&(yield ie("git checkout master"),yield ie("git pull"),yield ie(`git branch -d ${i.sourceBranch}`),Z(`\n${i.sourceBranch}分支已移除,当前已切换到最新的master。\n如需继续开发,请检出新分支(z c b)。\n`)),r&&C.includes(c)&&(yield ct(c,l))}))})),e.command("deploy").alias("d").description("发布指定远程分支").argument("[branchName]","可选值为dev/test/release/master").argument("[processId]","审批编号,branchName为master时需要").action(ct),e.command("start").alias("s").description("启动本地开发环境").argument("[env]","可选值 dev|d, test|t, release|r, prod|p").action((function(e){return w(this,void 0,void 0,(function*(){let t=e;if(t)["dev","test","release","production","d","t","r","p"].includes(e)?"d"===t?t="dev":"t"===t?t="test":"r"===t?t="release":"p"===t&&(t="production"):Y("参数输入有误");else{const{environment:e}=yield p.prompt([{type:"list",name:"environment",message:"请选择环境",choices:q}]);t=e}const n=`dev:${t}`;if(ye().scripts[n])try{i.exec(`npm run ${n}`,{silent:!1})}catch(e){Y(e)}else Y(`项目中(package.josn > scripts)不存在命令${n},请先添加!`)}))})),e.command("lint").alias("l").argument("[type]","非必填。可选值为commit-msg|cm, commit-files|cf, prettier|p, eslint|e。").description("执行 lint 脚本。包含 lint staged 、 lint commit message、 prettier、 eslint。").action((function(e){return w(this,void 0,void 0,(function*(){let t;if(se(),re(),e)["commit-msg","cm"].includes(e)?t="commit-msg":["commit-files","cf"].includes(e)?t="commit-files":["prettier","p"].includes(e)?t="prettier":["eslint","e"].includes(e)?t="eslint":Y("参数输入错误");else{t=(yield p.prompt({type:"list",name:"type",message:"请选择你要执行的操作",choices:[{name:"全局执行 prettier",value:"prettier"},{name:"全局执行 eslint",value:"eslint"}]})).type}if("commit-msg"===t)yield function(){return w(this,void 0,void 0,(function*(){const e=function(e){const t=r.readFileSync(o.resolve(".git","COMMIT_EDITMSG"),"utf-8").split(": ");if(1===t.length)return"body前缺少「: 」";{const e=t[0];return/^(feat|fix|refactor)/.test(e)?!!/\(\d+(?:,\d+)*\)/.test(e)||"ID缺少或者格式不正确。":/^chore/.test(e)?"chore"===e||"chore类型无需填写ID。":"不存在的提交类型。"}}();!0===e?(Z("commit msg validate success."),process.exit(0)):Y(`commit msg格式错误。${e}`)}))}();else if("commit-files"===t)yield function(){return w(this,void 0,void 0,(function*(){(yield $({concurrent:!1,debug:void 0,config:lt()}))?(Z("代码风格检测通过!"),process.exit(0)):Y("代码风格检测未通过!")}))}();else if("prettier"===t){r.existsSync(o.resolve("node_modules",".bin","prettier"))||Y("该项目未安装prettier,请安装后重试");try{yield ie("npx prettier --write . --config .z/.prettierrc.json --ignore-path .z/.prettierignore --ignore-unknown --no-error-on-unmatched-pattern",{silent:!1}),Z("prettier执行成功")}catch(e){Y("prettier校验出错")}}else if("eslint"===t){console.log(o.resolve("node_modules",".bin","eslint")),r.existsSync(o.resolve("node_modules",".bin","eslint"))||Y("该项目未安装eslint,请安装后重试");try{let e="npx eslint '**/*.{vue,js,jsx,cjs,mjs,ts,tsx,cts,mts}' --fix";"win32"===process.platform&&(e='npx eslint "**/*.{vue,js,jsx,cjs,mjs,ts,tsx,cts,mts}" --fix'),yield ie(e,{silent:!1}),Z("eslint执行成功")}catch(e){Y("eslint校验出错")}}}))})),e.command("rollback").alias("r").description("正式环境回滚").argument("[processId]","非必填。审批单ID。").action((function(e){return w(this,void 0,void 0,(function*(){se(),re();let t=e||"";const i=ye();t||(t=yield Me(),yield Ve(t,{name:i.name,rollback:!0}),yield Re({id:t,state:2}));const{platform:n}=yield p.prompt([{type:"list",name:"platform",message:"请选择平台",choices:D}]),s=yield Fe("请选择回滚成功要通知的人员:",(e=>!(e.length<1)||"至少选一个"));yield at({projectName:i.name,targetBranch:"master",platform:n,notify:s,processId:t,rollback:!0})}))})),function(){w(this,void 0,void 0,(function*(){process.on("unhandledRejection",(e=>{})),process.on("uncaughtException",(e=>{})),i.config.fatal=!0,i.config.silent=!0,i.config.verbose=!1,yield Be(),p.registerPrompt("search-checkbox",Ue)}))}(),e.name("z-develop").alias("z").description(`z-develop, 开发流程管理工具。\n了解更多: ${t.blue("https://hxhtbr8t8uy.feishu.cn/docx/RnOhdtqJWo5UooxHTaUcQFwtnKg")}`).usage("<command> [options]").version(k.version,"-v, --version","当前版本号").helpOption("-h, --help","帮助").showHelpAfterError("可以使用z -h查看帮助。"),e.parse();
1
+ import{program as e}from"commander";import t from"chalk";import i from"shelljs";import n from"fs-extra";import s from"minimist";import o from"node:fs";import r from"node:path";import a,{AxiosError as c}from"axios";import l from"dayjs";import u from"node:os";import d from"child_process";import p from"inquirer";import m from"inquirer/lib/prompts/base.js";import f from"inquirer/lib/utils/paginator.js";import h from"inquirer/lib/utils/events.js";import"inquirer/lib/objects/choices.js";import{map as g,takeUntil as y,filter as v}from"rxjs";import b from"figures";import j from"ora";import $ from"lint-staged";var k={name:"cli-z-develop",version:"0.0.43",description:"前端本地开发命令行工具",main:"dist/index.js",bin:{z:"bin/z.js","z-develop":"bin/z.js"},scripts:{prepare:"husky",dev:"rollup -c -w --environment DEBUG:true",build:"rollup -c",eslint:"eslint '**/*.{ts,js}' --fix",prettier:"prettier -wu .",upload:"npm version patch && npm run build && npm publish --access public --registry https://registry.npmjs.org/"},type:"module",repository:{type:"git",url:"http://git.cxlqd.com/fe-base/cli-z-develop.git"},author:"z",devDependencies:{"@commitlint/cli":"^19.3.0","@commitlint/config-conventional":"^19.2.2","@rollup/plugin-json":"^6.1.0","@rollup/plugin-node-resolve":"^15.2.3","@rollup/plugin-replace":"^5.0.7","@rollup/plugin-terser":"^0.4.4","@types/fs-extra":"^11.0.4","@types/inquirer":"^9.0.7","@types/minimist":"^1.2.5","@types/node":"^20.14.9","@types/shelljs":"^0.8.15","@types/tough-cookie":"^4.0.5","@typescript-eslint/eslint-plugin":"^7.14.1","@typescript-eslint/parser":"^7.14.1",eslint:"^8.57.0","eslint-config-alloy":"^5.1.2","eslint-config-prettier":"^9.1.0",husky:"^9.0.11",prettier:"^3.3.2",rollup:"^4.18.0","rollup-plugin-typescript2":"^0.36.0",tslib:"^2.6.3",typescript:"^5.5.2"},dependencies:{"@inquirer/prompts":"^5.1.0",axios:"^1.7.2",chalk:"^5.3.0",commander:"^12.1.0",dayjs:"^1.11.11",figures:"^6.1.0","fs-extra":"^11.2.0",inquirer:"9.3.1","lint-staged":"^15.2.7",minimist:"^1.2.8",ora:"^8.0.1",rxjs:"^7.8.1",shelljs:"^0.8.5"}};function w(e,t,i,n){return new(i||(i=Promise))((function(s,o){function r(e){try{c(n.next(e))}catch(e){o(e)}}function a(e){try{c(n.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(r,a)}c((n=n.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;const x='{\n "printWidth": 120,\n "tabWidth": 2,\n "useTabs": false,\n "semi": true,\n "singleQuote": false,\n "quoteProps": "as-needed",\n "jsxSingleQuote": false,\n "trailingComma": "all",\n "bracketSpacing": true,\n "bracketSameLine": false,\n "arrowParens": "always",\n "requirePragma": false,\n "insertPragma": false,\n "proseWrap": "preserve",\n "htmlWhitespaceSensitivity": "css",\n "vueIndentScriptAndStyle": false,\n "endOfLine": "lf",\n "embeddedLanguageFormatting": "auto",\n "singleAttributePerLine": false\n}\n',S="# 系统 信息文件\n.DS_Store/\nThumbs.db\n\n# 编辑器配置文件\n.idea/\n.vscode/\n\n# 输出目录\ndist/\n\n# Log files\n*.log\n\n# 本地配置文件\n*.local\n\n# 缓存文件\n*.cache\n\n# 垃圾文件\n.Trashes\n",z={Java:{"**/*.{java}":"./run.sh pmd -d ../../../src/main/java/ -f text -R rulesets/java/quickstart.xml"},JavaScript:{"**/*.{vue,js,jsx,cjs,mjs,ts,tsx,cts,mts}":"eslint --fix","*":"prettier -wu"}},N=".z",O="develop-config.json",E=".z",T=".commit-msg-tpl",_="project.json",q=[{name:"开发环境 - dev",value:"dev"},{name:"测试环境 - test",value:"test"},{name:"预发环境 - release",value:"release"},{name:"正式环境 - production",value:"production"}],D=[{name:"网页 - h5",value:"h5"},{name:"依赖包 - npm",value:"npm"}],I=["master","dev","test","release"],C={1:"研发",2:"测试",3:"产品",4:"设计",5:"运营",6:"销售",7:"行政",8:"财务",9:"其他"},P="http://git.cxlqd.com",U={PROJECT_NAME:"fe-pages-tpl",GIT_URL:`${P}/fe-component/fe-pages-tpl.git`},A=["fe-biz","fe-base","fe-tpl","fe-component","fe-demo"],L="fe-biz7tvsd";function B(e=""){return r.join(E,e)}function J(){return B(_)}function W(){return B(T)}function R(){d.spawnSync("git",["config","core.hooksPath",B()]),d.spawnSync("git",["config","commit.template",W()])}function K(e=""){return r.resolve(u.homedir(),N,e)}function F(){return K(O)}function M(){return o.existsSync(K())&&o.existsSync(F())}const{red:V,green:G,blue:H,magenta:Q}=t;function Z(...e){console.log(G(...e))}function Y(e,t=!1){let i=e;e instanceof Error?(i=e.message,a.isAxiosError(e)&&(i=`请求失败:${e.message}`),console.log(V(i)),console.log(Q(e.stack))):console.log(V(e)),t||process.exit(1)}function X(e){return!!o.existsSync(e)&&o.lstatSync(e).isDirectory()}function ee(e=process.cwd()){if(X(e)){return o.readdirSync(e).filter((t=>X(r.resolve(e,t))))}return[]}function te(e=process.cwd()){if(X(e)){return o.readdirSync(e).filter((t=>!X(r.resolve(e,t))))}return[]}function ie(e){return w(this,arguments,void 0,(function*(e,t={removeTailLinkBreak:!0,silent:!0}){let n=yield new Promise(((n,s)=>{try{n(i.exec(e,{silent:t.silent}))}catch(e){s(e)}}));return n=n.toString(),t.removeTailLinkBreak&&(n=n.replace(/\n$/,"")),n}))}function ne(){return l(Date.now()).format("YYMMDD")}function se(){o.existsSync(B())||Y("当前不在项目根目录。请切换到项目根目录")}function oe(){o.existsSync(r.resolve(".git"))||Y("当前不是git项目根目录,请先执行git init,或切换到根目录")}function re(){return w(this,void 0,void 0,(function*(){""!==(yield ie("git status -s"))&&Y("请先提交代码变动,再进行操作")}))}function ae(e){return["fe-biz"].includes(e)}const ce={profile:{ldapAccount:"",ldapPassword:"",gitToken:"",gitUserId:0,gitName:"",gitEnglishName:"",gitEmail:"",weWorkName:"",weWorkUserId:"",jobType:"fe",zenTaoToken:"",k8sToken:""},main:{version:k.version,latestCheckVersionTimestamp:0,versionCheckDuring:3,weWorkListCache:[]},constants:{ZenTaoDomain:"",K8sDomain:"",FEServerDomain:""}};function le(e,t){void 0!==t?ce.profile[e]=t:ce.profile=Object.assign(Object.assign({},ce.profile),e)}function ue(e,t){ce.constants=Object.assign(Object.assign({},ce.constants),e)}function de(e,t){void 0!==t?ce.main[e]=t:ce.main=Object.assign(Object.assign({},ce.main),e)}function pe(e){return e?ce.profile[e]:ce.profile}function me(e){return e?ce.main[e]:ce.main}function fe(e){return e?ce.constants[e]:ce.constants}let he=null,ge=null;function ye(){if(he)return he;const e=r.join("package.json");return o.existsSync(e)||Y(`当前目录(${i.pwd()})不存在${e}文件,请在项目根目录执行该命令。`),he=n.readJsonSync(e),he}function ve(){if(ge)return ge;const e=J();return o.existsSync(e)||Y(`当前目录(${i.pwd()})不存在${e}文件,请在项目根目录执行该命令,或者初始化项目(z init .)。`),ge=n.readJsonSync(e),ge}function be(e){ge=ge?Object.assign(Object.assign({},ge),e):e,n.writeJSONSync(J(),ge,{spaces:2})}const je={id:0,name:"",group:"",sourceBranch:"",mergeRequestUrl:""};function $e(){return w(this,void 0,void 0,(function*(){if(!je.name){const e=ye();je.name=e.name}if(!je.group){const e=ve();e.repository.group&&(je.group=e.repository.group)}if(!je.id)try{const e=je.group?`${je.group}/${je.name}`:je.name,[t]=yield Ue(e);je.mergeRequestUrl=t.web_url+"/merge_requests",je.id=t.id,je.group=t.namespace.path;const i=ve();i.repository.group||be({repository:Object.assign(Object.assign({},i.repository),{group:t.namespace.path})})}catch(e){Y(e)}return je.sourceBranch||(je.sourceBranch=yield ie("git branch --show-current")),je}))}function ke(){n.writeJSONSync(F(),{main:me(),profile:pe(),constants:fe()},{spaces:2})}function we(e){return w(this,void 0,void 0,(function*(){const t=K(),n=process.cwd(),s=r.join(t,U.PROJECT_NAME);o.existsSync(s)?(i.cd(s),yield ie("git pull"),i.cd(n)):(i.cd(t),yield ie(`git clone ${U.GIT_URL} --depth=1`),i.cd(n));const a=r.join(s,"src",e);return o.existsSync(a)||Y("模板库错误!"),a}))}function xe(e){return e.split("-").map((e=>e.charAt(0).toUpperCase()+e.slice(1))).join("")}function Se(e,t){const i=o.readFileSync(e,"utf-8"),n=t.replace(/\//g,"-"),s=i.replace(/name: "-_-NAME-_-"/g,`name: "${xe(n)}"`).replace(/class="-_-NAME-_-"/g,`class="${n}"`).replace(/.-_-NAME-_-/g,`.${n}`);o.writeFileSync(e,s,"utf-8")}function ze(e){return w(this,void 0,void 0,(function*(){var i;const n=e.method||"get",s=e.headers||{},o=e.data||{},r=e.dataKey||["GET","get"].includes(n)?"params":"data";try{const i={url:e.url,method:n,[r]:o,headers:s};t.magenta(i.method.toUpperCase()),t.yellow(i.url),JSON.stringify(i.headers),t.gray(JSON.stringify(i[r],null,2));const c=yield a(i);return t.green("Response"),t.grey(JSON.stringify(c.data,null,2)),Promise.resolve(c.data)}catch(e){return e instanceof c&&(t.red("Error"),t.grey(JSON.stringify(null===(i=null==e?void 0:e.response)||void 0===i?void 0:i.data))),Promise.reject(e)}}))}function Ne(){return w(this,void 0,void 0,(function*(){const e=pe("gitToken");if(e)return e;{const{access_token:e}=yield ze({url:`${P}/oauth/token`,method:"post",data:{grant_type:"password",username:pe("ldapAccount"),password:pe("ldapPassword")}}),t=`Bearer ${e}`;return le("gitToken",t),ke(),t}}))}function Oe(e){return w(this,void 0,void 0,(function*(){return ze(Object.assign(Object.assign({},e),{headers:{Authorization:yield Ne()}}))}))}function Ee(){return w(this,void 0,void 0,(function*(){const e=pe("zenTaoToken");if(e)return e;{const{token:e}=yield ze({url:`${fe("ZenTaoDomain")}/api.php/v1/tokens`,method:"post",data:{account:pe("ldapAccount"),password:pe("ldapPassword")}});return le("zenTaoToken",e),ke(),e}}))}function Te(e){return w(this,void 0,void 0,(function*(){const t=yield ze(Object.assign(Object.assign({},e),{headers:{Token:yield Ee()}}));if("string"==typeof t){const e=JSON.parse(t.slice(0,t.indexOf("<script>")));return JSON.parse(e.data)}if("object"==typeof t)return"Unauthorized"===t.error||t.data.indexOf("<script>")<0?(le("zenTaoToken",""),Te(Object.assign({},e))):t}))}function _e(){return w(this,void 0,void 0,(function*(){const e=pe("k8sToken");if(e)return e;{const{access_token:e}=yield ze({url:`${fe("K8sDomain")}/oauth/login/LDAP`,method:"post",headers:{"Content-Type":"application/x-www-form-urlencoded"},data:{username:pe("ldapAccount"),password:pe("ldapPassword")}}),t=`Bearer ${e}`;return le("k8sToken",t),ke(),t}}))}function qe(e){return w(this,void 0,void 0,(function*(){const t=yield ze(Object.assign(Object.assign({},e),{headers:{Authorization:yield _e()}}));return 401===t.code?(le("k8sToken",""),qe(Object.assign({},e))):t}))}const De=()=>`${P}/api/v4`,Ie=e=>De()+"/projects/100/repository/files/"+encodeURIComponent(e)+"/raw?ref=master";function Ce(){return Oe({url:Ie("src/data/template-projects.json")})}function Pe(){return Oe({url:Ie("src/data/z-develop-config.json")})}function Ue(e){return Oe({url:`${De()}/projects`,data:{search:e,search_namespaces:!0}})}function Ae(e,i){let n="";return e.forEach(((e,s)=>{if(e.disabled)n=`${n} - ${e.name} (Disabled)`;else{n+=s===i?t.cyan(b.pointer)+" ":" ",n+=(e.checked||!1?t.green(b.radioOn):b.radioOff)+" "+e.name}n+="\n"})),n.replace(/\n$/,"")}class Le extends m{constructor(e,t,i){super(e,t,i),this.pointer=0,this.opt.choices||this.throwParamError("choices"),this.opt.choices.forEach(((e,t)=>{const i=e;i.checked=!1,i.id=t}));if(this.opt.choices.find((e=>"separator"===e.type)))throw new Error("Separator is not allowed in choices.");Array.isArray(this.opt.default)&&this.opt.choices.forEach((e=>{"separator"!==e.type&&this.opt.default.includes(e.value)&&(e.checked=!0)})),this.pointer=0,this.selection=[],this.done=e=>{console.log(e)},this.opt.default=null,this.paginator=new f(this.screen,{isInfinite:!0}),this.filterList=this.allList=this.opt.choices.choices}_run(e){this.done=e;const t=h(this.rl),i=this.handleSubmitEvents(t.line.pipe(g(this.getCurrentValue.bind(this))));i.success.forEach(this.onEnd.bind(this)),i.error.forEach(this.onError.bind(this)),t.normalizedUpKey.pipe(y(i.success)).forEach(this.onUpKey.bind(this)),t.normalizedDownKey.pipe(y(i.success)).forEach(this.onDownKey.bind(this)),t.spaceKey.pipe(y(i.success)).forEach(this.onSpaceKey.bind(this));const n=["up","down","space"];return t.keypress.pipe(v((e=>!e.key.ctrl&&!n.includes(e.key.name||"")))).pipe(y(i.success)).forEach(this.onKeyPress.bind(this)),this.render(),this}render(e){let i=this.getQuestion(),n="";if(this.getCurrentValue(),"answered"===this.status)i+=t.cyan(this.selection.join(","));else{this.selection.length?i+=t.magenta(`[已选: ${this.selection.join(",")}]`):i+="("+t.blue.bold("空格键")+"选择,"+t.blue.bold("回车键")+"提交,"+t.blue.bold("输入中文")+"搜索)",i+=t.bgYellowBright(t.black(this.rl.line));const e=Ae(this.filterList,this.pointer);n=this.paginator.paginate(e,this.pointer,this.opt.pageSize)}e&&(n=t.red(">> ")+e),this.screen.render(i,n)}getCurrentValue(){const e=this.allList.filter((e=>e.checked&&!e.disabled));return this.selection=e.map((e=>e.short)),e.map((e=>e.value))}toggleChoice(e){const t=this.filterList[e];t&&(this.allList[t.id].checked=!t.checked)}filterChoices(){this.filterList=this.allList.filter((e=>{var t;return null===(t=e.name)||void 0===t?void 0:t.includes(this.rl.line.trim())}))}onSpaceKey(){this.toggleChoice(this.pointer),this.render(),this.rl.resume()}onDownKey(){const e=this.filterList.length;this.pointer=this.pointer<e-1?this.pointer+1:0,this.render()}onUpKey(){const e=this.filterList.length;this.pointer=this.pointer>0?this.pointer-1:e-1,this.render()}onKeyPress(){this.pointer=0,this.filterChoices(),this.render()}onEnd(e){this.status="answered",this.render(),this.screen.done(),this.done(e.value)}onError(e){this.render(e.isValid)}}function Be(){return w(this,arguments,void 0,(function*(e="latest"){yield ie(`npm i -g ${k.name}@${e} --registry https://registry.npmjs.org/`),de("latestCheckVersionTimestamp",Date.now()),ke(),process.exit(0)}))}function Je(){return w(this,void 0,void 0,(function*(){const e=s(process.argv.slice(2));if(!(e.h||e.help||e.v||e.version)&&(!["init","i"].includes(e._[0])||[".","prepare"].includes(e._[1])))if(M()){const e=n.readJSONSync(F());le(e.profile),de(e.main),ue(e.constants),yield function(){return w(this,void 0,void 0,(function*(){const e=me("latestCheckVersionTimestamp"),i=me("versionCheckDuring");if(Date.now()-Number(e)>24*Number(i)*3600*1e3){let e;ue(yield Pe());try{const i="TIME_OUT",n=new Promise((e=>{setTimeout((()=>e(i)),3e3)}));e=yield Promise.race([n,ie(`npm view ${k.name} version --registry https://registry.npmjs.org/`)]),e!==i&&e!==k.version&&(console.log(`${t.blue(k.name)}本地版本为${k.version},低于线上版本${e},开始升级`),yield Be(e),console.log(t.green(`升级完成,当前版本${e}`)),process.exit(0))}catch(e){console.log("升级出错!请重试,或者手动升级"),Y(e)}}}))}()}else Y("请先初始化z-develop(执行 z i)。更多见https://hxhtbr8t8uy.feishu.cn/docx/RnOhdtqJWo5UooxHTaUcQFwtnKg")}))}function We(){return w(this,void 0,void 0,(function*(){const e=yield Oe({url:`${De()}/groups`}),t=A.map((t=>{const i=e.find((e=>e.name===t));return!!i&&{name:i.name,id:i.id,description:i.description}})).filter((e=>!!e));n.writeJSONSync(K("fe-groups.json"),{groups:t},{spaces:2})}))}function Re(e){return w(this,void 0,void 0,(function*(){const t=`${fe("FEServerDomain")}/api`,{data:i}=yield ze({url:`${t}/auth/z-develop/login`,method:"post"}),n=yield ze({url:t+e.url,headers:{Authorization:`Bearer ${i}`},data:e.data,method:e.method||"post"});return 0!==n.code&&Y(`${n.code}: ${n.message}`),n.data}))}function Ke(e){return Re({url:"/wework-approval/approval/detail",data:e})}function Fe(){return w(this,void 0,void 0,(function*(){const e=(yield Re({url:"/user/list"})).filter((e=>[1,2,3].includes(e.title))).map((e=>({name:`${e.nick} - ${C[e.title]}`,value:e.weWorkUserId}))),t=me("weWorkListCache"),i=t.map((e=>e.value)),n=[];return e.forEach((e=>{const s=i.indexOf(e.value);n.push(Object.assign(Object.assign({},e),{usageCount:s>-1?t[s].usageCount:0}))})),n.sort(((e,t)=>t.usageCount-e.usageCount))}))}function Me(e,t){return w(this,void 0,void 0,(function*(){const i=yield Fe(),{notify:n}=yield p.prompt([{type:"search-checkbox",name:"notify",message:e,choices:i,validate:t}]);return function(e,t){const i=[];t.forEach((t=>{e.includes(t.value)&&i.push(t)}));const n=me("weWorkListCache"),s=n.map((e=>e.value));i.forEach((e=>{const t=s.indexOf(e.value);t>-1?n[t].usageCount+=1:n.push(Object.assign(Object.assign({},e),{usageCount:1}))})),de({weWorkListCache:n.sort(((e,t)=>t.usageCount-e.usageCount))}),ke()}(n,i),n}))}function Ve(){return w(this,void 0,void 0,(function*(){const{processId:e}=yield p.prompt([{type:"input",name:"processId",message:"请输入的企微审批编号"}]);return e}))}function Ge(e,t){return w(this,void 0,void 0,(function*(){const{status:i,applierId:n,form:s}=yield(o={id:e},Re({url:"/wework-approval/approval/detail",data:o}));var o;2!==i&&Y("审批单的状态不是已通过"),n!==pe("weWorkUserId")&&Y("提交审批者与当前执行命令的用户不是同一人");const r={projectName:"",branch:"",rollback:""};s.forEach((({label:e,value:t})=>{"项目"===e&&(r.projectName=t),"分支"===e&&(r.branch=t),"回滚"===e&&(r.rollback=t)})),t.name!==r.projectName&&Y("审批单中的项目与当前项目不是同一个项目"),t.branch&&t.branch!==r.branch&&Y("审批单中的分支与当前分支不是同一个项目"),t.rollback&&"否"===r.rollback&&Y("审批单中没有选择回滚")}))}function He(){return w(this,void 0,void 0,(function*(){try{if(M()){const{isRemove:e}=yield p.prompt([{type:"confirm",name:"isRemove",message:"系统中已存在z的配置文件,确认重新配置?"}]);e?i.rm("-rf",F()):process.exit(0)}o.mkdirSync(K(),{recursive:!0});const{jobType:e,account:t,password:n}=yield p.prompt([{type:"list",name:"jobType",message:"请选择岗位类型",choices:[{name:"前端",value:"fe"},{name:"后端",value:"be"}]},{type:"input",name:"account",message:"请输入LDAP账号:"},{type:"input",name:"password",message:"请输入LDAP密码:"}]);le("jobType",e),le("ldapAccount",t),le("ldapPassword",n);ue(yield Pe());const s=yield Fe(),r=yield Me('"请选择你自己(用于企微通知):',(e=>e.length>1?"只能选一个":!(e.length<1)||"请选一个")),{name:a,value:c}=s.find((e=>e.value===r[0]));le({weWorkName:a,weWorkUserId:c})}catch(e){Y(e)}const e=j("配置信息初始化中").start();try{const t=yield Oe({url:`${De()}/user`});le({gitUserId:t.id,gitName:t.name,gitEnglishName:t.username,gitEmail:t.email}),de("latestCheckVersionTimestamp",Date.now()),ke(),yield We(),e.succeed("配置信息初始化完成"),process.exit(0)}catch(t){e.fail("配置信息初始化失败"),a.isAxiosError(t)&&Y("请检查你的域名及令牌配置"),Y(t)}}))}let Qe;function Ze(e,t){return w(this,void 0,void 0,(function*(){if(e)i.rm("-rf",E);else if(o.existsSync(B())){const{isRemove:e}=yield p.prompt([{type:"confirm",name:"isRemove",message:`当前项目中已存在配置文件夹${E},确认重新配置?`}]);e?i.rm("-rf",E):process.exit(0)}o.mkdirSync(B(),{recursive:!0}),yield function(e,t){return w(this,void 0,void 0,(function*(){const i=yield ie("git remote get-url --push origin");i||Y("获取项目远程地址失败,请配置后重试");let n=e;if(!n){const{language:e}=yield p.prompt([{type:"list",name:"language",message:"请选择项目语言",choices:[{name:"JavaScript",value:"JavaScript"},{name:"Java",value:"Java"}]}]);n=e}let s=t;if(!s){const e=ye(),t=yield Ue(e.name);if(1===t.length)s=t[0].namespace.path;else if(t.length>1){const{groupName:e}=yield p.prompt([{type:"list",name:"groupName",message:"请选择当前项目所属分组",choices:t.map((e=>({name:e.namespace.path,value:e.namespace.path})))}]);s=e}}Qe=j("项目初始化中").start(),be({language:n,"lint-staged":z[n],repository:{url:i,group:s}})}))}(e,t),yield function(){return w(this,void 0,void 0,(function*(){o.writeFileSync(W(),"",{mode:493}),o.writeFileSync(B("commit-msg"),"#!/usr/bin/env sh\nz lint commit-msg",{mode:493}),o.writeFileSync(B("pre-commit"),"#!/usr/bin/env sh\nz lint commit-files",{mode:493}),o.writeFileSync(B(".prettierrc.json"),x,{mode:493}),o.writeFileSync(B(".prettierignore"),S,{mode:493}),o.writeFileSync(B(".gitignore"),".commit-msg-tpl\n",{mode:493}),R()}))}(),null==Qe||Qe.succeed("初始化完成。"),process.exit(0)}))}function Ye(e){return w(this,void 0,void 0,(function*(){if(!e)return"不能为空";if(!/^[a-z0-9-]+$/.test(e))return"格式为小写字母、中横线(可选)、数字(不推荐)。如apple, apple-tree";if(ee().includes(e))return"当前目录下已存在同名文件夹,请先处理。";return!(yield Ue(e)).find((t=>t.name===e))||"远程仓库中已存在同名项目"}))}function Xe(e){return!!e||"不能为空"}function et(e){return e?!!/^[a-zA-Z0-9]+$/.test(e)||"格式为大小写字母、数字,小驼峰命名。如userInfo、systemRouter3":"不能为空"}function tt(e){if(!e)return"目录名称不能为空";if(!/^[a-z][a-z0-9\-\/]*$/.test(e))return"支持小写字母、数字,连字符(-)命名,小写字母开头,多层目录使用/隔开。如user、modules-3、setting/profile";if(e.includes("/")){const t=e.split("/");for(const e of t){if(!e)return"子级目录/页面名称不能为空";if(!/^[a-z][a-z0-9\-]*$/.test(e))return"支持小写字母、数字,连字符(-)命名,小写字母开头。如user、modules-3"}}let t,i;t=e.includes("/")?r.resolve("src","pages",...e.split("/")):r.resolve("src","pages",e);const n=r.resolve(t,"..");return i=!!o.existsSync(n)&&o.readdirSync(n).map((e=>{const t=e.lastIndexOf(".");return t>-1?e.slice(0,t):e})).includes(e),!i||"本地目录已存在该文件"}function it(){return w(this,void 0,void 0,(function*(){var e,s,a,c,l,u;try{const d={},m=()=>w(this,void 0,void 0,(function*(){const e=ee(),{projects:t}=yield Ce(),i=t.map((t=>{const i={name:`${t.name} [${t.desc}]`,value:t.name,disabled:!1};return e.includes(t.name)&&(i.disabled="目录下已存在同名文件夹"),i})),{project:n}=yield p.prompt([{type:"list",name:"project",message:"请选择一个项目模板",choices:i}]),s=t.find((e=>e.name===n));d.tplName=s.name,d.tplUrl=s.url,d.tplLanguage=s.language})),f=()=>w(this,void 0,void 0,(function*(){var e;const{groups:t}=function(){const e=K("fe-groups.json");return o.existsSync(e)?n.readJSONSync(e):{groups:[]}}(),{group:i}=yield p.prompt([{type:"list",name:"group",message:"请选择一个分组",choices:t.map((e=>({name:`${e.name} [${e.description}]`,value:e.id,short:e.name})))}]);d.group={id:i,name:null===(e=t.find((e=>e.id===i)))||void 0===e?void 0:e.name}})),h=()=>w(this,void 0,void 0,(function*(){const{name:e}=yield p.prompt([{type:"input",name:"name",message:"请输入项目名称",validate:Ye}]);d.projectName=e;const{desc:t}=yield p.prompt([{type:"input",name:"desc",message:"请输入项目描述",validate:Xe}]);d.projectDesc=t}));yield m(),yield f(),yield h();const g=`${P}/${null===(e=d.group)||void 0===e?void 0:e.name}/${d.projectName}.git`,y=j("模版初始化中").start();yield ie(`git clone --depth=1 ${d.tplUrl}`),o.renameSync(d.tplName,d.projectName),i.cd(d.projectName),i.rm("-rf",".git"),yield ie("git init --initial-branch=master"),yield ie(`git remote add origin ${g}`),yield ie(`git config user.name ${pe("gitName")}`),yield ie(`git config user.email ${pe("gitEmail")}`);const v=ye();u=Object.assign(Object.assign({},v),{name:d.projectName,description:d.projectDesc,scripts:Object.assign(Object.assign({},v.scripts),{prepare:"z init prepare"})}),he=he?Object.assign(Object.assign({},he),u):u,n.writeJSONSync(r.join("package.json"),he,{spaces:2}),yield n.writeFile(r.resolve("README.md"),function(e="项目中文名",t="项目描述"){return`\n# ${e}\n${t}\n\n## 快速开始\n### 安装依赖\n\`\`\`bash\n npm i\n\`\`\`\n\n### 本地开发\n\`\`\`bash\n npm run dev:{environment}:{platform}\n\`\`\`\n\n> 查看更多关于 [platform](https://zxf-fe.yuque.com/org-wiki-zxf-fe-ex4bve/qi89vg/nttvbeif4a62gtpz#faWqt) 和 [environment](https://zxf-fe.yuque.com/org-wiki-zxf-fe-ex4bve/qi89vg/nttvbeif4a62gtpz#faWqt)\n\n### 打包代码\n\`\`\`bash\n npm run build:{environment}:{platform}\n\`\`\`\n\n### 格式化、修复代码语法\n\`\`\`bash\n z lint prettier\n\`\`\`\n\n> [ESLint相关规范](https://zxf-fe.yuque.com/org-wiki-zxf-fe-ex4bve/qi89vg/ul914hdkqz8fr02g#AkvQ4)\n\n### 格式化文档\n\`\`\`bash\n z lint prettier\n\`\`\`\n\n> [Prettier相关规范](https://zxf-fe.yuque.com/org-wiki-zxf-fe-ex4bve/qi89vg/ul914hdkqz8fr02g#ojpwI)\n\n## 常见问题\n列出开发中常见的问题和解决方案\n\n## 了解更多\n在此处放入语雀文档链接。请在[前端团队-项目手册](https://zxf-fe.yuque.com/org-wiki-zxf-fe-ex4bve/qi89vg/bfrcicwzosoyaifg)中按照分类新建文档。\n`}(d.projectName,d.projectDesc)),y.succeed("模版初始化完成"),yield Ze(d.tplLanguage,null===(s=d.group)||void 0===s?void 0:s.name);const b=j("依赖安装中").start();yield ie("npm install"),b.succeed("依赖安装完成");const $=j("项目推送中").start();yield ie('git add . && git commit -m "chore: init"');const k=yield(l={name:d.projectName,description:d.projectDesc,path:d.projectName,visibility:"private",namespace_id:null===(a=d.group)||void 0===a?void 0:a.id},Oe({url:`${De()}/projects`,method:"post",data:l}));yield ie("git push -u origin master"),$.succeed(`项目已推送到远程,地址: ${t.blue(g)}`);const x=j("初始化分支中").start(),S=`feat_init_${ne()}`,z=ae(null===(c=d.group)||void 0===c?void 0:c.name)?["dev","test","release",S]:[S],N=yield Promise.allSettled(z.map((e=>function(e){return Oe({url:`${De()}/projects/${e.id}/repository/branches`,method:"post",data:e})}({id:k.id,branch:e,ref:"master"})))),O=[];N.forEach((({status:e},t)=>{"fulfilled"===e&&O.push(z[t])})),yield ie("git pull"),O.includes(S)?(yield ie(`git checkout -b ${S} origin/${S}`),x.succeed(`项目已切换到初始分支: ${t.blue(S)}`)):x.warn("开发分支检出失败!项目当前在主分支,请自行检出开发分支。");const E=`cd ${d.projectName} && z start`;console.log(`输入 ${t.green(E)} 开始开发吧~`),process.exit(0)}catch(e){Y(e)}}))}e.command("init").alias("i").argument("[type]","非必填。不传为初始化工具配置;传 . 为初始化当前项目。").description("初始化工具配置、项目配置").action((function(e){return w(this,void 0,void 0,(function*(){e?"."===e?(oe(),yield Ze(void 0,void 0),process.exit(0)):"prepare"===e?(oe(),yield function(){return w(this,void 0,void 0,(function*(){o.existsSync(B())&&o.existsSync(W())?R():yield Ze(),process.exit(0)}))}()):Y("参数错误。执行 z init -h 查看帮助。"):yield He()}))}));const nt=e=>`${fe("ZenTaoDomain")}${e}`;function st(e){return 0!==e.length||"请选择项"}function ot(){return w(this,void 0,void 0,(function*(){const{type:e}=yield p.prompt({type:"list",name:"type",message:"请选择你要创建的模板类型",choices:[{name:"feat - 业务需求开发",value:"feat"},{name:"fix - bug修复",value:"fix"},{name:"refactor - 技术内部需求",value:"refactor"},{name:"chore - 其他",value:"chore"}]});if(["feat","refactor"].includes(e)){const e=yield function(){return w(this,void 0,void 0,(function*(){const e=yield Te({url:nt("/my-work-task.json?tid=mrrferp8"),method:"get"});return null==e?void 0:e.tasks.map((({id:e,name:t})=>({value:{name:t,value:e},name:t})))}))}(),{tasks:t}=yield p.prompt({type:"checkbox",name:"tasks",message:"请关联开发任务(可多选):",validate:st,choices:e.map((e=>Object.assign(Object.assign({},e),{name:`[${e.value.value}]: ${e.name}`})))});rt("feat",t)}else if("fix"===e){const e=yield function(){return w(this,void 0,void 0,(function*(){const e=yield Te({url:nt("/my-work-bug.json?tid=mrrferp8"),method:"get"});return null==e?void 0:e.bugs.map((({id:e,title:t})=>({name:t,value:{name:t,value:e}})))}))}(),{bugs:t}=yield p.prompt({type:"checkbox",name:"bugs",message:"请关联Bug(可多选):",validate:st,choices:e.map((e=>Object.assign(Object.assign({},e),{name:`[${e.value.value}]: ${e.name}`})))});rt("fix",t)}else if("chore"===e){const{msg:e}=yield p.prompt({type:"input",name:"msg",message:"请输入commit msg:",validate:e=>0!==e.length||"请输入commit msg"});rt("chore",[e])}}))}function rt(e,i){let n="";if(["feat","refactor","fix"].includes(e)){n=`${e}(${i.map((e=>e.value)).join(",")}): ${i.map((e=>e.name)).join(";")}`}"chore"===e&&(n=`${e}: ${i[0]}`),o.writeFileSync(W(),n,"utf-8"),console.log(t.yellow(n)),Z("commit msg模板写入成功,可以进行提交了")}function at(e){return qe({url:`${fe("K8sDomain")}/kapis/clusters/youshou-local/devops.kubesphere.io/v1alpha3/namespaces/${L}/pipelines/${e.projectName}/pipelineruns?branch=${e.branchName}`,method:"post",data:e.params})}function ct(e){return w(this,void 0,void 0,(function*(){const{targetBranch:t,platform:i,notify:n,processId:s,projectName:o}=e,r=n?[...new Set([pe("weWorkUserId"),...n])]:[pe("weWorkUserId")];yield at({projectName:o,branchName:t,params:{parameters:[{name:"platform",value:i},{name:"notify",value:r.join(",")},{name:"processId",value:s||""},{name:"promoterName",value:pe("weWorkName")},{name:"promoterId",value:pe("weWorkUserId")},{name:"rollback",value:String(e.rollback)}]}})}))}function lt(e,t){return w(this,void 0,void 0,(function*(){se(),oe(),yield re();let i=e;if(i&&!I.includes(i)&&Y("仅支持发布指定环境分支"),!i){const{environment:e}=yield p.prompt([{type:"list",name:"environment",message:"请选择部署环境",choices:q}]);i="production"===(n=e)?"master":n}var n;const{platform:s}=yield p.prompt([{type:"list",name:"platform",message:"请选择平台",choices:D}]),o=yield Me("请选择部署成功要通知的人员:",(e=>!(e.length<1)||"至少选一个"));var r;!function(e,t){var i,n,s,o,r;const a=ye(),c=ve();(null===(i=null==c?void 0:c.repository)||void 0===i?void 0:i.url)||Y(".z/project.json中缺少repository.url");const l=`build:${e}`;(null==a?void 0:a.scripts[l])||Y(`项目package.json文件scripts不存在命令${l}。`);["alipay","weapp"].includes(t)&&(a.mini||Y("请在package.json配置mini字段"),"alipay"===t&&((null===(s=null===(n=a.mini)||void 0===n?void 0:n.alipay)||void 0===s?void 0:s.appid)||Y("请在package.json配置mini.alipay.appid字段")),"weapp"===t&&((null===(r=null===(o=a.mini)||void 0===o?void 0:o.weapp)||void 0===r?void 0:r.appid)||Y("请在package.json配置mini.weapp.appid字段")))}("master"===(r=i)?"production":r,s);const a=ye();let c=t||"";"master"===i&&(c||(c=yield Ve(),yield Ge(c,{name:a.name}),yield Ke({id:c,state:2}))),yield ct({projectName:a.name,targetBranch:i,platform:s,notify:o,processId:c,rollback:!1})}))}function ut(){const e=J();if(o.existsSync(e)){const t=n.readJsonSync(e);if(t["lint-staged"])return t["lint-staged"];throw new Error("未找到lint配置")}throw new Error("请先初始化项目(z i .)。")}e.command("create").alias("c").argument("[type]","可选值为project|pr, branch|b, commit-msg|cm, page|p, component|co").description("创建项目/分支/提交信息/页面/组件").action((function(e){return w(this,void 0,void 0,(function*(){let t;if(e)["project","pr"].includes(e)?t="project":["branch","b"].includes(e)?t="branch":["page","pa"].includes(e)?t="page":["component","co"].includes(e)?t="component":["commit-msg","cm"].includes(e)?t="commit-msg":Y("参数输入错误");else{t=(yield p.prompt({type:"list",name:"type",message:"请选择你要创建的类型",choices:[{name:"提交信息(commit message)",value:"commit-msg"},{name:"分支(branch)",value:"branch"},{name:"页面(page)",value:"page"},{name:"组件(component)",value:"component"},{name:"项目(project)",value:"project"}]})).type}"project"===t?yield it():"branch"===t?(se(),oe(),yield re(),yield function(){return w(this,void 0,void 0,(function*(){se(),oe(),yield re();const{type:e,purpose:t}=yield p.prompt([{name:"type",type:"list",message:"请选择创建分支的类型",choices:[{name:"开发新功能(feat)",value:"feat"},{name:"修复BUG(fix)",value:"fix"},{name:"重构/优化代码(refactor)",value:"refactor"}]},{name:"purpose",type:"input",message:"请输入创建分支的目的(大小写字母、数字,小驼峰式命名。如userInfo)",validate:et}]),i=`${e}_${t}_${ne()}`;yield ie("git fetch origin master"),yield ie(`git checkout -b ${i} origin/master`),yield ie(`git push -u origin ${i}`)}))}()):"commit-msg"===t?(se(),oe(),yield ot()):"page"===t?(se(),oe(),yield function(){return w(this,void 0,void 0,(function*(){const e="pages",t=yield we(e);o.mkdirSync(r.resolve("src",e),{recursive:!0});const{dirPageName:n}=yield p.prompt([{name:"dirPageName",type:"input",message:"请输入目录及页面名称(如user/list,不带文件后缀)",validate:tt}]);let s;if(n.includes("/")){const t=n.split("/");t.pop(),s=r.resolve("src",e,...n.split("/")),o.mkdirSync(r.resolve("src",e,...t),{recursive:!0})}else s=r.resolve("src",e,n);const{pages:a}=yield Ce(),c=o.readdirSync(t),{tplName:l}=yield p.prompt([{name:"tplName",type:"list",message:"请选择模版",choices:a.map((e=>!!c.includes(e.name)&&{name:`${e.name}: ${e.desc}(${e.author})`,value:e.name})).filter((e=>e))}]),u=j("页面生成中...").start(),d=s+r.extname(r.join(t,l));i.cp("-r",r.join(t,l),d),X(d)?te(d).forEach((e=>{Se(r.join(d,e),n)})):Se(d,n),u.succeed("页面生成成功")}))}()):"component"===t&&(se(),oe(),yield function(){return w(this,void 0,void 0,(function*(){const e="components",t=yield we("components");o.mkdirSync(r.resolve("src",e),{recursive:!0});const{dirPageName:n}=yield p.prompt([{name:"dirPageName",type:"input",message:"请输入目录及组件名称(如user/list,不带文件后缀)",validate:tt}]);let s;if(n.includes("/")){const t=n.split("/"),i=t.pop();s=r.resolve("src",e,...t.split("/"),xe(i)),o.mkdirSync(r.resolve("src",e,...t),{recursive:!0})}else s=r.resolve("src",e,xe(n));const{components:a}=yield Ce(),c=o.readdirSync(t),{tplName:l}=yield p.prompt([{name:"tplName",type:"list",message:"请选择模版",choices:a.map((e=>!!c.includes(e.name)&&{name:`${e.name}: ${e.desc}(${e.author})`,value:e.name})).filter((e=>e))}]),u=j("组件生成中...").start(),d=s+r.extname(r.join(t,l));i.cp("-r",r.join(t,l),d),X(d)?te(d).forEach((e=>{Se(r.join(d,e),n)})):Se(d,n),u.succeed("组件生成成功")}))}()),process.exit(0)}))})),e.command("merge").alias("m").description("合并当前分支到指定远程分支,并部署。").action((function(){return w(this,void 0,void 0,(function*(){var e;se(),oe(),yield re();const i=yield $e();I.includes(i.sourceBranch)&&Y(`当前分支${i.sourceBranch}不可作为源分支合并到目标分支。`);const n=yield(s=i.id,Oe({url:`${De()}/projects/${s}/repository/branches`}));var s;const o=ae(i.group),r=n.filter((e=>![i.sourceBranch].includes(e.name))).map((e=>{let i=e.name;return o&&I.includes(i)&&(i=t.bold.blue(i)),{name:i,value:e.name}})),{target:c}=yield p.prompt([{type:"list",name:"target",message:"请选择要合并到的目标分支:",choices:r}]);let l;"master"===c&&(l=yield Ve(),yield Ge(l,{name:i.name,branch:i.sourceBranch}),yield Ke({id:l,state:1}));const u=j(`${i.sourceBranch}分支推送中`).start();(yield ie(`git ls-remote --heads origin ${i.sourceBranch}`))&&(yield ie("git pull")),yield ie(`git push -u origin ${i.sourceBranch}`),u.succeed(`${i.sourceBranch}已推送到远程`),yield function(e,t,i){return w(this,void 0,void 0,(function*(){const n=`origin/${e}`,s=yield ie("git log -b origin/master -1 --format=%H"),o=yield ie(`git log -b origin/${e} -1 --format=%H`),r=yield ie(`git log ${s}...${o} -b ${n}`);if(r||Y(`分支${e}上不存在新的commit,合并终止。`),"master"===t){if(i){const e=r.split("\n").filter((e=>e)),t=yield ie("git log -b origin/test -1 --format=%H");(function(e,t){for(let i of t)if(!e.includes(i))return!1;return!0})((yield ie(`git log ${s}...${t} -b origin/test`)).split("\n").filter((e=>e)),e)||Y("请先在测试环境发布要部署的代码")}}else{(yield ie(`git branch --contains ${s} -r ${n}`))||Y(`请先将最新的主分支(master)代码合并到${n},再进行部署。推荐命令:git merge origin/master`)}}))}(i.sourceBranch,c,o);const d=j("分支合并中").start();let m=0;try{const{iid:e}=yield(f={title:"MR by z-develop",id:i.id,source_branch:i.sourceBranch,target_branch:c,remove_source_branch:"master"===c},Oe({url:`${De()}/projects/${f.id}/merge_requests`,method:"post",data:f}));m=e}catch(t){if(a.isAxiosError(t)){409===(null===(e=null==t?void 0:t.response)||void 0===e?void 0:e.status)&&Y(`存在重复的合并请求,前往查看${i.mergeRequestUrl}`)}Y(t)}var f;const h=()=>w(this,void 0,void 0,(function*(){var e;try{yield new Promise((e=>{setTimeout(e,5e3)})),yield function(e){return Oe({url:`${De()}/projects/${e.id}/merge_requests/${e.iid}/merge`,method:"put"})}({id:i.id,iid:m})}catch(t){if(a.isAxiosError(t)){406===(null===(e=null==t?void 0:t.response)||void 0===e?void 0:e.status)?yield h():(yield function(e){return Oe({url:`${De()}/projects/${e.id}/merge_requests/${e.iid}`,method:"put",data:e})}({id:i.id,iid:m,state_event:"close"}),d.fail("合并过程中出现冲突,MR已关闭。建议在本地完成合并。"),process.exit(1))}else Y(t)}}));yield h(),d.succeed("分支合并成功"),"master"===c&&(yield ie("git checkout master"),yield ie("git pull"),yield ie(`git branch -d ${i.sourceBranch}`),Z(`\n${i.sourceBranch}分支已移除,当前已切换到最新的master。\n如需继续开发,请检出新分支(z c b)。\n`)),o&&I.includes(c)&&(yield lt(c,l))}))})),e.command("deploy").alias("d").description("发布指定远程分支").argument("[branchName]","可选值为dev/test/release/master").argument("[processId]","审批编号,branchName为master时需要").action(lt),e.command("start").alias("s").description("启动本地开发环境").argument("[env]","可选值 dev|d, test|t, release|r, prod|p").action((function(e){return w(this,void 0,void 0,(function*(){let t=e;if(t)["dev","test","release","production","d","t","r","p"].includes(e)?"d"===t?t="dev":"t"===t?t="test":"r"===t?t="release":"p"===t&&(t="production"):Y("参数输入有误");else{const{environment:e}=yield p.prompt([{type:"list",name:"environment",message:"请选择环境",choices:q}]);t=e}const n=`dev:${t}`;if(ye().scripts[n])try{i.exec(`npm run ${n}`,{silent:!1})}catch(e){Y(e)}else Y(`项目中(package.josn > scripts)不存在命令${n},请先添加!`)}))})),e.command("lint").alias("l").argument("[type]","非必填。可选值为commit-msg|cm, commit-files|cf, prettier|p, eslint|e。").description("执行 lint 脚本。包含 lint staged 、 lint commit message、 prettier、 eslint。").action((function(e){return w(this,void 0,void 0,(function*(){let t;if(se(),oe(),e)["commit-msg","cm"].includes(e)?t="commit-msg":["commit-files","cf"].includes(e)?t="commit-files":["prettier","p"].includes(e)?t="prettier":["eslint","e"].includes(e)?t="eslint":Y("参数输入错误");else{t=(yield p.prompt({type:"list",name:"type",message:"请选择你要执行的操作",choices:[{name:"全局执行 prettier",value:"prettier"},{name:"全局执行 eslint",value:"eslint"}]})).type}if("commit-msg"===t)yield function(){return w(this,void 0,void 0,(function*(){const e=function(e){const t=o.readFileSync(r.resolve(".git","COMMIT_EDITMSG"),"utf-8").split(": ");if(1===t.length)return"body前缺少「: 」";{const e=t[0];return/^(feat|fix|refactor)/.test(e)?!!/\(\d+(?:,\d+)*\)/.test(e)||"ID缺少或者格式不正确。":/^chore/.test(e)?"chore"===e||"chore类型无需填写ID。":"不存在的提交类型。"}}();!0===e?(Z("commit msg validate success."),process.exit(0)):Y(`commit msg格式错误。${e}`)}))}();else if("commit-files"===t)yield function(){return w(this,void 0,void 0,(function*(){(yield $({concurrent:!1,debug:void 0,config:ut()}))?(Z("代码风格检测通过!"),process.exit(0)):Y("代码风格检测未通过!")}))}();else if("prettier"===t){o.existsSync(r.resolve("node_modules",".bin","prettier"))||Y("该项目未安装prettier,请安装后重试");try{yield ie("npx prettier --write . --config .z/.prettierrc.json --ignore-path .z/.prettierignore --ignore-unknown --no-error-on-unmatched-pattern",{silent:!1}),Z("prettier执行成功"),process.exit(0)}catch(e){Y("prettier校验出错")}}else if("eslint"===t){console.log(r.resolve("node_modules",".bin","eslint")),o.existsSync(r.resolve("node_modules",".bin","eslint"))||Y("该项目未安装eslint,请安装后重试");try{let e="npx eslint '**/*.{vue,js,jsx,cjs,mjs,ts,tsx,cts,mts}' --fix";"win32"===process.platform&&(e='npx eslint "**/*.{vue,js,jsx,cjs,mjs,ts,tsx,cts,mts}" --fix'),yield ie(e,{silent:!1}),Z("eslint执行成功"),process.exit(0)}catch(e){Y("eslint校验出错")}}}))})),e.command("rollback").alias("r").description("正式环境回滚").argument("[processId]","非必填。审批单ID。").action((function(e){return w(this,void 0,void 0,(function*(){se(),oe();let t=e||"";const i=ye();t||(t=yield Ve(),yield Ge(t,{name:i.name,rollback:!0}),yield Ke({id:t,state:2}));const{platform:n}=yield p.prompt([{type:"list",name:"platform",message:"请选择平台",choices:D}]),s=yield Me("请选择回滚成功要通知的人员:",(e=>!(e.length<1)||"至少选一个"));yield ct({projectName:i.name,targetBranch:"master",platform:n,notify:s,processId:t,rollback:!0})}))})),e.command("update").alias("u").argument("[version]","版本号","latest").description("升级").action(Be),function(){w(this,void 0,void 0,(function*(){process.on("unhandledRejection",(e=>{})),process.on("uncaughtException",(e=>{})),i.config.fatal=!0,i.config.silent=!0,i.config.verbose=!1,yield Je(),p.registerPrompt("search-checkbox",Le)}))}(),e.name("z-develop").alias("z").description(`z-develop, 开发流程管理工具。\n了解更多: ${t.blue("https://hxhtbr8t8uy.feishu.cn/docx/RnOhdtqJWo5UooxHTaUcQFwtnKg")}`).usage("<command> [options]").version(k.version,"-v, --version","当前版本号").helpOption("-h, --help","帮助").showHelpAfterError("可以使用z -h查看帮助。"),e.parse();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cli-z-develop",
3
- "version": "0.0.40",
3
+ "version": "0.0.43",
4
4
  "description": "前端本地开发命令行工具",
5
5
  "main": "dist/index.js",
6
6
  "bin": {