| // @bun |
| var{argv:G}=globalThis.Bun;var{$:W}=globalThis.Bun;class Q{static parseArguments(z,J){let B={};if(J==="add"){let D=null,F="";for(let N of z)if(N.includes("=")){if(D!==null)B[D]=F.trim();let[E,X=""]=N.split("=",2);D=E.toUpperCase().trim(),F=X}else F+=` ${N}`;if(D!==null)B[D]=F.trim()}else if(J==="remove")for(let D of z)B[D.toUpperCase().trim()]="";return B}static printTable(z,J){try{let B=Object.keys(J),D=Math.max(...B.map((X)=>X.length)),F=Math.max(...B.map((X)=>J[X].length)),N=D+F+7,E="";return E+=` |
| ${z} |
| `,E+="-".repeat(N)+` |
| `,E+=`| ${"Key".padEnd(D)} | ${"Value".padEnd(F)} | |
| `,E+="-".repeat(N)+` |
| `,B.forEach((X)=>{E+=`| ${X.padEnd(D)} | ${J[X].padEnd(F)} | |
| `}),E+="-".repeat(N)+` |
| `,E}catch(B){return""}}static escapeShellArg(z){return`"${z.replace(/(["\\$`])/g,"\\$1")}"`}static async runOps(z){try{let J=process.env.OPS_CMD||null,B=z.length>0?" "+z.concat(" "):"";return await W`$OPS_CMD ${{raw:B}}`.text()}catch(J){return!1}}static async opsConfig(z,J){try{let B=z.toUpperCase().trim();if(J.trim().length>0){let F=Q.escapeShellArg(J);await Q.runOps(`-config ${B}=${F}`)}else await Q.runOps(`-config -r ${B}`);return!0}catch(B){return!1}}static async checkEnv(z,J,B=!0){let D=!0;try{let F=await Q.runOps("-config -d"),N=String(F).split(` |
| `),E=[];for(let X of N)if(X.indexOf("=")>-1){let Y=X.split("=");if(Y[0])E.push(Y[0])}for(let X in z)if(!E.includes(X)){D=!1;break}if(!D){if(B)console.log("WARNING: Your local env is out of sync. Repeat ops -login to sync.");return!1}return!0}catch(F){return console.log(F),!1}}static async requestSecrets(z,J,B,D){let F=`${B}/api/v1/web/whisk-system/nuv/secrets`,N=process.env.AUTH||"";try{let E=await fetch(F,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`${N}`},body:JSON.stringify({login:J,env:D})});if(!E.ok)throw new Error(`Failed to ${z} secrets: ${await E.text()}`);return E.json()}catch(E){throw new Error(`Failed to ${z} secrets`)}}}async function C(){if(G.length<5)console.error("Usage: bun addsecret.js <username> <apihost> <operation> [<key>=<value>...|<format>]"),process.exit(1);let z=G[2],J=G[3],B=G[4],D;if(z==="list")D=G[5]||"table";let F=G.slice(5),N=Q.parseArguments(F,z);if(!["add","remove","list"].includes(z))console.error(`Invalid operation: ${z}`),process.exit(1);try{let E=`${B}/api/v1/web/whisk-system/nuv/secrets`,X={login:J,env:N},Y=await Q.requestSecrets(z,J,E,N),H=Y.env,R=Object.keys(Y).includes("sysenv")?Y.sysenv:[],Z="",q=0,w=!0;switch(z){case"add":let T=Object.keys(Y).includes("added")?Y.added:[],$=Object.keys(Y).includes("changed")?Y.changed:[],M=Object.keys(T).length||0,P=Object.keys($).length||0;if(q=M+P,q===0)Z+="No secret was added";else{if(M>0)Z+=`${M>0?"One secret":M+" secrets"} added: ${T.join(", ")} |
| `;if(P>0)Z+=`${P>0?"One secret":P+" secrets"} changed: ${$.join(", ")} |
| `;for(let _ of[...T,...$]){let U=N[_];if(!await Q.opsConfig(_,U))w=!1}}break;case"remove":let f=Object.keys(Y).includes("removed")?Y.removed:[];if(q=Object.keys(f).length||0,q===0)Z+="No secret was removed";else{for(let _ of f)if(!await Q.opsConfig(_,""))w=!1;Z+=`${q>0?"One secret":q+" secrets"} removed: ${f.join(", ")} |
| `}break;case"list":switch(D){case"table":if(Z+=Q.printTable("Current Env",H),Object.keys(R).length>0)Z+=Q.printTable("Overwritten System Envs",R);break;case"json":Z+=JSON.stringify(H,null,2);break;case"raw":Object.keys(H).forEach((_)=>{Z+=`${_}=${H[_]} |
| `});break}break}console.log(Z),await Q.checkEnv(H,R)}catch(E){console.error("Error while making API request"),process.exit(1)}process.exit(0)}C(); |