@jerryc05/hi-tools 0.3.7 → 0.3.8
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.
- package/README.md +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
package/dist/index.js
CHANGED
|
@@ -9,7 +9,7 @@ ${l}`),console.dir(m),a<p.length-1&&console.log(`
|
|
|
9
9
|
`)}catch(l){console.error("Failed to generate QR:",l)}}}var Ce={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}},ee=[{command:"gecko",describe:"Show gecko info by bits URL",builder:e=>e.options(Ce).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;Re({url:t,pipelineId:n,region:r,verbose:o})}}];async function te(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
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=${oe(i.pipelineRuns[0]?.runStatus)}. Gecko info may be unavailable.`);let p=ne(i.pipelineRuns,r);if(p.length)return p;let c=await ke(e,i.pipelineRuns);if(c)return te(c,t,n,r);let a=await xe(e,t,n);return await ve(a,t,n)}function ne(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,C=N(Number.parseInt(l,10)*1e3),I=d.envLaneList.flatMap(A=>A.values);return{qrCodeScheme:c,region:i,scmVersion:w,channel:m,updatedDate:C,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;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:re(s.detail_url),label:`${f.underline(s.development_task_name)} by ${s.developer.join(",")}`,hint:s.detail_url}))),o=await Y({message:"Select a pipeline to change, or cancel [ESC] to use the current pipeline.",options:r});if(Q(o)||!o){z("Keep using current pipeline");return}return h.success(`Using new pipeline id=${o}`),o}async function xe(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
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)),Z("The latest pipeline run may be ongoing/failed. Try a previous run
|
|
12
|
+
${JSON.stringify(i,null,1)}`),process.exit(1)),Z("The latest pipeline run may be ongoing/failed. Try to inspect a previous run.","Select a previous run");let p=i.pipelineRuns.map(a=>{let m=oe(a.runStatus),l=_e(a),y=a.triggerInfo?.triggeredBy||a.createdBy||"?";return{value:a.runId,label:`#${a.runSeq} runId=${a.runId} ${m}`,hint:`${l} by ${y}`}});if(p.length==1)return p[0].value;let c=await Y({message:"Select the run ID to inspect",options:p});return Q(c)&&(z("Run selection cancelled"),process.exit(0)),c}async function ve(e,t,n){let{response:r,getJson:o}=await X(e,t,n);r.ok||(h.error(`[getRunDetailByRunID] failed: ${r.status} ${r.statusText}
|
|
13
13
|
${await r.text()}`),process.exit(1));let s=await o();return ne([s.pipelineRun])}function re(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 oe(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 _e(e){return e.startedAt?`started @ ${N(e.startedAt)}`:e.createdAt?`created @ ${N(e.createdAt)}`:"time=?"}import{access as Se,constants as Ne}from"node:fs/promises";async function ie(e){let t=[".js",".cjs",".mjs"].map(n=>`${e}${n}`);for(let n of t)try{return await Se(n,Ne.R_OK),n}catch{}console.error(`tt i18n: Failed to read one of ${t.join(", ")}`),process.exit(1)}var se=[{command:"i18n",describe:"I18n scan and sort",handler:async()=>{let[e,t]=await Promise.all([ie("starling.config"),ie("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 R,note as De,spinner as Oe}from"@clack/prompts";import{lstat as Pe,readFile as Ee}from"node:fs/promises";import{join as Ae}from"node:path";async function E(){let e=Ae(process.cwd(),"./package.json");return(await Pe(e)).isFile()?JSON.parse(await Ee(e,"utf8")):null}async function je({repoId:e,hash:t,branch:n}){let r=await E();r||(R.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)&&(R.error(`Missing ${i?s:o} in env var.
|
|
14
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=Oe();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!"),R.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 C={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}};De(`${C.create_user} is publishing ${a} to repoId=${C.repos}
|
|
15
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(C)});if(!I.ok){m.stop("Publish error!");let A=await I.text();R.error(`HTTP ${I.status} Error: ${A}`),process.exit(1)}m.stop(`${a} is published!`);let L=await I.text();R.success(`\u{1F389} Successfully published: ${L}`)}catch(a){R.error("Execution Failed:"),console.error(a),process.exit(1)}}var Te={"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"]}},ae=[{command:"luban <repoId>",describe:"Publish current repo pkg to Luban",builder:e=>e.options(Te).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 je({repoId:r,hash:t,branch:n})}}];import{unlink as Le}from"node:fs/promises";import{join as Je}from"node:path";import{log as ce,note as Ue}from"@clack/prompts";import pe 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 x=["bunx","@tiktok-fe/rax-cli@>=0.3.28"];async function Be(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(Je(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`${x} 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`${x} 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`${x} 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),Le(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`${x} 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||(ce.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?pe.green("[LOCAL]"):pe.yellow("[ LAN ]")} http://${c.family==="IPv6"?`[${c.address}]`:c.address}:${i}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jerryc05/hi-tools",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.8",
|
|
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",
|