xtra-cli 1.0.6 → 1.0.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/dist/bin/xtra.js +2 -2
- package/dist/commands/access.js +1 -1
- package/dist/commands/admin.js +3 -3
- package/dist/commands/audit.js +1 -1
- package/dist/commands/branch.js +1 -1
- package/dist/commands/checkout.js +1 -1
- package/dist/commands/ci.js +6 -6
- package/dist/commands/diff.js +3 -3
- package/dist/commands/doctor.js +2 -2
- package/dist/commands/env.js +1 -1
- package/dist/commands/export.js +2 -2
- package/dist/commands/generate.js +2 -2
- package/dist/commands/history.js +2 -2
- package/dist/commands/import.js +1 -1
- package/dist/commands/init.js +2 -2
- package/dist/commands/integration.js +3 -3
- package/dist/commands/jit-run.js +1 -1
- package/dist/commands/local.js +5 -5
- package/dist/commands/login.js +4 -4
- package/dist/commands/login.test.js +4 -4
- package/dist/commands/logout.js +1 -1
- package/dist/commands/logs.js +1 -1
- package/dist/commands/project.js +1 -1
- package/dist/commands/rollback.js +1 -1
- package/dist/commands/rotate.js +2 -2
- package/dist/commands/run.js +3 -3
- package/dist/commands/secrets.js +3 -3
- package/dist/commands/service-account.js +3 -3
- package/dist/commands/simulate.js +2 -2
- package/dist/commands/status.js +1 -1
- package/dist/commands/template.js +2 -2
- package/dist/commands/ui.js +1 -1
- package/dist/commands/watch.js +3 -3
- package/dist/lib/api.js +1 -1
- package/dist/lib/api.test.js +1 -1
- package/dist/lib/audit.js +1 -1
- package/dist/lib/config.js +1 -1
- package/dist/lib/config.test.js +1 -1
- package/package.json +1 -1
package/dist/lib/audit.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var J=Object.create;var d=Object.defineProperty;var K=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var G=Object.getPrototypeOf,q=Object.prototype.hasOwnProperty;var V=(t,e)=>{for(var s in e)d(t,s,{get:e[s],enumerable:!0})}
|
|
1
|
+
var J=Object.create;var d=Object.defineProperty;var K=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var G=Object.getPrototypeOf,q=Object.prototype.hasOwnProperty;var V=(t,e)=>{for(var s in e)d(t,s,{get:e[s],enumerable:!0})},$=(t,e,s,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of F(e))!q.call(t,o)&&o!==s&&d(t,o,{get:()=>e[o],enumerable:!(n=K(e,o))||n.enumerable});return t};var i=(t,e,s)=>(s=t!=null?J(G(t)):{},$(e||!t||!t.__esModule?d(s,"default",{value:t,enumerable:!0}):s,t)),z=t=>$(d({},"__esModule",{value:!0}),t);var W={};V(W,{loadAuditLogs:()=>y,logAudit:()=>M,saveAuditLogs:()=>f,syncAuditLogs:()=>Q});module.exports=z(W);var g=i(require("fs")),v=i(require("path")),D=require("uuid");var c=i(require("crypto")),k=i(require("conf")),b=require("node-machine-id"),A="aes-256-gcm",x=new k.default({projectName:"xtra-cli-crypto"});function I(){let t=x.get("masterKey");t||(t=c.default.randomBytes(32).toString("hex"),x.set("masterKey",t));let e=(0,b.machineIdSync)();return c.default.createHash("sha256").update(t+e).digest()}var C=t=>{let e=c.default.randomBytes(16),s=I(),n=c.default.createCipheriv(A,s,e),o=n.update(t,"utf8","hex");o+=n.final("hex");let a=n.getAuthTag();return{iv:e.toString("hex"),content:o,tag:a.toString("hex")}},U=t=>{let e=I(),s=Buffer.from(t.iv,"hex"),n=Buffer.from(t.tag,"hex"),o=c.default.createDecipheriv(A,e,s);o.setAuthTag(n);let a=o.update(t.content,"hex","utf8");return a+=o.final("utf8"),a};var L=i(require("conf"));var m="https://www.xtrasecurity.in/api",u=new L.default({projectName:"xtra-cli",defaults:{apiUrl:m}}),R=u.get("apiUrl");R&&!process.env.XTRA_API_URL&&R.includes("xtra-security.vercel.app")&&u.set("apiUrl",m);var p=()=>({...u.store,apiUrl:process.env.XTRA_API_URL||u.get("apiUrl")||m});var B=()=>u.get("token");var O=i(require("axios"));var T=i(require("fs")),P=i(require("path")),H=JSON.parse(T.readFileSync(P.join(__dirname,"../../package.json"),"utf-8")),r=()=>{let{apiUrl:t}=p(),e=B();return O.default.create({baseURL:t,headers:{"Content-Type":"application/json","X-CLI-Version":H.version,...e?{Authorization:`Bearer ${e}`}:{}}})},_={login:async(t,e,s)=>(await r().post("/auth/cli-login",{email:t,password:e,apiKey:s})).data,getSecrets:async(t,e,s="main")=>(await r().get(`/projects/${t}/envs/${e}/secrets?branch=${s}`)).data,getSecretVersions:async(t,e,s="main")=>(await r().get(`/projects/${t}/envs/${e}/secrets?includeVersions=true&branch=${s}`)).data,setSecrets:async(t,e,s,n,o="main")=>(await r().post(`/projects/${t}/envs/${e}/secrets`,{secrets:s,expectedVersions:n,branch:o})).data,getSecretDetails:async(t,e,s,n="main")=>(await r().get(`/projects/${t}/envs/${e}/secrets/${s}?branch=${n}`)).data,syncLogs:async t=>(await r().post("/audit/cli-logs",{logs:t})).data,linkSecret:async(t,e,s,n,o,a)=>(await r().post(`/projects/${t}/envs/${e}/secrets/link`,{key:s,sourceProjectId:n,sourceEnv:o,sourceKey:a})).data,rotateSecret:async(t,e,s,n,o)=>(await r().post(`/projects/${t}/envs/${e}/secrets/${s}/rotate`,{strategy:n,parsedNewValue:o})).data,promoteSecret:async(t,e,s)=>(await r().post(`/projects/${t}/envs/${e}/secrets/${s}/promote`,{})).data,verifyAuditLogs:async()=>(await r().get("/audit/verify")).data,exportAuditLogs:async(t,e,s,n)=>{let o={format:t};return e&&(o.startDate=e),s&&(o.endDate=s),n&&(o.projectId=n),(await r().post("/audit/export",o,{responseType:t==="csv"?"text":"json"})).data},requestAccess:async(t,e,s,n)=>(await r().post("/access/request",{projectId:t,secretId:n,reason:e,duration:s})).data,approveAccess:async(t,e)=>(await r().post("/access/approve",{requestId:t,decision:e})).data,listAccessRequests:async t=>{let{workspace:e}=p(),s=e?`&workspaceId=${e}`:"";return(await r().get(`/access/list?mode=${t}${s}`)).data},getAccessRequestStatus:async t=>(await r().get(`/access/request?id=${t}`)).data,getProjects:async()=>{let{workspace:t}=p(),e=t?`/project?workspaceId=${t}`:"/project";return(await r().get(e)).data},getBranches:async t=>(await r().get(`/branch?projectId=${t}`)).data,createBranch:async(t,e,s)=>(await r().post("/branch",{projectId:t,name:e,description:s})).data,deleteBranch:async t=>(await r().delete(`/branch/${t}`)).data,updateBranch:async(t,e)=>(await r().put("/branch",{id:t,...e})).data,getRoles:async()=>(await r().get("/admin/roles")).data,getUsers:async t=>{let e=t?`?teamId=${t}`:"";return(await r().get(`/admin/users${e}`)).data},setUserRole:async(t,e,s)=>(await r().put("/admin/users/role",{email:t,role:e,teamId:s})).data,getIntegrationStatus:async t=>(await r().get(`/integrations/${t}`)).data,getIntegrationRepos:async t=>(await r().get(`/integrations/${t}/sync`)).data.repos,syncSecretsToGithub:async t=>(await r().post("/integrations/github/sync",t)).data,exportKubernetesSecret:async(t,e)=>{let s=new URLSearchParams(e).toString();return(await r().get(`/projects/${t}/kubernetes?${s}`)).data},getSecretHistory:async(t,e,s)=>(await r().get(`/projects/${t}/envs/${e}/secrets/${s}/history`)).data,rollbackSecret:async(t,e,s,n)=>(await r().post(`/projects/${t}/envs/${e}/secrets/${s}/history`,{version:n})).data,cloneEnvironment:async(t,e,s,n,o)=>(await r().post(`/projects/${t}/envs/clone`,{fromEnv:e,toEnv:s,overwrite:n,branch:o})).data,generateJitLink:async t=>(await r().post("/jit/generate",t)).data,claimJitLink:async t=>(await r().post("/jit/claim",{token:t})).data,getJitInfo:async t=>(await r().get(`/jit/${t}`)).data,getServiceAccounts:async t=>(await r().get(`/projects/${t}/service-accounts`)).data,createServiceAccount:async(t,e)=>(await r().post(`/projects/${t}/service-accounts`,e)).data,deleteServiceAccount:async(t,e)=>(await r().delete(`/projects/${t}/service-accounts/${e}`)).data,getServiceAccountKeys:async(t,e)=>(await r().get(`/projects/${t}/service-accounts/${e}/keys`)).data,createServiceAccountKey:async(t,e,s,n)=>(await r().post(`/projects/${t}/service-accounts/${e}/keys`,{label:s,expiresAt:n})).data,deleteServiceAccountKey:async(t,e,s)=>(await r().delete(`/projects/${t}/service-accounts/${e}/keys/${s}`)).data,post:async(t,e)=>(await r().post(t,e)).data};var h=v.default.join(process.cwd(),".xtra"),w=v.default.join(h,"audit.enc");function X(t){if(!t||typeof t!="object")return t;let e={...t},s=["password","token","secret","value","apiKey","secretValue"];for(let n of Object.keys(e))s.some(o=>n.toLowerCase().includes(o))&&(e[n]="[REDACTED]");return e}async function N(t){try{if(!p().token)return!1;let s={action:t.action,entity:"cli-project",entityId:t.projectId||"global",details:X(t.details),timestamp:t.timestamp,projectId:t.projectId};return await _.post("/audit/cli-logs",{logs:[s]}),!0}catch(e){return process.env.DEBUG&&console.error("Failed to send audit log to backend:",e),!1}}function M(t,e,s,n){let o={id:(0,D.v4)(),timestamp:new Date().toISOString(),action:t,projectId:e,environment:s,details:n,synced:!1},a=y();a.push(o),f(a),N(o).then(S=>{if(S){o.synced=!0;let l=y(),j=l.findIndex(E=>E.id===o.id);j!==-1&&(l[j].synced=!0,f(l))}}).catch(()=>{})}function y(){if(!g.default.existsSync(w))return[];try{let t=g.default.readFileSync(w,"utf-8"),e=JSON.parse(t),s=U(e);return JSON.parse(s)}catch{return[]}}function f(t){g.default.existsSync(h)||g.default.mkdirSync(h,{recursive:!0});let e=JSON.stringify(t),s=C(e);g.default.writeFileSync(w,JSON.stringify(s),"utf-8")}async function Q(){let t=y(),e=t.filter(n=>!n.synced);if(e.length===0)return 0;let s=0;for(let n of e)await N(n)&&(n.synced=!0,s++);return s>0&&f(t),s}0&&(module.exports={loadAuditLogs,logAudit,saveAuditLogs,syncAuditLogs});
|
package/dist/lib/config.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var x=Object.create;var c=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var
|
|
1
|
+
var x=Object.create;var c=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var d=Object.getPrototypeOf,u=Object.prototype.hasOwnProperty;var m=(e,t)=>{for(var n in t)c(e,n,{get:t[n],enumerable:!0})},l=(e,t,n,g)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of y(t))!u.call(e,o)&&o!==n&&c(e,o,{get:()=>t[o],enumerable:!(g=S(t,o))||g.enumerable});return e};var i=(e,t,n)=>(n=e!=null?x(d(e)):{},l(t||!e||!e.__esModule?c(n,"default",{value:e,enumerable:!0}):n,e)),k=e=>l(c({},"__esModule",{value:!0}),e);var R={};m(R,{clearConfig:()=>b,deleteConfig:()=>v,getAuthToken:()=>_,getBreakGlassSession:()=>w,getConfig:()=>C,getConfigValue:()=>U,getProjectConfig:()=>A,getRcConfig:()=>P,setBreakGlassSession:()=>I,setConfig:()=>j});module.exports=k(R);var h=i(require("conf")),s=i(require("fs")),p=i(require("path")),a="https://www.xtrasecurity.in/api",r=new h.default({projectName:"xtra-cli",defaults:{apiUrl:a}}),f=r.get("apiUrl");f&&!process.env.XTRA_API_URL&&f.includes("xtra-security.vercel.app")&&r.set("apiUrl",a);var C=()=>({...r.store,apiUrl:process.env.XTRA_API_URL||r.get("apiUrl")||a}),U=e=>r.get(e),j=(e,t)=>{if(r.set(e,t),e==="token"&&process.platform!=="win32"&&s.default.existsSync(r.path))try{s.default.chmodSync(r.path,384)}catch{}},b=()=>r.clear(),v=e=>r.delete(e),_=()=>r.get("token"),w=()=>r.get("breakGlassSessionId"),I=e=>{e?r.set("breakGlassSessionId",e):r.delete("breakGlassSessionId")},A=async()=>{try{let e=p.default.join(process.cwd(),"xtra.json");if(s.default.existsSync(e)){let t=s.default.readFileSync(e,"utf-8");return JSON.parse(t)}return null}catch{return null}},P=()=>{let e={};try{let t=p.default.join(process.cwd(),".xtrarc");s.default.existsSync(t)&&(e=JSON.parse(s.default.readFileSync(t,"utf-8")))}catch{}return{project:e.project||r.get("project")||"",env:e.env||r.get("env")||"development",branch:e.branch||r.get("branch")||"main"}};0&&(module.exports={clearConfig,deleteConfig,getAuthToken,getBreakGlassSession,getConfig,getConfigValue,getProjectConfig,getRcConfig,setBreakGlassSession,setConfig});
|
package/dist/lib/config.test.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var h=Object.create;var f=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var j=Object.getPrototypeOf,S=Object.prototype.hasOwnProperty;var C=(e,t,o,g)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of y(t))!S.call(e,s)&&s!==o&&f(e,s,{get:()=>t[s],enumerable:!(g=x(t,s))||g.enumerable});return e};var r=(e,t,o)=>(o=e!=null?h(j(e)):{},C(t||!e||!e.__esModule?f(o,"default",{value:e,enumerable:!0}):o,e));var d=r(require("conf")),a=r(require("fs")),m=r(require("path")),p="https://www.xtrasecurity.in/api",c=new d.default({projectName:"xtra-cli",defaults:{apiUrl:p}}),u=c.get("apiUrl");u&&!process.env.XTRA_API_URL&&u.includes("xtra-security.vercel.app")&&c.set("apiUrl",p);var l=()=>({...c.store,apiUrl:process.env.XTRA_API_URL||c.get("apiUrl")||p});var i=async()=>{try{let e=m.default.join(process.cwd(),"xtra.json");if(a.default.existsSync(e)){let t=a.default.readFileSync(e,"utf-8");return JSON.parse(t)}return null}catch{return null}};var n=r(require("fs"));jest.mock("conf");describe("Config Management",()=>{beforeEach(()=>{jest.clearAllMocks()}),describe("getConfig",()=>{it("should return config with API URL from env if set",()=>{process.env.XTRA_API_URL="https://api.production.com";let e=l();expect(e.apiUrl).toBe("https://api.production.com"),delete process.env.XTRA_API_URL}),it("should fallback to default API URL",()=>{delete process.env.XTRA_API_URL;let e=l();expect(e.apiUrl).toBeDefined()})}),describe("getProjectConfig",()=>{it("should return null if xtra.json does not exist",async()=>{jest.spyOn(n.default,"existsSync").mockReturnValue(!1);let e=await i();expect(e).toBeNull()}),it("should parse and return xtra.json if it exists",async()=>{let e={projectId:"test-project",env:"production"};jest.spyOn(n.default,"existsSync").mockReturnValue(!0),jest.spyOn(n.default,"readFileSync").mockReturnValue(JSON.stringify(e));let t=await i();expect(t).toEqual(e)}),it("should return null if JSON parsing fails",async()=>{jest.spyOn(n.default,"existsSync").mockReturnValue(!0),jest.spyOn(n.default,"readFileSync").mockReturnValue("invalid json{");let e=await i();expect(e).toBeNull()})})});
|