@jerryc05/hi-tools 0.1.7 → 0.1.10

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 +16 -19
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -1,25 +1,22 @@
1
1
  #!/usr/bin/env node
2
- typeof globalThis.CustomEvent>"u"&&(globalThis.CustomEvent=class extends Event{constructor(t,n={}){super(t,n),this.detail=n.detail}});import{readFile as be}from"node:fs/promises";import{join as he}from"node:path";var _=[{cmd:{name:"bm <target>",desc:"[B]ranch [M]erge: merge current HEAD into target branch without switching"},action:async e=>{throw console.log(`\u{1F680} Starting silent merge: HEAD -> ${e}`),new Error("Not implemeted!")}}];import{networkInterfaces as oe}from"node:os";var k=[{cmd:{name:"ips",desc:"Show current machine's IP addrs"},options:[{name:"-4, --onlyIpv4",desc:"IPv4 only"},{name:"-6, --onlyIpv6",desc:"IPv6 only"}],action:({onlyIpv4:e,onlyIpv6:t})=>{let n=oe(),i={};for(let[o,r]of Object.entries(n))r=r?.filter(s=>e?s.family==="IPv4":t?s.family==="IPv6":!0),r?.length&&(i[o]=r.map(s=>s.address));console.log(i)}}];async function re({repoID:e,hash:t,branch:n}){let i="SCM_USERNAME",o="SCM_PASSWORD",r=process.env[i],s=process.env[o];(!r||!s)&&(console.log(`Missing ${r?o:i} in env var.
3
- Go to https://luban.bytedance.net/npm/publish and get your personal SCM username + password.`),process.exit(1));let{execa:l}=await import("execa");try{let a=l`git log -1 --pretty=%s`,c,p;n?n===!0?p=(await l`git branch --show-current`).stdout.trim():p=n:t&&(t===!0?c=(await l`git rev-parse HEAD`).stdout.trim():c=t);let f={repos:e,create_user:r,pub_base:c?"commit_base":"branch_base",base_commit_hash:c??"",branch_name:p??"",desc:`[${u?.version}] ${(await a).stdout.trim()}`,has_version_stage:!1};console.log(`\u2139\uFE0F ${f.create_user} is publishing ${u?.name}@${u?.version} to repoID=${f.repos}
4
- ${c?`hash=${c}`:`brch=${p}`}
5
- desc=${f.desc}`);let b=await fetch("https://scm.byted.org/api/v2/npm_versions/",{method:"POST",headers:{Authorization:`Basic ${Buffer.from(`${r}:${s}`).toString("base64")}`,Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(f)});if(!b.ok){let C=await b.text();console.log(`\u274C HTTP ${b.status} Error: ${C}`),process.exit(1)}let $=await b.json();console.log("\u{1F389} Successfully published:",$)}catch(a){console.error("\u274C Execution Failed:",a),process.exit(1)}}var P=[{cmd:{name:"tt-npm-pub <repoID>",desc:"[PUB]lish current hash of current repo to Luban"},options:[{name:"--hash [hash]",desc:"Publish pkg by hash (default)"},{name:"-b, --branch [branch]",desc:"Publish pkg by branch"}],action:re}];import{hostname as ie}from"node:os";var A=[{cmd:{name:"mdns",desc:"Show mdns hostname.local"},action:()=>{let e=ie();console.log(e.toLowerCase().endsWith(".local")?e:`${e}.local`)}}];import m from"picocolors";var h=e=>console.log(m.underline(m.blue(`\u23F3 ${e}`))),E=()=>console.log(m.bold(m.underline(m.green("\u{1F389} DONE!")))),S=e=>console.log(m.underline(`
6
- \u274C ${m.bold(m.bgRed(e))}`)),D=e=>console.log(m.bold(m.underline(m.green(`\u2705 ${e}`)))),R=e=>console.log(m.underline(m.yellow(`\u{1F4AC} ${e}`))),T=e=>console.log(m.bold(m.underline(m.green(`\u{1F44B} ${e}`))));async function U(){let{execa:e}=await import("execa");try{let{stdout:t}=await e`git rev-parse --abbrev-ref --symbolic-full-name @{u}`;return t.split("/")[0]||"origin"}catch{return"origin"}}async function N(e){h(`${e?"Updating":"Fetching"} master...`);let{execa:t}=await import("execa");await t({stdio:"inherit",env:{GIT_TRACE:"1"}})`git fetch ${await U()} master${e?":master":""}`,h("Merging ..."),await t({stdio:"inherit",env:{GIT_TRACE:"1"}})`git merge ${await U()}/master --no-verify --no-edit`,E()}var J=[{cmd:{name:"mm",desc:"[M]erge [M]aster: Update local master to remote's, then merge into current branch"},action:()=>N(!0)},{cmd:{name:"mmm",desc:"[M]erge [M]aster (don't [M]odify local master): Merge remote's master into current branch, without updating local master"},action:()=>N(!1)}];var H=[{cmd:{name:"tschk",desc:"My ts-check rules"},action:async()=>{h("Running custom tsc type-check...");let e=["2322","2339","2551","6133","6192","18048"],{execa:t}=await import("execa");try{let{stdout:n}=await t({reject:!1,stderr:"ignore"})`npx tsc --noEmit --emitDeclarationOnly false`,i=n.split(`
7
- `).filter(o=>{if(o.includes("/node_modules/"))return!1;let r=o.match(/error TS(\d+):/);return!(!r?.[1]||e.includes(r[1]))});i.length>0?(i.map(o=>console.log(o)),S("Type-check failed!"),process.exit(1)):D("Type-check passed!")}catch(n){S("Type-check: Unexpected err:"),console.error(n),process.exit(1)}}}];var j=[{cmd:{name:"tt-bam",desc:"Update BAM code-gen"},action:async()=>{let{execa:e}=await import("execa");await e({stdio:"inherit"})`pnpm dlx @byted-arch-fe/bam-code-generator update`}}];import{cancel as B,isCancel as q,log as w,note as F,select as K}from"@clack/prompts";import g from"picocolors";var L="https://bits.bytedance.net";async function v(e,t,n,i){let o={...e,pageNum:e.pageNum??1},r=`${L}/api/v1/pipelines/runs?${new URLSearchParams(o).toString()}`,s=await fetch(r,{method:"GET",headers:{"Content-Type":"application/json","X-jwt-token":t,Username:n.username},signal:i??null});return{response:s,getJson:async()=>await s.json()}}async function G(e,t,n){let i=`${L}/api/v1/pipelines/runs/${e}`,o=await fetch(i,{method:"GET",headers:{"Content-Type":"application/json","X-jwt-token":t,Username:n.username}});return{response:o,getJson:async()=>await o.json()}}var I={RUNNING:2,CANCELLED:7,SUCCESS:8,FAILURE:9};import{cac as se}from"cac";var d=se("hi");function y(e){return new Intl.DateTimeFormat("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",timeZoneName:"short"}).format(new Date(e))}import O from"picocolors";var x;async function M(){if(h("Logging in..."),!x){let{AIPaaSAuth:n}=await import("@byted/aipaas-auth");x=new n("cn")}let e=await x.getJwt(),t=await x.getUserInfo();return T(`Hi ${O.magenta(t.username)} from ${O.blue(`${t.scope} ${t.work_country}`)}`),R(` Login will expire on ${y(t.exp*1e3)}`),{jwtStr:e,jwtObj:t}}async function ae({pipelineId:e,url:t,region:n}){let{jwtStr:i,jwtObj:o}=await M(),r=(()=>{if(e==null&&!t)throw new Error("pipelineId or url is required");return e??z(t??"")})(),s=(await W(r,i,o)).filter(a=>a.region?.includes(n??""));if(s.length<=0){w.error(`No Gecko info found${n?` matching region [${n}]`:""} in latest run`);return}let{default:l}=await import("qrcode");for(let a=0;a<s.length;a++){let c=s[a];try{let p=await l.toString(c?.qrCodeScheme??"",{type:"terminal",small:!0,errorCorrectionLevel:"L"});console.log(`
2
+ typeof globalThis.CustomEvent>"u"&&(globalThis.CustomEvent=class extends Event{constructor(n,t={}){super(n,t),this.detail=t.detail}});import{readFile as ge}from"node:fs/promises";import{join as fe}from"node:path";import{log as he}from"@clack/prompts";var C=[{cmd:{name:"bm <target>",desc:"[B]ranch [M]erge: merge current HEAD into target branch without switching"},action:async e=>{throw console.log(`\u{1F680} Starting silent merge: HEAD -> ${e}`),new Error("Not implemeted!")}}];import{networkInterfaces as X}from"node:os";var S=[{cmd:{name:"ips",desc:"Show current machine's IP addrs"},options:[{name:"-4, --onlyIpv4",desc:"IPv4 only"},{name:"-6, --onlyIpv6",desc:"IPv6 only"}],action:({onlyIpv4:e,onlyIpv6:n})=>{let t=X(),i={};for(let[o,r]of Object.entries(t))r=r?.filter(s=>e?s.family==="IPv4":n?s.family==="IPv6":!0),r?.length&&(i[o]=r.map(s=>s.address));console.log(i)}}];async function Z({repoID:e,hash:n,branch:t}){let i="SCM_USERNAME",o="SCM_PASSWORD",r=process.env[i],s=process.env[o];(!r||!s)&&(console.log(`Missing ${r?o:i} in env var.
3
+ Go to https://luban.bytedance.net/npm/publish and get your personal SCM username + password.`),process.exit(1));let{execa:m}=await import("execa");try{let c=m`git log -1 --pretty=%s`,a,p;t?t===!0?p=(await m`git branch --show-current`).stdout.trim():p=t:n&&(n===!0?a=(await m`git rev-parse HEAD`).stdout.trim():a=n);let g={repos:e,create_user:r,pub_base:a?"commit_base":"branch_base",base_commit_hash:a??"",branch_name:p??"",desc:`[${l?.version}] ${(await c).stdout.trim()}`,has_version_stage:!1};console.log(`\u2139\uFE0F ${g.create_user} is publishing ${l?.name}@${l?.version} to repoID=${g.repos}
4
+ ${a?`hash=${a}`:`brch=${p}`}
5
+ desc=${g.desc}`);let f=await fetch("https://scm.byted.org/api/v2/npm_versions/",{method:"POST",headers:{Authorization:`Basic ${Buffer.from(`${r}:${s}`).toString("base64")}`,Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(g)});if(!f.ok){let R=await f.text();console.log(`\u274C HTTP ${f.status} Error: ${R}`),process.exit(1)}let I=await f.json();console.log("\u{1F389} Successfully published:",I)}catch(c){console.error("\u274C Execution Failed:",c),process.exit(1)}}var v=[{cmd:{name:"tt-npm-pub <repoID>",desc:"[PUB]lish current hash of current repo to Luban"},options:[{name:"--hash [hash]",desc:"Publish pkg by hash (default)"},{name:"-b, --branch [branch]",desc:"Publish pkg by branch"}],action:Z}];import{hostname as Y}from"node:os";var _=[{cmd:{name:"mdns",desc:"Show mdns hostname.local"},action:()=>{let e=Y();console.log(e.toLowerCase().endsWith(".local")?e:`${e}.local`)}}];import{spinner as ee}from"@clack/prompts";async function k(){let{execa:e}=await import("execa");try{let{stdout:n}=await e`git rev-parse --abbrev-ref --symbolic-full-name @{u}`;return n.split("/")[0]||"origin"}catch{return"origin"}}async function P(e){let n=ee();n.start(`${e?"Updating":"Fetching"} master...`);let{execa:t}=await import("execa");await t({stdio:"inherit",env:{GIT_TRACE:"1"}})`git fetch ${await k()} master${e?":master":""}`,n.start("Merging ..."),await t({stdio:"inherit",env:{GIT_TRACE:"1"}})`git merge ${await k()}/master --no-verify --no-edit`,n.stop("Done")}var A=[{cmd:{name:"mm",desc:"[M]erge [M]aster: Update local master to remote's, then merge into current branch"},action:()=>P(!0)},{cmd:{name:"mmm",desc:"[M]erge [M]aster (don't [M]odify local master): Merge remote's master into current branch, without updating local master"},action:()=>P(!1)}];import{log as $,spinner as te}from"@clack/prompts";var D=[{cmd:{name:"tschk",desc:"My ts-check rules"},action:async()=>{let e=te();e.start("Running custom tsc type-check...");let n=["2322","2339","2551","6133","6192","18048"],{execa:t}=await import("execa");try{let{stdout:i}=await t({reject:!1,stderr:"ignore"})`npx tsc --noEmit --emitDeclarationOnly false`,o=i.split(`
6
+ `).filter(r=>{if(r.includes("/node_modules/"))return!1;let s=r.match(/error TS(\d+):/);return!(!s?.[1]||n.includes(s[1]))});o.length>0?(o.map(r=>console.log(r)),e.stop("Type-check completed"),$.error("Type-check failed!"),process.exit(1)):(e.stop("Type-check completed"),$.success("Type-check passed!"))}catch(i){e.stop("Type-check completed"),$.error("Type-check failed!"),console.error(i),process.exit(1)}}}];var E=[{cmd:{name:"tt-bam",desc:"Update BAM code-gen"},action:async()=>{let{execa:e}=await import("execa");await e({stdio:"inherit"})`pnpm dlx @byted-arch-fe/bam-code-generator update`}}];import{cancel as H,isCancel as j,log as b,note as L,select as G}from"@clack/prompts";import d from"picocolors";var T="https://bits.bytedance.net";async function x(e,n,t,i){let o={...e,pageNum:e.pageNum??1},r=`${T}/api/v1/pipelines/runs?${new URLSearchParams(o).toString()}`,s=await fetch(r,{method:"GET",headers:{"Content-Type":"application/json","X-jwt-token":n,Username:t.username},signal:i??null});return{response:s,getJson:async()=>await s.json()}}async function U(e,n,t){let i=`${T}/api/v1/pipelines/runs/${e}`,o=await fetch(i,{method:"GET",headers:{"Content-Type":"application/json","X-jwt-token":n,Username:t.username}});return{response:o,getJson:async()=>await o.json()}}var y={RUNNING:2,CANCELLED:7,SUCCESS:8,FAILURE:9};import{cac as ne}from"cac";var u=ne("hi");function h(e){return new Intl.DateTimeFormat("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",timeZoneName:"short"}).format(new Date(e))}import{log as oe,spinner as re}from"@clack/prompts";import J from"picocolors";var w;async function N(){let e=re();if(e.start("Logging in..."),!w){let{AIPaaSAuth:i}=await import("@byted/aipaas-auth");w=new i("cn")}let n=await w.getJwt(),t=await w.getUserInfo();return e.stop(`Hi ${J.magenta(t.username)} from ${J.blue(`${t.scope} ${t.work_country}`)}`),oe.info(`Login will expire on ${h(t.exp*1e3)}`),{jwtStr:n,jwtObj:t}}async function ie({pipelineId:e,url:n,region:t}){let{jwtStr:i,jwtObj:o}=await N(),r=(()=>{if(e==null&&!n)throw new Error("pipelineId or url is required");return e??M(n??"")})(),s=await O(r,i,o,t);if(s.length<=0){b.error(`No Gecko info found${t?` matching region [${t}]`:""} in latest run`);return}let{default:m}=await import("qrcode");for(let c=0;c<s.length;c++){let a=s[c];try{let p=await m.toString(a?.qrCodeScheme??"",{type:"terminal",small:!0,errorCorrectionLevel:"L"});console.log(`
8
7
 
9
- ${p}`),console.dir(c),a<s.length-1&&console.log(`
8
+ ${p}`),console.dir(a),c<s.length-1&&console.log(`
10
9
 
11
10
  -----------------
12
11
 
13
- `)}catch(p){console.error("Failed to generate QR:",p)}}}async function W(e,t,n){let{response:i,getJson:o}=await v({pipelineId:e,pageSize:1,withoutJob:!1},t,n);i.ok||(w.error(`[getRunInfoByPipelineID] failed: ${i.status} ${i.statusText}
14
- ${await i.text()}`),process.exit(1));let r=await o();r.pipelineRuns[0]?.runStatus!==I.SUCCESS&&w.warn(`Latest run (runId=${r.pipelineRuns[0]?.runId}) status=${Q(r.pipelineRuns[0]?.runStatus)}. Gecko info may be unavailable.`);let s=V(r.pipelineRuns);if(s.length)return s;let l=await ce(e,r.pipelineRuns);if(l)return W(l,t,n);let a=await le(e,t,n);return await me(a,t,n)}function z(e){let t=/\bpipelineId=(\d+)\b/,n=e.match(t);if(n?.[1])return n[1];throw new Error(`Invalid URL. Expecting a url containing ${g.bold(g.yellow("pipelineId"))} query param. E.g. `+g.underline(g.gray(`https://b??.net/devops/??/develop/detail/??/flow?devops_space_type=server_fe&${g.bold(g.magenta("pipelineId=1139212901634"))}&stage=dev_gatekeeper_stage`)))}function V(e){return e.flatMap(t=>t.jobs.map(n=>{try{let i=n.jobAtom.output;if(!i)return null;let o=i.GECKO_packageInfo;if(!o)return null;let r=JSON.parse(o),{qrCodeScheme:s,candidatePackage:l,channel:a,updatedAt:c,creator:p,distributeRule:f}=r.package,{scmVersion:b}=l,$=y(Number.parseInt(c,10)*1e3),C=f.envLaneList.flatMap(ne=>ne.values);return{qrCodeScheme:s,region:i.GECKO_region,scmVersion:b,channel:a,updatedDate:$,creator:p,envs:C,runId:t.runId,runSeq:t.runSeq}}catch(i){return console.error(i),null}}).filter(n=>n!=null)).filter(t=>!!t)}async function ce(e,t){let n=t.flatMap(r=>r.jobs.map(s=>s.jobAtom.inputs?.trigger_params).filter(s=>!!s).filter(s=>s.detail_url.length));if(!n.length)return;F(`Found ${n.length} possible alternative pipeline(s) you may want to try instead.`,"Mistyped the pipeline ID?");let i=[{value:"",label:`(Keep current pipeline id=${e})`}].concat(n.map(r=>({value:z(r.detail_url),label:`${g.underline(r.development_task_name)} by ${r.developer.join(",")}`,hint:r.detail_url}))),o=await K({message:"Select a pipeline to change, or cancel [ESC] to use the current pipeline.",options:i});if(q(o)||!o){B("Keep using current pipeline");return}return w.success(`Using new pipeline id=${o}`),o}async function le(e,t,n){let{response:o,getJson:r}=await v({pipelineId:e,pageSize:10,withoutJob:!0},t,n);o.ok||(w.error(`[getRunInfoByPipelineID] failed: ${o.status} ${o.statusText}
15
- ${await o.text()}`),process.exit(1));let s=await r();s.pipelineRuns.length<=0&&(w.error(`No pipeline runs found in the most recent 10 runs
16
- ${JSON.stringify(s,null,1)}`),process.exit(1)),F("The latest pipeline run may be ongoing/failed. Try a previous run to inspect.","Select a previous run");let l=s.pipelineRuns.map(c=>{let p=Q(c.runStatus),f=pe(c),b=c.triggerInfo?.triggeredBy||c.createdBy||"?";return{value:c.runId,label:`#${c.runSeq} runId=${c.runId} ${p}`,hint:`${f} by ${b}`}}),a=await K({message:"Select the run ID to inspect",options:l});return q(a)&&(B("Run selection cancelled"),process.exit(0)),a}async function me(e,t,n){let{response:i,getJson:o}=await G(e,t,n);i.ok||(w.error(`[getRunDetailByRunID] failed: ${i.status} ${i.statusText}
17
- ${await i.text()}`),process.exit(1));let r=await o();return V([r.pipelineRun])}function Q(e){switch(e){case I.RUNNING:return g.blue("RUNNING");case I.CANCELLED:return g.gray("CANCELLED");case I.SUCCESS:return g.green("SUCCESS");case I.FAILURE:return g.red("FAILURE")}return`status=${e}`}function pe(e){return e.completedAt?`completed @ ${y(e.completedAt)}`:e.startedAt?`started @ ${y(e.startedAt)}`:e.createdAt?`created @ ${y(e.createdAt)}`:"time=?"}var X=[{cmd:{name:"tt-gecko",desc:"Show gecko info by bits URL"},options:[{name:"-p,--pipelineId <pipelineId>",desc:"Pipeline ID (Overrides URL)"},{name:"-u,--url <url>",desc:"Bits URL"},{name:"-r,--region <region>",desc:"Region kw filter"}],examples:[`${d.name} tt-gecko -r us -u 'https://b??.net/devops/??/develop/detail/??/flow?devops_space_type=server_fe&pipelineId=1139212901634&stage=dev_gatekeeper_stage'`],action:ae}];import{access as ue,constants as de}from"node:fs/promises";var Z=[{cmd:{name:"tt-i18n",desc:"I18n scan and sort"},action:async()=>{let e="starling.config.js",t="combine-lang.js";for(let o of[e,t])try{await ue(o,de.R_OK)}catch(r){console.error(`tt i18n: Failed to read ${o}
18
- `,r),process.exit(1)}let{execa:n,execaNode:i}=await import("execa");await n({stdio:"inherit"})`pnpm dlx @ies/starling-cli scan -c ${e} --fallback --disable-browser`,await i({stdio:"inherit"})`${e}`,await n({stdio:"inherit"})`pnpm --package=json-sort-cli dlx sortjson ./src/lang`.catch(o=>console.error("tt i18n sortjson error:",o))}}];var Y=[...j,...X,...Z];async function ge({npm:e,global:t}){let{execa:n}=await import("execa");await n({stdio:"inherit"})`${e?"npm":"pnpm"} add ${t?"-g":""} https://github.com/jerryc05/hi-tools.git`}var ee=[{cmd:{name:"upgrade",desc:"Upgrade to latest version (default using pnpm)"},options:[{name:"--npm",desc:"Use npm instead of default"},{name:"-g,--global",desc:"Pass -g flag to pkg mgr"}],action:ge}];var fe=e=>new Promise(t=>setTimeout(t,e)),te=[{cmd:{name:"wup",desc:"[W]ait for pkg publish, [U]pdate target repo, and [P]ush"},options:[{name:"-t, --target <path>",desc:"Target repository path"},{name:"-c, --cmdPrefix <prefix>",desc:"Pkg install command prefix",config:{default:"pnpm add"}},{name:"--timeout <limit>",desc:"Timeout limit in seconds",config:{default:300}}],examples:[`${d.name} wup -t "/tmp/otherRepoPath" -c "emo add"`,`${d.name} wup -t "/tmp/otherRepoPath" -c "rush add --make-consistent -p"`],action:async({target:e,cmdPrefix:t,timeout:n})=>{u||(console.log("\u274C Unable to parse package.json!"),process.exit(1)),e||(console.log("\u274C Missing target repo path"),process.exit(1));let i=u.version,o=`${u.name}@${i}`,r=1e4,s=[...t.split(" "),o];console.log(`\u{1F680} Monitoring ${o}...`),console.log(`\u{1F4C2} Target: ${e}`),console.log(`\u{1F6E0} Install cmd: ${s.join(" ")}`);let{execa:l}=await import("execa");try{console.log("\u{1F4E5} Pulling latest changes in target repo..."),await l({cwd:e,stdio:"inherit",env:{GIT_TRACE:"1"}})`git pull`;let a=Date.now();for(;;){let{exitCode:c}=await l({reject:!1,stdio:"inherit"})`npm view ${o} version`;if(c===0){console.log(`
19
- \u2705 v${i} is live! Installing...`);try{await l({cwd:e,stdio:"inherit"})`${s}`,console.log(`
12
+ `)}catch(p){console.error("Failed to generate QR:",p)}}}async function O(e,n,t,i){let{response:o,getJson:r}=await x({pipelineId:e,pageSize:1,withoutJob:!1},n,t);o.ok||(b.error(`[getRunInfoByPipelineID] failed: ${o.status} ${o.statusText}
13
+ ${await o.text()}`),process.exit(1));let s=await r();s.pipelineRuns[0]?.runStatus!==y.SUCCESS&&b.warn(`Latest run (runId=${s.pipelineRuns[0]?.runId}) status=${q(s.pipelineRuns[0]?.runStatus)}. Gecko info may be unavailable.`);let m=B(s.pipelineRuns).filter(p=>p.region?.includes(i??""));if(m.length)return m;let c=await se(e,s.pipelineRuns);if(c)return O(c,n,t,i);let a=await ae(e,n,t);return await ce(a,n,t)}function M(e){let n=/\bpipelineId=(\d+)\b/,t=e.match(n);if(t?.[1])return t[1];throw new Error(`Invalid URL. Expecting a url containing ${d.bold(d.yellow("pipelineId"))} query param. E.g. `+d.underline(d.gray(`https://b??.net/devops/??/develop/detail/??/flow?devops_space_type=server_fe&${d.bold(d.magenta("pipelineId=1139212901634"))}&stage=dev_gatekeeper_stage`)))}function B(e){return e.flatMap(n=>n.jobs.map(t=>{try{let i=t.jobAtom.output;if(!i)return null;let o=i.GECKO_packageInfo;if(!o)return null;let r=JSON.parse(o),{qrCodeScheme:s,candidatePackage:m,channel:c,updatedAt:a,creator:p,distributeRule:g}=r.package,{scmVersion:f}=m,I=h(Number.parseInt(a,10)*1e3),R=g.envLaneList.flatMap(Q=>Q.values);return{qrCodeScheme:s,region:i.GECKO_region,scmVersion:f,channel:c,updatedDate:I,creator:p,envs:R,runId:n.runId,runSeq:n.runSeq}}catch(i){return console.error(i),null}}).filter(t=>t!=null)).filter(n=>!!n)}async function se(e,n){let t=n.flatMap(r=>r.jobs.map(s=>s.jobAtom.inputs?.trigger_params).filter(s=>!!s).filter(s=>s.detail_url.length));if(!t.length)return;L(`Found ${t.length} possible alternative pipeline(s) you may want to try instead.`,"Mistyped the pipeline ID?");let i=[{value:"",label:`(Keep current pipeline id=${e})`}].concat(t.map(r=>({value:M(r.detail_url),label:`${d.underline(r.development_task_name)} by ${r.developer.join(",")}`,hint:r.detail_url}))),o=await G({message:"Select a pipeline to change, or cancel [ESC] to use the current pipeline.",options:i});if(j(o)||!o){H("Keep using current pipeline");return}return b.success(`Using new pipeline id=${o}`),o}async function ae(e,n,t){let{response:o,getJson:r}=await x({pipelineId:e,pageSize:10,withoutJob:!0},n,t);o.ok||(b.error(`[getRunInfoByPipelineID] failed: ${o.status} ${o.statusText}
14
+ ${await o.text()}`),process.exit(1));let s=await r();s.pipelineRuns.length<=0&&(b.error(`No pipeline runs found in the most recent 10 runs
15
+ ${JSON.stringify(s,null,1)}`),process.exit(1)),L("The latest pipeline run may be ongoing/failed. Try a previous run to inspect.","Select a previous run");let m=s.pipelineRuns.map(a=>{let p=q(a.runStatus),g=me(a),f=a.triggerInfo?.triggeredBy||a.createdBy||"?";return{value:a.runId,label:`#${a.runSeq} runId=${a.runId} ${p}`,hint:`${g} by ${f}`}}),c=await G({message:"Select the run ID to inspect",options:m});return j(c)&&(H("Run selection cancelled"),process.exit(0)),c}async function ce(e,n,t){let{response:i,getJson:o}=await U(e,n,t);i.ok||(b.error(`[getRunDetailByRunID] failed: ${i.status} ${i.statusText}
16
+ ${await i.text()}`),process.exit(1));let r=await o();return B([r.pipelineRun])}function q(e){switch(e){case y.RUNNING:return d.blue("RUNNING");case y.CANCELLED:return d.gray("CANCELLED");case y.SUCCESS:return d.green("SUCCESS");case y.FAILURE:return d.red("FAILURE")}return`status=${e}`}function me(e){return e.completedAt?`completed @ ${h(e.completedAt)}`:e.startedAt?`started @ ${h(e.startedAt)}`:e.createdAt?`created @ ${h(e.createdAt)}`:"time=?"}var F=[{cmd:{name:"tt-gecko",desc:"Show gecko info by bits URL"},options:[{name:"-p,--pipelineId <pipelineId>",desc:"Pipeline ID (Overrides URL)"},{name:"-u,--url <url>",desc:"Bits URL"},{name:"-r,--region <region>",desc:"Region kw filter"}],examples:[`${u.name} tt-gecko -r us -u 'https://b??.net/devops/??/develop/detail/??/flow?devops_space_type=server_fe&pipelineId=1139212901634&stage=dev_gatekeeper_stage'`],action:ie}];import{access as pe,constants as le}from"node:fs/promises";var K=[{cmd:{name:"tt-i18n",desc:"I18n scan and sort"},action:async()=>{let e="starling.config.js",n="combine-lang.js";for(let o of[e,n])try{await pe(o,le.R_OK)}catch(r){console.error(`tt i18n: Failed to read ${o}
17
+ `,r),process.exit(1)}let{execa:t,execaNode:i}=await import("execa");await t({stdio:"inherit"})`pnpm dlx @ies/starling-cli scan -c ${e} --fallback --disable-browser`,await i({stdio:"inherit"})`${e}`,await t({stdio:"inherit"})`pnpm --package=json-sort-cli dlx sortjson ./src/lang`.catch(o=>console.error("tt i18n sortjson error:",o))}}];var W=[...E,...F,...K];async function ue({npm:e,global:n}){let{execa:t}=await import("execa");await t({stdio:"inherit"})`${e?"npm":"pnpm"} add ${n?"-g":""} https://github.com/jerryc05/hi-tools.git`}var z=[{cmd:{name:"upgrade",desc:"Upgrade to latest version (default using pnpm)"},options:[{name:"--npm",desc:"Use npm instead of default"},{name:"-g,--global",desc:"Pass -g flag to pkg mgr"}],action:ue}];var de=e=>new Promise(n=>setTimeout(n,e)),V=[{cmd:{name:"wup",desc:"[W]ait for pkg publish, [U]pdate target repo, and [P]ush"},options:[{name:"-t, --target <path>",desc:"Target repository path"},{name:"-c, --cmdPrefix <prefix>",desc:"Pkg install command prefix",config:{default:"pnpm add"}},{name:"--timeout <limit>",desc:"Timeout limit in seconds",config:{default:300}}],examples:[`${u.name} wup -t "/tmp/otherRepoPath" -c "emo add"`,`${u.name} wup -t "/tmp/otherRepoPath" -c "rush add --make-consistent -p"`],action:async({target:e,cmdPrefix:n,timeout:t})=>{l||(console.log("\u274C Unable to parse package.json!"),process.exit(1)),e||(console.log("\u274C Missing target repo path"),process.exit(1));let i=l.version,o=`${l.name}@${i}`,r=1e4,s=[...n.split(" "),o];console.log(`\u{1F680} Monitoring ${o}...`),console.log(`\u{1F4C2} Target: ${e}`),console.log(`\u{1F6E0} Install cmd: ${s.join(" ")}`);let{execa:m}=await import("execa");try{console.log("\u{1F4E5} Pulling latest changes in target repo..."),await m({cwd:e,stdio:"inherit",env:{GIT_TRACE:"1"}})`git pull`;let c=Date.now();for(;;){let{exitCode:a}=await m({reject:!1,stdio:"inherit"})`npm view ${o} version`;if(a===0){console.log(`
18
+ \u2705 v${i} is live! Installing...`);try{await m({cwd:e,stdio:"inherit"})`${s}`,console.log(`
20
19
  \u{1F389} [SUCCESS] ${o} installed!`);break}catch{console.log(`
21
- \u26A0\uFE0F Registry updated but installation failed, retrying...`)}}else process.stdout.write(".");(Date.now()-a)/1e3>=n&&(console.error(`
22
- \u274C [ERROR] Timed out after ${n}s.`),process.exit(1)),await fe(r)}console.log("\u{1F4DD} Committing changes..."),await l({stdio:"inherit"})`git commit -am 'chore: upd ${o}`,console.log("\u{1F4E4} Pushing to remote..."),await l({stdio:"inherit"})`git push`,console.log("\u{1F389} DONE!")}catch(a){console.error(`
23
- \u274C Task failed:`,a),process.exit(1)}}}];var u=JSON.parse(await be(he(import.meta.dirname,"../package.json"),"utf8"));process.argv.includes("--quiet")&&process.exit(0);u&&(console.log(),R(`${u.name} v${u.version}
24
-
25
- `));var ye=[...ee,...J,...H,...te,...k,...A,..._,...P,...Y];for(let{cmd:e,options:t,examples:n,action:i}of ye){let o=d.command(e.name,e.desc);for(let r of t??[])o=o.option(r.name,r.desc,r.config);for(let r of n??[])o=o.example(r);o.action(i)}d.version(u.version).help();d.command("","Print help message").option("--quiet","Silently quit").action(({quiet:e})=>{e||d.outputHelp()});d.parse();export{u as PKG_JSON_OBJ};
20
+ \u26A0\uFE0F Registry updated but installation failed, retrying...`)}}else process.stdout.write(".");(Date.now()-c)/1e3>=t&&(console.error(`
21
+ \u274C [ERROR] Timed out after ${t}s.`),process.exit(1)),await de(r)}console.log("\u{1F4DD} Committing changes..."),await m({stdio:"inherit"})`git commit -am 'chore: upd ${o}`,console.log("\u{1F4E4} Pushing to remote..."),await m({stdio:"inherit"})`git push`,console.log("\u{1F389} DONE!")}catch(c){console.error(`
22
+ \u274C Task failed:`,c),process.exit(1)}}}];var l=JSON.parse(await ge(fe(import.meta.dirname,"../package.json"),"utf8"));l&&he.info(`${l.name} v${l.version}`);var be=[...z,...A,...D,...V,...S,..._,...C,...v,...W];for(let{cmd:e,options:n,examples:t,action:i}of be){let o=u.command(e.name,e.desc);for(let r of n??[])o=o.option(r.name,r.desc,r.config);for(let r of t??[])o=o.example(r);o.action(i)}u.version(l.version).help();u.command("","Print help message").action(u.outputHelp);u.parse();export{l as PKG_JSON_OBJ};
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@jerryc05/hi-tools",
3
- "version": "0.1.7",
3
+ "version": "0.1.10",
4
4
  "description": "A collection of my everyday SDE tools.",
5
5
  "scripts": {
6
- "pub": "npm run build && npm version patch && npm publish --access public && git push",
6
+ "pub": "npm run build && npm version patch && npm login --registry https://registry.npmjs.org && npm publish --access public && git push",
7
7
  "build": "node build.js",
8
8
  "prepare": "husky"
9
9
  },