@jerryc05/hi-tools 0.1.14 → 0.1.17

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 +13 -13
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -1,22 +1,22 @@
1
1
  #!/usr/bin/env node
2
2
  typeof globalThis.CustomEvent>"u"&&(globalThis.CustomEvent=class extends Event{constructor(n,t={}){super(n,t),this.detail=t.detail}});import{readFile as he}from"node:fs/promises";import{join as be}from"node:path";import{log as ye}from"@clack/prompts";var S=[{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 Y}from"node:os";var x=[{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=Y(),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 ee({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 C=[{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:ee}];import{hostname as te}from"node:os";var v=[{cmd:{name:"mdns",desc:"Show mdns hostname.local"},action:()=>{let e=te();console.log(e.toLowerCase().endsWith(".local")?e:`${e}.local`)}}];import{spinner as ne}from"@clack/prompts";async function _(){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 k(e){let n=ne();n.start(`${e?"Updating":"Fetching"} master...`);let{execa:t}=await import("execa");await t({stdio:"inherit",env:{GIT_TRACE:"1"}})`git fetch ${await _()} master${e?":master":""}`,n.start("Merging ..."),await t({stdio:"inherit",env:{GIT_TRACE:"1"}})`git merge ${await _()}/master --no-verify --no-edit`,n.stop("Done")}var P=[{cmd:{name:"mm",desc:"[M]erge [M]aster: Update local master to remote's, then merge into current branch"},action:()=>k(!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:()=>k(!1)}];import{log as D,spinner as oe}from"@clack/prompts";var E=[{cmd:{name:"tschk",desc:"My ts-check rules"},action:async()=>{let e=oe();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?(e.stop("Type-check failed"),o.map(r=>console.log(r)),D.error("Type-check failed"),process.exit(1)):e.stop("Type-check passed")}catch(i){e.stop("Type-check failed"),console.error(i),D.error("Type-check failed"),process.exit(1)}}}];var A=[{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 h,note as L,select as G}from"@clack/prompts";import d from"picocolors";var T="https://bits.bytedance.net";async function $(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 b={RUNNING:2,CANCELLED:7,SUCCESS:8,FAILURE:9};import{cac as re}from"cac";var u=re("hi");function y(e){let n=new Date(e),t=new Intl.DateTimeFormat("en-US",{timeZoneName:"short"}).formatToParts(n).find(i=>i.type==="timeZoneName")?.value;return`${n.toLocaleDateString("zh-CN")} ${n.toTimeString().split(" ")[0]} ${t?`(${t})`:""}`}import{log as ie,spinner as se}from"@clack/prompts";import N from"picocolors";var w;async function J(){let e=se();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 ${N.magenta(t.username)} from ${N.blue(`${t.scope} ${t.work_country}`)}`),ie.info(`Login will expire on ${y(t.exp*1e3)}`),{jwtStr:n,jwtObj:t}}async function ae({pipelineId:e,url:n,region:t}){let{jwtStr:i,jwtObj:o}=await J(),r=(()=>{if(e==null&&!n)throw new Error("pipelineId or url is required");return e??B(n??"")})(),s=await O(r,i,o,t);if(s.length<=0){h.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(`
3
+ Go to https://luban.bytedance.net/npm/publish and get your personal SCM username + password.`),process.exit(1));let{execa:p}=await import("execa");try{let c=p`git log -1 --pretty=%s`,a,m;t?t===!0?m=(await p`git branch --show-current`).stdout.trim():m=t:n&&(n===!0?a=(await p`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:m??"",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=${m}`}
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 C=[{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:ee}];import{hostname as te}from"node:os";var v=[{cmd:{name:"mdns",desc:"Show mdns hostname.local"},action:()=>{let e=te();console.log(e.toLowerCase().endsWith(".local")?e:`${e}.local`)}}];import{spinner as ne}from"@clack/prompts";async function _(){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 k(e){let n=ne();n.start(`${e?"Updating":"Fetching"} master...`);let{execa:t}=await import("execa");await t({stdio:"inherit"})`git fetch ${await _()} master${e?":master":""}`,n.start("Merging ..."),await t({stdio:"inherit"})`git merge ${await _()}/master --no-verify --no-edit`,n.stop("Done")}var P=[{cmd:{name:"mm",desc:"[M]erge [M]aster: Update local master to remote's, then merge into current branch"},action:()=>k(!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:()=>k(!1)}];import{log as D,spinner as oe}from"@clack/prompts";var A=[{cmd:{name:"tschk",desc:"My ts-check rules"},action:async()=>{let e=oe();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?(e.stop("Type-check failed"),o.map(r=>console.log(r)),D.error("Type-check failed"),process.exit(1)):e.stop("Type-check passed")}catch(i){e.stop("Type-check failed"),console.error(i),D.error("Type-check failed"),process.exit(1)}}}];var T=[{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 h,note as L,select as G}from"@clack/prompts";import d from"picocolors";var E="https://bits.bytedance.net";async function $(e,n,t,i){let o={...e,pageNum:e.pageNum??1},r=`${E}/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 N(e,n,t){let i=`${E}/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 b={RUNNING:2,CANCELLED:7,SUCCESS:8,FAIL:9};import{cac as re}from"cac";var u=re("hi");function y(e){let n=new Date(e),t=new Intl.DateTimeFormat("en-US",{timeZoneName:"longOffset"}).formatToParts(n).find(i=>i.type==="timeZoneName")?.value.replace("GMT","");return`${n.toLocaleDateString("zh-CN")} ${n.toTimeString().split(" ")[0]} ${t??""}`}import{log as ie,spinner as se}from"@clack/prompts";import J from"picocolors";var w;async function U(){let e=se();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}`)}`),ie.info(`Login will expire on ${y(t.exp*1e3)}`),{jwtStr:n,jwtObj:t}}async function ae({pipelineId:e,url:n,region:t}){let{jwtStr:i,jwtObj:o}=await U(),r=(()=>{if(e==null&&!n)throw new Error("pipelineId or url is required");return e??B(n??"")})(),s=await O(r,i,o,t);if(s.length<=0){h.error(`No Gecko info found${t?` matching region [${t}]`:""} in latest run`);return}let{default:p}=await import("qrcode");for(let c=0;c<s.length;c++){let a=s[c];try{let m=await p.toString(a?.qrCodeScheme??"",{type:"terminal",small:!0,errorCorrectionLevel:"L"});console.log(`
7
7
 
8
- ${p}`),console.dir(a),c<s.length-1&&console.log(`
8
+ ${m}`),console.dir(a),c<s.length-1&&console.log(`
9
9
 
10
10
  -----------------
11
11
 
12
- `)}catch(p){console.error("Failed to generate QR:",p)}}}async function O(e,n,t,i){let{response:o,getJson:r}=await $({pipelineId:e,pageSize:1,withoutJob:!1},n,t);o.ok||(h.error(`[getRunInfoByPipelineID] failed: ${o.status} ${o.statusText}
13
- ${await o.text()}`),process.exit(1));let s=await r();s.pipelineRuns[0]?.runStatus!==b.SUCCESS&&h.warn(`Latest run (runId=${s.pipelineRuns[0]?.runId}) status=${q(s.pipelineRuns[0]?.runStatus)}. Gecko info may be unavailable.`);let m=M(s.pipelineRuns,i);if(m.length)return m;let c=await ce(e,s.pipelineRuns);if(c)return O(c,n,t,i);let a=await me(e,n,t);return await pe(a,n,t)}function M(e,n){return e.flatMap(t=>t.jobs.map(i=>{try{let o=i.jobAtom.output;if(!o)return null;let r=o.GECKO_packageInfo;if(!r)return null;let s=o.GECKO_region;if(n&&!s?.includes(n))return null;let m=JSON.parse(r),{qrCodeScheme:c,candidatePackage:a,channel:p,updatedAt:g,creator:f,distributeRule:I}=m.package,{scmVersion:R}=a,Q=y(Number.parseInt(g,10)*1e3),X=I.envLaneList.flatMap(Z=>Z.values);return{qrCodeScheme:c,region:s,scmVersion:R,channel:p,updatedDate:Q,creator:f,envs:X,runId:t.runId,runSeq:t.runSeq}}catch(o){return console.error(o),null}}).filter(i=>i!=null)).filter(t=>!!t)}async function ce(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:B(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 h.success(`Using new pipeline id=${o}`),o}async function me(e,n,t){let{response:o,getJson:r}=await $({pipelineId:e,pageSize:10,withoutJob:!0},n,t);o.ok||(h.error(`[getRunInfoByPipelineID] failed: ${o.status} ${o.statusText}
12
+ `)}catch(m){console.error("Failed to generate QR:",m)}}}async function O(e,n,t,i){let{response:o,getJson:r}=await $({pipelineId:e,pageSize:1,withoutJob:!1},n,t);o.ok||(h.error(`[getRunInfoByPipelineID] failed: ${o.status} ${o.statusText}
13
+ ${await o.text()}`),process.exit(1));let s=await r();s.pipelineRuns[0]?.runStatus!==b.SUCCESS&&h.warn(`Latest run (runId=${s.pipelineRuns[0]?.runId}) status=${q(s.pipelineRuns[0]?.runStatus)}. Gecko info may be unavailable.`);let p=M(s.pipelineRuns,i);if(p.length)return p;let c=await ce(e,s.pipelineRuns);if(c)return O(c,n,t,i);let a=await pe(e,n,t);return await me(a,n,t)}function M(e,n){return e.flatMap(t=>t.jobs.map(i=>{try{let o=i.jobAtom.output;if(!o)return null;let r=o.GECKO_packageInfo;if(!r)return null;let s=o.GECKO_region;if(n&&!s?.includes(n))return null;let p=JSON.parse(r),{qrCodeScheme:c,candidatePackage:a,channel:m,updatedAt:g,creator:f,distributeRule:I}=p.package,{scmVersion:R}=a,Q=y(Number.parseInt(g,10)*1e3),X=I.envLaneList.flatMap(Z=>Z.values);return{qrCodeScheme:c,region:s,scmVersion:R,channel:m,updatedDate:Q,creator:f,envs:X,runId:t.runId,runSeq:t.runSeq}}catch(o){return console.error(o),null}}).filter(i=>i!=null)).filter(t=>!!t)}async function ce(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:B(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 h.success(`Using new pipeline id=${o}`),o}async function pe(e,n,t){let{response:o,getJson:r}=await $({pipelineId:e,pageSize:10,withoutJob:!0},n,t);o.ok||(h.error(`[getRunInfoByPipelineID] failed: ${o.status} ${o.statusText}
14
14
  ${await o.text()}`),process.exit(1));let s=await r();s.pipelineRuns.length<=0&&(h.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=le(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 pe(e,n,t){let{response:i,getJson:o}=await U(e,n,t);i.ok||(h.error(`[getRunDetailByRunID] failed: ${i.status} ${i.statusText}
16
- ${await i.text()}`),process.exit(1));let r=await o();return M([r.pipelineRun])}function B(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 q(e){switch(e){case b.RUNNING:return d.blue("RUNNING");case b.CANCELLED:return d.gray("CANCELLED");case b.SUCCESS:return d.green("SUCCESS");case b.FAILURE:return d.red("FAILURE")}return`status=${e}`}function le(e){return e.startedAt?`started @ ${y(e.startedAt)}`:e.createdAt?`created @ ${y(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 filter (match-based)"}],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:ae}];import{access as ue,constants as de}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 ue(o,de.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=[...A,...F,...K];async function ge({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:ge}];var fe=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(`
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 p=s.pipelineRuns.map(a=>{let m=q(a.runStatus),g=le(a),f=a.triggerInfo?.triggeredBy||a.createdBy||"?";return{value:a.runId,label:`#${a.runSeq} runId=${a.runId} ${m}`,hint:`${g} by ${f}`}}),c=await G({message:"Select the run ID to inspect",options:p});return j(c)&&(H("Run selection cancelled"),process.exit(0)),c}async function me(e,n,t){let{response:i,getJson:o}=await N(e,n,t);i.ok||(h.error(`[getRunDetailByRunID] failed: ${i.status} ${i.statusText}
16
+ ${await i.text()}`),process.exit(1));let r=await o();return M([r.pipelineRun])}function B(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 q(e){switch(e){case b.RUNNING:return d.blue("RUNNING");case b.CANCELLED:return d.gray("CANCELLED");case b.SUCCESS:return d.green("SUCCESS");case b.FAIL:return d.red("FAIL")}return`status=${e}`}function le(e){return e.startedAt?`started @ ${y(e.startedAt)}`:e.createdAt?`created @ ${y(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 filter (match-based)"}],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:ae}];import{access as ue,constants as de}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 ue(o,de.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=[...T,...F,...K];async function ge({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:ge}];var fe=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:p}=await import("execa");try{console.log("\u{1F4E5} Pulling latest changes in target repo..."),await p({cwd:e,stdio:"inherit",env:{GIT_TRACE:"1"}})`git pull`;let c=Date.now();for(;;){let{exitCode:a}=await p({reject:!1,stdio:"inherit"})`npm view ${o} version`;if(a===0){console.log(`
18
+ \u2705 v${i} is live! Installing...`);try{await p({cwd:e,stdio:"inherit"})`${s}`,console.log(`
19
19
  \u{1F389} [SUCCESS] ${o} installed!`);break}catch{console.log(`
20
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 fe(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 he(be(import.meta.dirname,"../package.json"),"utf8"));l&&ye.info(`${l.name} v${l.version}`);var we=[...z,...P,...E,...V,...x,...v,...S,...C,...W];for(let{cmd:e,options:n,examples:t,action:i}of we){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};
21
+ \u274C [ERROR] Timed out after ${t}s.`),process.exit(1)),await fe(r)}console.log("\u{1F4DD} Committing changes..."),await p({stdio:"inherit"})`git commit -am 'chore: upd ${o}`,console.log("\u{1F4E4} Pushing to remote..."),await p({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 he(be(import.meta.dirname,"../package.json"),"utf8"));l&&ye.info(`${l.name} v${l.version}`);var we=[...z,...P,...A,...V,...x,...v,...S,...C,...W];for(let{cmd:e,options:n,examples:t,action:i}of we){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.14",
3
+ "version": "0.1.17",
4
4
  "description": "A collection of my everyday SDE tools.",
5
5
  "scripts": {
6
- "pub": "npm run build && npm version patch && { npm whoami || npm login --registry https://registry.npmjs.org; } && npm publish --access public && git push",
6
+ "pub": "npm run build && npm version patch && export NPM_CONFIG_REGISTRY=https://registry.npmjs.org &&{ npm whoami || npm login; } && npm publish --access public && git push",
7
7
  "build": "node build.js",
8
8
  "prepare": "husky"
9
9
  },