@jerryc05/hi-tools 0.3.3 → 0.3.5

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 +14 -14
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -1,22 +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 We}from"node:fs/promises";import{join as Ke}from"node:path";import{intro as Ve}from"@clack/prompts";import ze from"yargs";import{hideBin as Qe}from"yargs/helpers";import{networkInterfaces as le}from"node:os";function D(e){let t=le(),n={};for(let[r,o]of Object.entries(t))o=o?.filter(s=>e?.["only-ipv4"]?s.family==="IPv4":e?.["only-ipv6"]?s.family==="IPv6":!(s.family==="IPv6"&&ue(s.address))),o?.length&&(n[r]=o);return n}function ue(e){let t=e.toLowerCase().split("%")[0];return/^fe[89ab][0-9a-f](?::|$)/i.test(t??"")}var de={"only-ipv4":{alias:"4",desc:"IPv4 only",boolean:!0},"only-ipv6":{alias:"6",desc:"IPv6 only",boolean:!0}},T=[{command:"ips",describe:"Show current machine's IP addrs",builder:de,handler(e){let t=D(e),n={};for(let[r,o]of Object.entries(t))o&&(n[r]=e.verbose?o:o.map(s=>s.address));console.log(t)}}];import L from"node:os";var J=[{command:"mdns",describe:"Show mdns [hostname].local",async handler(){let e="";if(L.platform()==="darwin")try{let{execa:t}=await import("execa");e=(await t`scutil --get LocalHostName`).stdout.trim()}catch(t){console.error(t)}e||(e=L.hostname()),console.log(`${e}${e.toLowerCase().endsWith(".local")?"":".local"}`)}}];import{spinner as fe}from"@clack/prompts";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 H({updBranch:e,branch:t,verbose:n}){let r=fe();r.start(`${e?"Updating":"Fetching"} ${t}...`);let{execa:o}=await import("execa");await o({stdio:"inherit",env:n?{GIT_TRACE:"1"}:{}})`git fetch ${await U()} ${t}${e?`:${t}`:""}`,r.message("Merging ..."),await o({stdio:"inherit",env:n?{GIT_TRACE:"1"}:{}})`git merge ${await U()}/${t} --no-verify --no-edit ${n?"":"-q"}`,r.stop("Done")}var S={branch:{alias:"b",default:"master",desc:'Default=master, or "main" if you wish'}},G=[{command:"mm",describe:"[M]erge [M]aster: Update local master to remote's, then merge into current branch",builder:S,handler(e){let{branch:t=S.branch.default,verbose:n}=e;H({updBranch:!0,branch:t,verbose:n})}},{command:"mmm",describe:"[M]erge [M]aster (don't [M]odify local master): Merge remote's master into current branch, without updating local master",builder:S,async handler(e){let{branch:t=S.branch.default,verbose:n}=e;await H({updBranch:!1,branch:t,verbose:n})}}];import{log as ge,spinner as be}from"@clack/prompts";var ye={tsgo:{alias:"7",desc:"Enable tsgo (v7+)",default:!1,boolean:!0}},F=[{command:"tschk",describe:"My ts-check rules",builder:ye,async handler(e){let{tsgo:t}=e,n=!0,{execa:r}=await import("execa");{let o=be();o.start("Running custom ts type-check...");let{stdout:s}=await r({reject:!1,stderr:"ignore"})`bunx ${[`typescript${t?"@>=7":""}`]} --noEmit --pretty false`,i=["2551","6133","6192","18048"],p=/5\d\d\d/,c=s.split(`
3
- `).filter(a=>{if(a.includes("/node_modules/"))return!1;let m=a.match(/error TS(\d+):/);return!(!m?.[1]||i.includes(m[1])||p.test(m[1]))});c.length>0?(c.map(a=>ge.error(a)),o.stop("Type-check failed"),n=!1):o.stop("Type-check passed")}process.exit(n?0:1)}}];var B=[{command:"bam",describe:"Update BAM code-gen",handler:async()=>{let{execa:e}=await import("execa");await e({stdio:"inherit"})`bunx @byted-arch-fe/bam-code-generator@latest update`}}];import{cancel as K,isCancel as V,log as y,note as z,select as Q}from"@clack/prompts";import f from"picocolors";var M="https://bits.bytedance.net";async function A(e,t,n,r){let o={...e,pageNum:e.pageNum??1},s=`${M}/api/v1/pipelines/runs?${new URLSearchParams(o).toString()}`,i=await fetch(s,{method:"GET",headers:{"Content-Type":"application/json","X-jwt-token":t,Username:n.username},signal:r??null});return{response:i,getJson:async()=>await i.json()}}async function q(e,t,n){let r=`${M}/api/v1/pipelines/runs/${e}`,o=await fetch(r,{method:"GET",headers:{"Content-Type":"application/json","X-jwt-token":t,Username:n.username}});return{response:o,getJson:async()=>await o.json()}}var $={RUNNING:2,CANCELLED:7,SUCCESS:8,FAIL:9};function R(e){let t=new Date(e),n=new Intl.DateTimeFormat("en-US",{timeZoneName:"longOffset"}).formatToParts(t).find(r=>r.type==="timeZoneName")?.value.replace("GMT","");return`${t.toLocaleDateString("zh-CN")} ${t.toTimeString().split(" ")[0]} ${n??""}`}import{log as he,spinner as we}from"@clack/prompts";import X from"picocolors";var _;async function W(){let e=we();if(e.start("Logging in..."),!_){let{AIPaaSAuth:r}=await import("@byted/aipaas-auth");_=new r("cn")}let t=await _.getJwt(),n=await _.getUserInfo();return e.stop(`Hi ${X.magenta(n.username)} from ${X.blue(`${n.scope} ${n.work_country}`)}`),he.info(`Login will expire on ${R(n.exp*1e3)}`),{jwtStr:t,jwtObj:n}}async function Ie({pipelineId:e,url:t,region:n,verbose:r}){let{jwtStr:o,jwtObj:s}=await W(),i=(()=>{if(e==null&&!t)throw new Error("pipelineId or url is required");return e??te(t??"")})(),p=await Y(i,o,s,n);if(p.length<=0){y.error(`No Gecko info found${n?` matching region [${n}]`:""} in latest run`);return}let{default:c}=await import("qrcode");for(let a=0;a<p.length;a++){let m=p[a];try{let l=await c.toString(m?.qrCodeScheme??"",{type:"terminal",small:!0,errorCorrectionLevel:"L"});console.log(`
2
+ typeof globalThis.CustomEvent>"u"&&(globalThis.CustomEvent=class extends Event{constructor(t,n={}){super(t,n),this.detail=n.detail}});import{readFile as ze}from"node:fs/promises";import{join as Qe}from"node:path";import{intro as Ze}from"@clack/prompts";import Ye from"yargs";import{hideBin as et}from"yargs/helpers";import{networkInterfaces as ue}from"node:os";function D(e){let t=ue(),n={};for(let[r,o]of Object.entries(t))o=o?.filter(s=>e?.["only-ipv4"]?s.family==="IPv4":e?.["only-ipv6"]?s.family==="IPv6":!(s.family==="IPv6"&&de(s.address))),o?.length&&(n[r]=o);return n}function de(e){let t=e.toLowerCase().split("%")[0];return/^fe[89ab][0-9a-f](?::|$)/i.test(t??"")}var fe={"only-ipv4":{alias:"4",desc:"IPv4 only",boolean:!0},"only-ipv6":{alias:"6",desc:"IPv6 only",boolean:!0}},J=[{command:"ips",describe:"Show current machine's IP addrs",builder:fe,handler(e){let t=D(e),n={};for(let[r,o]of Object.entries(t))o&&(n[r]=e.verbose?o:o.map(s=>s.address));console.log(t)}}];import U from"node:os";var B=[{command:"mdns",describe:"Show mdns [hostname].local",async handler(){let e="";if(U.platform()==="darwin")try{let{execa:t}=await import("execa");e=(await t`scutil --get LocalHostName`).stdout.trim()}catch(t){console.error(t)}e||(e=U.hostname()),console.log(`${e}${e.toLowerCase().endsWith(".local")?"":".local"}`)}}];import{spinner as ye}from"@clack/prompts";import{execa as ge}from"execa";var _=async e=>(await ge({cwd:e})`git symbolic-ref --short HEAD`).stdout;import{execa as be}from"execa";var S=async e=>be({cwd:e.cwd})`git config ${[`branch.${e.branchName}.remote`]}`;async function H({updBranch:e,branch:t,verbose:n}){let r=ye();r.start(`${e?"Updating":"Fetching"} ${t}...`);let{execa:o}=await import("execa"),s=await _(),i=await S({branchName:s});await o({stdio:"inherit",env:n?{GIT_TRACE:"1"}:{}})`git fetch ${i} ${t}${e?`:${t}`:""}`,r.message("Merging ..."),await o({stdio:"inherit",env:n?{GIT_TRACE:"1"}:{}})`git merge ${i}/${t} --no-verify --no-edit ${n?"":"-q"}`,r.stop("Done")}var N={branch:{alias:"b",default:"master",desc:'Default=master, or "main" if you wish'}},G=[{command:"mm",describe:"[M]erge [M]aster: Update local master to remote's, then merge into current branch",builder:N,handler(e){let{branch:t=N.branch.default,verbose:n}=e;H({updBranch:!0,branch:t,verbose:n})}},{command:"mmm",describe:"[M]erge [M]aster (don't [M]odify local master): Merge remote's master into current branch, without updating local master",builder:N,async handler(e){let{branch:t=N.branch.default,verbose:n}=e;await H({updBranch:!1,branch:t,verbose:n})}}];import{log as he,spinner as we}from"@clack/prompts";var Ie={tsgo:{alias:"7",desc:"Enable tsgo (v7+)",default:!1,boolean:!0}},M=[{command:"tschk",describe:"My ts-check rules",builder:Ie,async handler(e){let{tsgo:t}=e,n=!0,{execa:r}=await import("execa");{let o=we();o.start("Running custom ts type-check...");let{stdout:s}=await r({reject:!1,stderr:"ignore"})`bunx ${[`typescript${t?"@>=7":""}`]} --noEmit --pretty false`,i=["2551","6133","6192","18048"],p=/5\d\d\d/,c=s.split(`
3
+ `).filter(a=>{if(a.includes("/node_modules/"))return!1;let m=a.match(/error TS(\d+):/);return!(!m?.[1]||i.includes(m[1])||p.test(m[1]))});c.length>0?(c.map(a=>he.error(a)),o.stop("Type-check failed"),n=!1):o.stop("Type-check passed")}process.exit(n?0:1)}}];var F=[{command:"bam",describe:"Update BAM code-gen",handler:async()=>{let{execa:e}=await import("execa");await e({stdio:"inherit"})`bunx @byted-arch-fe/bam-code-generator@latest update`}}];import{cancel as V,isCancel as z,log as h,note as Q,select as Z}from"@clack/prompts";import f from"picocolors";var q="https://bits.bytedance.net";async function O(e,t,n,r){let o={...e,pageNum:e.pageNum??1},s=`${q}/api/v1/pipelines/runs?${new URLSearchParams(o).toString()}`,i=await fetch(s,{method:"GET",headers:{"Content-Type":"application/json","X-jwt-token":t,Username:n.username},signal:r??null});return{response:i,getJson:async()=>await i.json()}}async function X(e,t,n){let r=`${q}/api/v1/pipelines/runs/${e}`,o=await fetch(r,{method:"GET",headers:{"Content-Type":"application/json","X-jwt-token":t,Username:n.username}});return{response:o,getJson:async()=>await o.json()}}var $={RUNNING:2,CANCELLED:7,SUCCESS:8,FAIL:9};function R(e){let t=new Date(e),n=new Intl.DateTimeFormat("en-US",{timeZoneName:"longOffset"}).formatToParts(t).find(r=>r.type==="timeZoneName")?.value.replace("GMT","");return`${t.toLocaleDateString("zh-CN")} ${t.toTimeString().split(" ")[0]} ${n??""}`}import{log as $e,spinner as Re}from"@clack/prompts";import W from"picocolors";var P;async function K(){let e=Re();if(e.start("Logging in..."),!P){let{AIPaaSAuth:r}=await import("@byted/aipaas-auth");P=new r("cn")}let t=await P.getJwt(),n=await P.getUserInfo();return e.stop(`Hi ${W.magenta(n.username)} from ${W.blue(`${n.scope} ${n.work_country}`)}`),$e.info(`Login will expire on ${R(n.exp*1e3)}`),{jwtStr:t,jwtObj:n}}async function Ce({pipelineId:e,url:t,region:n,verbose:r}){let{jwtStr:o,jwtObj:s}=await K(),i=(()=>{if(e==null&&!t)throw new Error("pipelineId or url is required");return e??ne(t??"")})(),p=await ee(i,o,s,n);if(p.length<=0){h.error(`No Gecko info found${n?` matching region [${n}]`:""} in latest run`);return}let{default:c}=await import("qrcode");for(let a=0;a<p.length;a++){let m=p[a];try{let l=await c.toString(m?.qrCodeScheme??"",{type:"terminal",small:!0,errorCorrectionLevel:"L"});console.log(`
4
4
 
5
5
  ${l}`),console.dir(m),a<p.length-1&&console.log(`
6
6
 
7
7
  -----------------
8
8
 
9
- `)}catch(l){console.error("Failed to generate QR:",l)}}}var $e={url:{alias:"u",desc:"Bits URL",string:!0,conflicts:["pipeline-id"]},"pipeline-id":{alias:"p",desc:"Pipeline ID (Overrides URL)",string:!0,conflicts:["url"]},region:{alias:"r",desc:"String-match based region filter",string:!0}},Z=[{command:"gecko",describe:"Show gecko info by bits URL",builder:e=>e.options($e).example("$0 tt-gecko -r us -u 'https://b??.net/devops/??/develop/detail/??/flow?devops_space_type=server_fe&pipelineId=1139212901634&stage=dev_gatekeeper_stage'","Example of URL mode, filtering us region"),handler(e){let{url:t,pipelineId:n,region:r,verbose:o}=e;Ie({url:t,pipelineId:n,region:r,verbose:o})}}];async function Y(e,t,n,r){let{response:o,getJson:s}=await A({pipelineId:e,pageSize:1,withoutJob:!1},t,n);o.ok||(y.error(`[getRunInfoByPipelineID] failed: ${o.status} ${o.statusText}
10
- ${await o.text()}`),process.exit(1));let i=await s();i.pipelineRuns[0]?.runStatus!==$.SUCCESS&&y.warn(`Latest run (runId=${i.pipelineRuns[0]?.runId}) status=${ne(i.pipelineRuns[0]?.runStatus)}. Gecko info may be unavailable.`);let p=ee(i.pipelineRuns,r);if(p.length)return p;let c=await Re(e,i.pipelineRuns);if(c)return Y(c,t,n,r);let a=await ke(e,t,n);return await ve(a,t,n)}function ee(e,t){return e.flatMap(n=>n.jobs.map(r=>{try{let o=r.jobAtom.output;if(!o)return null;let s=o.GECKO_packageInfo;if(!s)return null;let i=o.GECKO_region;if(t&&!i?.includes(t))return null;let p=JSON.parse(s),{qrCodeScheme:c,candidatePackage:a,channel:m,updatedAt:l,creator:h,distributeRule:d}=p.package,{scmVersion:w}=a,v=R(Number.parseInt(l,10)*1e3),I=d.envLaneList.flatMap(E=>E.values);return{qrCodeScheme:c,region:i,scmVersion:w,channel:m,updatedDate:v,creator:h,envs:I,runId:n.runId,runSeq:n.runSeq}}catch(o){return console.error(o),null}}).filter(r=>r!=null)).filter(n=>!!n)}async function Re(e,t){let n=t.flatMap(s=>s.jobs.map(i=>i.jobAtom.inputs?.trigger_params).filter(i=>!!i).filter(i=>i.detail_url.length));if(!n.length)return;z(`Found ${n.length} possible alternative pipeline(s) you may want to try instead.`,"Mistyped the pipeline ID?");let r=[{value:"",label:`(Keep current pipeline id=${e})`}].concat(n.map(s=>({value:te(s.detail_url),label:`${f.underline(s.development_task_name)} by ${s.developer.join(",")}`,hint:s.detail_url}))),o=await Q({message:"Select a pipeline to change, or cancel [ESC] to use the current pipeline.",options:r});if(V(o)||!o){K("Keep using current pipeline");return}return y.success(`Using new pipeline id=${o}`),o}async function ke(e,t,n){let{response:o,getJson:s}=await A({pipelineId:e,pageSize:10,withoutJob:!0},t,n);o.ok||(y.error(`[getRunInfoByPipelineID] failed: ${o.status} ${o.statusText}
11
- ${await o.text()}`),process.exit(1));let i=await s();i.pipelineRuns.length<=0&&(y.error(`No pipeline runs found in the most recent 10 runs
12
- ${JSON.stringify(i,null,1)}`),process.exit(1)),z("The latest pipeline run may be ongoing/failed. Try a previous run to inspect.","Select a previous run");let p=i.pipelineRuns.map(a=>{let m=ne(a.runStatus),l=xe(a),h=a.triggerInfo?.triggeredBy||a.createdBy||"?";return{value:a.runId,label:`#${a.runSeq} runId=${a.runId} ${m}`,hint:`${l} by ${h}`}}),c=await Q({message:"Select the run ID to inspect",options:p});return V(c)&&(K("Run selection cancelled"),process.exit(0)),c}async function ve(e,t,n){let{response:r,getJson:o}=await q(e,t,n);r.ok||(y.error(`[getRunDetailByRunID] failed: ${r.status} ${r.statusText}
13
- ${await r.text()}`),process.exit(1));let s=await o();return ee([s.pipelineRun])}function te(e){let t=/\bpipelineId=(\d+)\b/,r=e.match(t)?.[1]?.trim();if(r){if(!/^\d+$/.test(r))throw new Error("Invalid pipelineId query from URL. Expecting a pipelineId query value with all numbers");return r}throw new Error(`Invalid URL. Expecting a url containing ${f.bold(f.yellow("pipelineId"))} query param. E.g. `+f.underline(f.gray(`https://b??.net/devops/??/develop/detail/??/flow?devops_space_type=server_fe&${f.bold(f.magenta("pipelineId=1139212901634"))}&stage=dev_gatekeeper_stage`)))}function ne(e){switch(e){case $.RUNNING:return f.blue("RUNNING");case $.CANCELLED:return f.gray("CANCELLED");case $.SUCCESS:return f.green("SUCCESS");case $.FAIL:return f.red("FAIL")}return`status=${e}`}function xe(e){return e.startedAt?`started @ ${R(e.startedAt)}`:e.createdAt?`created @ ${R(e.createdAt)}`:"time=?"}import{access as Ce,constants as Se}from"node:fs/promises";async function re(e){let t=[".js",".cjs",".mjs"].map(n=>`${e}${n}`);for(let n of t)try{return await Ce(n,Se.R_OK),n}catch{}console.error(`tt i18n: Failed to read one of ${t.join(", ")}`),process.exit(1)}var oe=[{command:"i18n",describe:"I18n scan and sort",handler:async()=>{let[e,t]=await Promise.all([re("starling.config"),re("combine-lang")]),{execa:n,execaNode:r}=await import("execa");await n({stdio:"inherit"})`bunx @ies/starling-cli@3.6.27 scan -c ${e} --fallback --disable-browser`,await r({stdio:"inherit"})`${t}`,await n({stdio:"inherit"})`bunx --package=json-sort-cli sortjson ./src/lang`.catch(o=>console.error("tt i18n sortjson error:",o))}}];import{log as k,note as De,spinner as Ae}from"@clack/prompts";import{lstat as _e,readFile as Pe}from"node:fs/promises";import{join as Ee}from"node:path";async function P(){let e=Ee(process.cwd(),"./package.json");return(await _e(e)).isFile()?JSON.parse(await Pe(e,"utf8")):null}async function Ne({repoId:e,hash:t,branch:n}){let r=await P();r||(k.error(`Failed to get package.json at ${process.cwd()}`),process.exit(1));let o="SCM_USERNAME",s="SCM_PASSWORD",i=process.env[o],p=process.env[s];(!i||!p)&&(k.error(`Missing ${i?s:o} in env var.
14
- Go to https://luban.bytedance.net/npm/publish and get your personal SCM username & password.`),process.exit(1));let{execa:c}=await import("execa");try{let a=`${r.name}@${r.version}`,m=Ae();m.start(`Checking if ${a} is already published`);let{exitCode:l}=await c({reject:!1,stdio:"ignore"})`bun info ${a} version`;l===0?(m.stop("Same version found in registry!"),k.error(`${a} is already published! Did you update your package version?`),process.exit(1)):m.stop("Version not published. Proceeding...");let h=c`git log -1 --pretty=%s`,d,w;n==null?t?d=t:d=(await c`git rev-parse HEAD`).stdout.trim():n?w=n:w=(await c`git branch --show-current`).stdout.trim();let v={repos:e,create_user:i,desc:`v${r?.version}: ${(await h).stdout.trim()}`,has_version_stage:!1,version:r?.version,...d?{pub_base:"commit_base",base_commit_hash:d}:{pub_base:"branch_base",branch_name:w}};De(`${v.create_user} is publishing ${a} to repoId=${v.repos}
15
- ${d?`hash: ${d}`:`brch: ${w}`}`),m.start(`Publishing ${a} to Luban`);let I=await fetch("https://scm.byted.org/api/v2/npm_versions/",{method:"POST",headers:{Authorization:`Basic ${Buffer.from(`${i}:${p}`).toString("base64")}`,Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(v)});if(!I.ok){m.stop("Publish error!");let E=await I.text();k.error(`HTTP ${I.status} Error: ${E}`),process.exit(1)}m.stop(`${a} is published!`);let j=await I.text();k.success(`\u{1F389} Successfully published: ${j}`)}catch(a){k.error("Execution Failed:"),console.error(a),process.exit(1)}}var Oe={"by-hash":{alias:"h",desc:"Publish pkg by hash (default)",string:!0,conflicts:["by-branch"]},"by-branch":{alias:"b",desc:"Publish pkg by branch",string:!0,conflicts:["by-hash"]}},ie=[{command:"luban <repoId>",describe:"Publish current repo pkg to Luban",builder:e=>e.options(Oe).example("$0 tt luban 1234","Example of hash mode (current commit)").example("$0 tt luban 1234 --by-hash 123321","Example of hash mode (commit hash: 123321)").example("$0 tt luban 1234 --by-branch master","Example of branch mode (master branch)"),async handler(e){let{byHash:t,byBranch:n}=e,r=Number(e.repoId);await Ne({repoId:r,hash:t,branch:n})}}];import{unlink as je}from"node:fs/promises";import{join as Te}from"node:path";import{log as se,note as Le}from"@clack/prompts";import ae from"picocolors";import x from"base62";var g;(p=>{let e=0;p.RAX_WEBPAGE="/",p.RAX_CONNECT=`/${x.encode(e++)}`,p.RAX_DEVICE_INFO=`/${x.encode(e++)}`,p.RAX_CHANGE_ACCOUNT=`/${x.encode(e++)}`,p.RAX_SCRSHOT=`/${x.encode(e++)}`,p.RAX_OPEN_SCHEMA=`/${x.encode(e++)}`})(g||={});var C=["bunx","@tiktok-fe/rax-cli@>=0.3.28"];async function Je(e){let{execa:t}=await import("execa"),{default:n}=await import("express"),r=n();r.use(n.json()),r.get(g.RAX_WEBPAGE,(s,i)=>{i.sendFile(Te(import.meta.dirname,"index.html"))}),r.post(g.RAX_CONNECT,async(s,i)=>{throw new Error("unimplemented")}),r.get(g.RAX_DEVICE_INFO,async(s,i)=>{let{stdout:p}=await t`${C} device info`;if(p.trim().startsWith("Error:")){i.status(400).send(p);return}let c=JSON.parse(p);delete c.appInfo.appInfo.appIconBase64,delete c.appInfo.appSettings.language;let{account:a}=c.appInfo.appSettings;a.current={customID:a.current.customID,nickname:a.current.nickname,userID:a.current.userID};for(let m=0;m<(a.loginAccountList?.length??0);m++){if(!a.loginAccountList)continue;let l=a.loginAccountList[m];l&&(a.loginAccountList[m]={customID:l.customID,nickname:l.nickname,userID:l.userID})}i.json(c)}),r.post(g.RAX_CHANGE_ACCOUNT,async(s,i)=>{let{userID:p}=s.body;if(!p){i.sendStatus(400);return}let{stdout:c}=await t`${C} app account change ${p} --json`,a=JSON.parse(c).content?.[0]?.text;i.type("json").send(a)}),r.get(g.RAX_SCRSHOT,async(s,i)=>{let{execa:p}=await import("execa"),{default:c}=await import("sharp"),{temporaryFile:a}=await import("tempy"),m=a({extension:"png"}),{stdout:l,stderr:h}=await p`${C} device screenshot --output ${m}`;if(l.trim().includes("Cannot screenshot")||l.trim().includes("no available device")){i.status(404).send(l);return}let d=a({extension:"webp"});await c(m).webp({quality:70,effort:5,smartSubsample:!0}).toFile(d),je(m).catch(),i.sendFile(d)}),r.post(g.RAX_OPEN_SCHEMA,async(s,i)=>{let{execa:p}=await import("execa"),{schema:c}=s.body,{stdout:a}=await p`${C} device open-schema ${c}`;i.send(a)});let o=r.listen(e.port??0,()=>{let s=o.address(),i=typeof s!="string"?s?.port:void 0;i||(se.error(`Failed to get port from addr [${s}]`),process.exit(1));let p=Object.values(D()??{"":["localhost"]}).flat().sort((c,a)=>c.internal&&!a.internal?-1:!c.internal&&a.internal?1:c.family==="IPv4"&&a.family==="IPv6"?-1:c.family==="IPv6"&&a.family==="IPv4"?1:c.address.localeCompare(a.address)).map(c=>` ${c.internal?ae.green("[LOCAL]"):ae.yellow("[ LAN ]")} http://${c.family==="IPv6"?`[${c.address}]`:c.address}:${i}
16
- `);Le(`Server running at
17
- ${p.join("")}`),se.info(`\u{1F680} Try ${p[0]}`)})}var Ue={port:{alias:"p",desc:"Port for helper",number:!0}},ce=[{command:"rax",describe:"Start rax helper (web)",builder:Ue,handler:Je}];var pe=[{command:"tt",describe:"TT/BD internal toolset",builder:e=>e.command([...B,...Z,...oe,...ie,...ce]).demandCommand(1),handler(){}}];import{lstatSync as He}from"node:fs";import b from"node:process";import{log as u,note as Ge,spinner as Fe}from"@clack/prompts";import Be from"string-argv";var Me=e=>new Promise(t=>setTimeout(t,e)),qe=1e4;async function Xe(e){let t=await P();t||(u.error(`Failed to get package.json at ${b.cwd()}`),b.exit(1));let n=t.version,r=`${t.name}@${n}`,o=[...Be(e.installCmdPrefix),r];Ge(`\u{1F680} Monitoring ${r}...
9
+ `)}catch(l){console.error("Failed to generate QR:",l)}}}var xe={url:{alias:"u",desc:"Bits URL",string:!0,conflicts:["pipeline-id"]},"pipeline-id":{alias:"p",desc:"Pipeline ID (Overrides URL)",string:!0,conflicts:["url"]},region:{alias:"r",desc:"String-match based region filter",string:!0}},Y=[{command:"gecko",describe:"Show gecko info by bits URL",builder:e=>e.options(xe).example("$0 tt-gecko -r us -u 'https://b??.net/devops/??/develop/detail/??/flow?devops_space_type=server_fe&pipelineId=1139212901634&stage=dev_gatekeeper_stage'","Example of URL mode, filtering us region"),handler(e){let{url:t,pipelineId:n,region:r,verbose:o}=e;Ce({url:t,pipelineId:n,region:r,verbose:o})}}];async function ee(e,t,n,r){let{response:o,getJson:s}=await O({pipelineId:e,pageSize:1,withoutJob:!1},t,n);o.ok||(h.error(`[getRunInfoByPipelineID] failed: ${o.status} ${o.statusText}
10
+ ${await o.text()}`),process.exit(1));let i=await s();i.pipelineRuns[0]?.runStatus!==$.SUCCESS&&h.warn(`Latest run (runId=${i.pipelineRuns[0]?.runId}) status=${re(i.pipelineRuns[0]?.runStatus)}. Gecko info may be unavailable.`);let p=te(i.pipelineRuns,r);if(p.length)return p;let c=await ke(e,i.pipelineRuns);if(c)return ee(c,t,n,r);let a=await ve(e,t,n);return await _e(a,t,n)}function te(e,t){return e.flatMap(n=>n.jobs.map(r=>{try{let o=r.jobAtom.output;if(!o)return null;let s=o.GECKO_packageInfo;if(!s)return null;let i=o.GECKO_region;if(t&&!i?.includes(t))return null;let p=JSON.parse(s),{qrCodeScheme:c,candidatePackage:a,channel:m,updatedAt:l,creator:y,distributeRule:d}=p.package,{scmVersion:w}=a,x=R(Number.parseInt(l,10)*1e3),I=d.envLaneList.flatMap(A=>A.values);return{qrCodeScheme:c,region:i,scmVersion:w,channel:m,updatedDate:x,creator:y,envs:I,runId:n.runId,runSeq:n.runSeq}}catch(o){return console.error(o),null}}).filter(r=>r!=null)).filter(n=>!!n)}async function ke(e,t){let n=t.flatMap(s=>s.jobs.map(i=>i.jobAtom.inputs?.trigger_params).filter(i=>!!i).filter(i=>i.detail_url.length));if(!n.length)return;Q(`Found ${n.length} possible alternative pipeline(s) you may want to try instead.`,"Mistyped the pipeline ID?");let r=[{value:"",label:`(Keep current pipeline id=${e})`}].concat(n.map(s=>({value:ne(s.detail_url),label:`${f.underline(s.development_task_name)} by ${s.developer.join(",")}`,hint:s.detail_url}))),o=await Z({message:"Select a pipeline to change, or cancel [ESC] to use the current pipeline.",options:r});if(z(o)||!o){V("Keep using current pipeline");return}return h.success(`Using new pipeline id=${o}`),o}async function ve(e,t,n){let{response:o,getJson:s}=await O({pipelineId:e,pageSize:10,withoutJob:!0},t,n);o.ok||(h.error(`[getRunInfoByPipelineID] failed: ${o.status} ${o.statusText}
11
+ ${await o.text()}`),process.exit(1));let i=await s();i.pipelineRuns.length<=0&&(h.error(`No pipeline runs found in the most recent 10 runs
12
+ ${JSON.stringify(i,null,1)}`),process.exit(1)),Q("The latest pipeline run may be ongoing/failed. Try a previous run to inspect.","Select a previous run");let p=i.pipelineRuns.map(a=>{let m=re(a.runStatus),l=Se(a),y=a.triggerInfo?.triggeredBy||a.createdBy||"?";return{value:a.runId,label:`#${a.runSeq} runId=${a.runId} ${m}`,hint:`${l} by ${y}`}}),c=await Z({message:"Select the run ID to inspect",options:p});return z(c)&&(V("Run selection cancelled"),process.exit(0)),c}async function _e(e,t,n){let{response:r,getJson:o}=await X(e,t,n);r.ok||(h.error(`[getRunDetailByRunID] failed: ${r.status} ${r.statusText}
13
+ ${await r.text()}`),process.exit(1));let s=await o();return te([s.pipelineRun])}function ne(e){let t=/\bpipelineId=(\d+)\b/,r=e.match(t)?.[1]?.trim();if(r){if(!/^\d+$/.test(r))throw new Error("Invalid pipelineId query from URL. Expecting a pipelineId query value with all numbers");return r}throw new Error(`Invalid URL. Expecting a url containing ${f.bold(f.yellow("pipelineId"))} query param. E.g. `+f.underline(f.gray(`https://b??.net/devops/??/develop/detail/??/flow?devops_space_type=server_fe&${f.bold(f.magenta("pipelineId=1139212901634"))}&stage=dev_gatekeeper_stage`)))}function re(e){switch(e){case $.RUNNING:return f.blue("RUNNING");case $.CANCELLED:return f.gray("CANCELLED");case $.SUCCESS:return f.green("SUCCESS");case $.FAIL:return f.red("FAIL")}return`status=${e}`}function Se(e){return e.startedAt?`started @ ${R(e.startedAt)}`:e.createdAt?`created @ ${R(e.createdAt)}`:"time=?"}import{access as Ne,constants as Pe}from"node:fs/promises";async function oe(e){let t=[".js",".cjs",".mjs"].map(n=>`${e}${n}`);for(let n of t)try{return await Ne(n,Pe.R_OK),n}catch{}console.error(`tt i18n: Failed to read one of ${t.join(", ")}`),process.exit(1)}var ie=[{command:"i18n",describe:"I18n scan and sort",handler:async()=>{let[e,t]=await Promise.all([oe("starling.config"),oe("combine-lang")]),{execa:n,execaNode:r}=await import("execa");await n({stdio:"inherit"})`bunx @ies/starling-cli@3.6.27 scan -c ${e} --fallback --disable-browser`,await r({stdio:"inherit"})`${t}`,await n({stdio:"inherit"})`bunx --package=json-sort-cli sortjson ./src/lang`.catch(o=>console.error("tt i18n sortjson error:",o))}}];import{log as C,note as Oe,spinner as je}from"@clack/prompts";import{lstat as Ee,readFile as Ae}from"node:fs/promises";import{join as De}from"node:path";async function E(){let e=De(process.cwd(),"./package.json");return(await Ee(e)).isFile()?JSON.parse(await Ae(e,"utf8")):null}async function Te({repoId:e,hash:t,branch:n}){let r=await E();r||(C.error(`Failed to get package.json at ${process.cwd()}`),process.exit(1));let o="SCM_USERNAME",s="SCM_PASSWORD",i=process.env[o],p=process.env[s];(!i||!p)&&(C.error(`Missing ${i?s:o} in env var.
14
+ Go to https://luban.bytedance.net/npm/publish and get your personal SCM username & password.`),process.exit(1));let{execa:c}=await import("execa");try{let a=`${r.name}@${r.version}`,m=je();m.start(`Checking if ${a} is already published`);let{exitCode:l}=await c({reject:!1,stdio:"ignore"})`bun info ${a} version`;l===0?(m.stop("Same version found in registry!"),C.error(`${a} is already published! Did you update your package version?`),process.exit(1)):m.stop("Version not published. Proceeding...");let y=c`git log -1 --pretty=%s`,d,w;n==null?t?d=t:d=(await c`git rev-parse HEAD`).stdout.trim():n?w=n:w=(await c`git branch --show-current`).stdout.trim();let x={repos:e,create_user:i,desc:`v${r?.version}: ${(await y).stdout.trim()}`,has_version_stage:!1,version:r?.version,...d?{pub_base:"commit_base",base_commit_hash:d}:{pub_base:"branch_base",branch_name:w}};Oe(`${x.create_user} is publishing ${a} to repoId=${x.repos}
15
+ ${d?`hash: ${d}`:`brch: ${w}`}`),m.start(`Publishing ${a} to Luban`);let I=await fetch("https://scm.byted.org/api/v2/npm_versions/",{method:"POST",headers:{Authorization:`Basic ${Buffer.from(`${i}:${p}`).toString("base64")}`,Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(x)});if(!I.ok){m.stop("Publish error!");let A=await I.text();C.error(`HTTP ${I.status} Error: ${A}`),process.exit(1)}m.stop(`${a} is published!`);let L=await I.text();C.success(`\u{1F389} Successfully published: ${L}`)}catch(a){C.error("Execution Failed:"),console.error(a),process.exit(1)}}var Le={"by-hash":{alias:"h",desc:"Publish pkg by hash (default)",string:!0,conflicts:["by-branch"]},"by-branch":{alias:"b",desc:"Publish pkg by branch",string:!0,conflicts:["by-hash"]}},se=[{command:"luban <repoId>",describe:"Publish current repo pkg to Luban",builder:e=>e.options(Le).example("$0 tt luban 1234","Example of hash mode (current commit)").example("$0 tt luban 1234 --by-hash 123321","Example of hash mode (commit hash: 123321)").example("$0 tt luban 1234 --by-branch master","Example of branch mode (master branch)"),async handler(e){let{byHash:t,byBranch:n}=e,r=Number(e.repoId);await Te({repoId:r,hash:t,branch:n})}}];import{unlink as Je}from"node:fs/promises";import{join as Ue}from"node:path";import{log as ae,note as Be}from"@clack/prompts";import ce from"picocolors";import k from"base62";var g;(p=>{let e=0;p.RAX_WEBPAGE="/",p.RAX_CONNECT=`/${k.encode(e++)}`,p.RAX_DEVICE_INFO=`/${k.encode(e++)}`,p.RAX_CHANGE_ACCOUNT=`/${k.encode(e++)}`,p.RAX_SCRSHOT=`/${k.encode(e++)}`,p.RAX_OPEN_SCHEMA=`/${k.encode(e++)}`})(g||={});var v=["bunx","@tiktok-fe/rax-cli@>=0.3.28"];async function He(e){let{execa:t}=await import("execa"),{default:n}=await import("express"),r=n();r.use(n.json()),r.get(g.RAX_WEBPAGE,(s,i)=>{i.sendFile(Ue(import.meta.dirname,"index.html"))}),r.post(g.RAX_CONNECT,async(s,i)=>{throw new Error("unimplemented")}),r.get(g.RAX_DEVICE_INFO,async(s,i)=>{let{stdout:p}=await t`${v} device info`;if(p.trim().startsWith("Error:")){i.status(400).send(p);return}let c=JSON.parse(p);delete c.appInfo.appInfo.appIconBase64,delete c.appInfo.appSettings.language;let{account:a}=c.appInfo.appSettings;a.current={customID:a.current.customID,nickname:a.current.nickname,userID:a.current.userID};for(let m=0;m<(a.loginAccountList?.length??0);m++){if(!a.loginAccountList)continue;let l=a.loginAccountList[m];l&&(a.loginAccountList[m]={customID:l.customID,nickname:l.nickname,userID:l.userID})}i.json(c)}),r.post(g.RAX_CHANGE_ACCOUNT,async(s,i)=>{let{userID:p}=s.body;if(!p){i.sendStatus(400);return}let{stdout:c}=await t`${v} app account change ${p} --json`,a=JSON.parse(c).content?.[0]?.text;i.type("json").send(a)}),r.get(g.RAX_SCRSHOT,async(s,i)=>{let{execa:p}=await import("execa"),{default:c}=await import("sharp"),{temporaryFile:a}=await import("tempy"),m=a({extension:"png"}),{stdout:l,stderr:y}=await p`${v} device screenshot --output ${m}`;if(l.trim().includes("Cannot screenshot")||l.trim().includes("no available device")){i.status(404).send(l);return}let d=a({extension:"webp"});await c(m).webp({quality:70,effort:5,smartSubsample:!0}).toFile(d),Je(m).catch(),i.sendFile(d)}),r.post(g.RAX_OPEN_SCHEMA,async(s,i)=>{let{execa:p}=await import("execa"),{schema:c}=s.body,{stdout:a}=await p`${v} device open-schema ${c}`;i.send(a)});let o=r.listen(e.port??0,()=>{let s=o.address(),i=typeof s!="string"?s?.port:void 0;i||(ae.error(`Failed to get port from addr [${s}]`),process.exit(1));let p=Object.values(D()??{"":["localhost"]}).flat().sort((c,a)=>c.internal&&!a.internal?-1:!c.internal&&a.internal?1:c.family==="IPv4"&&a.family==="IPv6"?-1:c.family==="IPv6"&&a.family==="IPv4"?1:c.address.localeCompare(a.address)).map(c=>` ${c.internal?ce.green("[LOCAL]"):ce.yellow("[ LAN ]")} http://${c.family==="IPv6"?`[${c.address}]`:c.address}:${i}
16
+ `);Be(`Server running at
17
+ ${p.join("")}`),ae.info(`\u{1F680} Try ${p[0]}`)})}var Ge={port:{alias:"p",desc:"Port for helper",number:!0}},pe=[{command:"rax",describe:"Start rax helper (web)",builder:Ge,handler:He}];var me=[{command:"tt",describe:"TT/BD internal toolset",builder:e=>e.command([...F,...Y,...ie,...se,...pe]).demandCommand(1),handler(){}}];import{lstatSync as Me}from"node:fs";import b from"node:process";import{log as u,note as Fe,spinner as qe}from"@clack/prompts";import Xe from"string-argv";var We=e=>new Promise(t=>setTimeout(t,e)),Ke=1e4;async function Ve(e){let t=await E();t||(u.error(`Failed to get package.json at ${b.cwd()}`),b.exit(1));let n=t.version,r=`${t.name}@${n}`,o=[...Xe(e.installCmdPrefix),r];Fe(`\u{1F680} Monitoring ${r}...
18
18
  \u{1F4C2} Target: ${e.target}
19
- \u{1F6E0} Install cmd: ${o.join(" ")}`);let{execa:s}=await import("execa");try{u.info("Pulling latest changes in target repo..."),await s({cwd:e.target,stdin:"ignore",stdout:"ignore",stderr:"inherit"})`git pull`,u.success("Latest commit pulled");let i=Fe();i.start();let p=Date.now();for(let c=1;;c++){i.message(`Waiting for ${r}, attempt ${c}`);let{exitCode:a}=await s({reject:!1,stdio:"ignore"})`npm view ${r} version`;if(a===0){i.stop(`#${c}: ${r} is live! Found it \u2705`);try{u.info(`Installing ${r} via ${o}`),await s({cwd:e.target,stdio:"inherit"})`${o}`,u.success(`${r} installed! \u2705`);break}catch(l){u.error(`${r} was found in registry, but install command failed. Err: ${l}`),b.exit(1)}}(Date.now()-p)/1e3>=e.timeout&&(i.stop(`Didn't find ${r} in ${e.timeout} sec(s)`),b.exit(1)),await Me(qe)}if(e.skipCommit)u.info("Git-commit skipped");else{let{stdout:c}=await s({cwd:e.target})`git ls-files --others --exclude-standard`;c.trim()&&(u.error(`Target repo has untracked files. Please commit or remove them manually before running wup:
20
- ${c}`),b.exit(1)),u.info("Committing changes..."),await s({cwd:e.target,stdio:"inherit"})`git commit -am ${`chore: upd ${r}`}`,u.success("Committed \u2705"),u.info("Pushing to remote..."),await s({cwd:e.target,stdio:"inherit"})`git push`,u.success("Pushed \u2705")}u.success("\u{1F389} DONE!")}catch(i){console.error(`
21
- \u274C Task failed:`,i),b.exit(1)}}var N={target:{alias:"t",desc:"Target repository path",demandOption:!0,normalize:!0},"install-cmd-prefix":{alias:"cmd",desc:"Pkg install command prefix. Default: pnpm add",default:"pnpm add"},timeout:{desc:"Timeout checking new pkg version in sec",default:300,type:"number"},"skip-commit":{desc:"Do not commit changes",default:!1,type:"boolean"}},me=[{command:"wup",describe:"[W]ait for pkg publish, [U]pdate target repo, and [P]ush",builder:e=>e.options(N).example('$0 wup -t "/tmp/..." --cmd "emo add"',"Install w/ eden-mono").example('$0 wup -t "/tmp/..." --cmd "rush add --make-consistent -p" --skip-commit',"Install w/ @microsoft/rush"),async handler(e){let{target:t,installCmdPrefix:n=N["install-cmd-prefix"].default,"skip-commit":r=N["skip-commit"].default,verbose:o}=e,s=Number(e.timeout);(!Number.isFinite(s)||s<=0)&&(u.error(`Timeout must be a positive number, received: ${e.timeout}`),b.exit(1));let i=`Path ${t} is not a directory.`;try{if(!t||!He(t).isDirectory())throw new Error(i)}catch(p){u.error(`${i}. Err: ${p}`),b.exit(1)}await Xe({target:t,installCmdPrefix:n,timeout:s,skipCommit:!!r,verbose:o})}}];var O=JSON.parse(await We(Ke(import.meta.dirname,"../package.json"),"utf8"));Ve(`\u{1F44B} ${O.name} v${O.version}`);var Ze=[...G,...F,...me,...T,...J,...pe];ze().scriptName("hi").version(O.version).option("verbose",{type:"boolean",description:"Run with verbose logging",global:!0}).strict().recommendCommands().command(Ze).help().parse(Qe(process.argv));export{O as PKG};
19
+ \u{1F6E0} Install cmd: ${o.join(" ")}`);let{execa:s}=await import("execa");try{u.info("Pulling latest changes in target repo...");let i=await _(e.target),p=await S({cwd:e.target,branchName:i});await s({cwd:e.target,stdin:"ignore",stdout:"ignore",stderr:"inherit"})`git pull ${p} ${i}`,u.success("Latest commit pulled");let c=qe();c.start();let a=Date.now();for(let m=1;;m++){c.message(`Waiting for ${r}, attempt ${m}`);let{exitCode:l}=await s({reject:!1,stdio:"ignore"})`npm view ${r} version`;if(l===0){c.stop(`#${m}: ${r} is live! Found it \u2705`);try{u.info(`Installing ${r} via ${o}`),await s({cwd:e.target,stdio:"inherit"})`${o}`,u.success(`${r} installed! \u2705`);break}catch(d){u.error(`${r} was found in registry, but install command failed. Err: ${d}`),b.exit(1)}}(Date.now()-a)/1e3>=e.timeout&&(c.stop(`Didn't find ${r} in ${e.timeout} sec(s)`),b.exit(1)),await We(Ke)}if(e.skipCommit)u.info("Git-commit skipped");else{let{stdout:m}=await s({cwd:e.target})`git ls-files --others --exclude-standard`;m.trim()&&(u.error(`Target repo has untracked files. Please commit or remove them manually before running wup:
20
+ ${m}`),b.exit(1)),u.info("Committing changes..."),await s({cwd:e.target,stdio:"inherit"})`git commit -am ${`chore: upd ${r}`}`,u.success("Committed \u2705"),u.info("Pushing to remote..."),await s({cwd:e.target,stdio:"inherit"})`git push`,u.success("Pushed \u2705")}u.success("\u{1F389} DONE!")}catch(i){console.error(`
21
+ \u274C Task failed:`,i),b.exit(1)}}var j={target:{alias:"t",desc:"Target repository path",demandOption:!0,normalize:!0},"install-cmd-prefix":{alias:"cmd",desc:"Pkg install command prefix. Default: pnpm add",default:"pnpm add"},timeout:{desc:"Timeout checking new pkg version in sec",default:300,type:"number"},"skip-commit":{desc:"Do not commit changes",default:!1,type:"boolean"}},le=[{command:"wup",describe:"[W]ait for pkg publish, [U]pdate target repo, and [P]ush",builder:e=>e.options(j).example('$0 wup -t "/tmp/..." --cmd "emo add"',"Install w/ eden-mono").example('$0 wup -t "/tmp/..." --cmd "rush add --make-consistent -p" --skip-commit',"Install w/ @microsoft/rush"),async handler(e){let{target:t,installCmdPrefix:n=j["install-cmd-prefix"].default,"skip-commit":r=j["skip-commit"].default,verbose:o}=e,s=Number(e.timeout);(!Number.isFinite(s)||s<=0)&&(u.error(`Timeout must be a positive number, received: ${e.timeout}`),b.exit(1));let i=`Path ${t} is not a directory.`;try{if(!t||!Me(t).isDirectory())throw new Error(i)}catch(p){u.error(`${i}. Err: ${p}`),b.exit(1)}await Ve({target:t,installCmdPrefix:n,timeout:s,skipCommit:!!r,verbose:o})}}];var T=JSON.parse(await ze(Qe(import.meta.dirname,"../package.json"),"utf8"));Ze(`\u{1F44B} ${T.name} v${T.version}`);var tt=[...G,...M,...le,...J,...B,...me];Ye().scriptName("hi").version(T.version).option("verbose",{type:"boolean",description:"Run with verbose logging",global:!0}).strict().recommendCommands().command(tt).help().parse(et(process.argv));export{T as PKG};
22
22
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jerryc05/hi-tools",
3
- "version": "0.3.3",
3
+ "version": "0.3.5",
4
4
  "description": "A collection of my everyday SDE tools.",
5
5
  "scripts": {
6
6
  "pub": "npm run build && export NPM_CONFIG_REGISTRY=https://registry.npmjs.org &&{ npm whoami || npm login ;} && npm publish --access public && git push",
@@ -25,7 +25,7 @@
25
25
  "yargs": "^18.0.0"
26
26
  },
27
27
  "optionalDependencies": {
28
- "@byted/aipaas-auth": "^0.1.0",
28
+ "@byted/aipaas-auth": "^0.3.1",
29
29
  "@clack/prompts": "^1.3.0",
30
30
  "base62": "^2.0.2",
31
31
  "bignumber.js": "^11.1.4",