@tigrisdata/cli 2.2.0 → 2.3.0

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/lib/rm.js CHANGED
@@ -1 +1 @@
1
- import*as Q from"readline";import{list as M}from"@tigrisdata/storage";function z(n){let e=n.split("/");return{bucket:e[0],path:e.slice(1).join("/")}}async function R(n,e,o){let{data:t}=await M({prefix:`${e}/`,limit:1,config:{...o,bucket:n}});return!!(t?.items&&t.items.length>0)}async function $(n,e,o){let t=[],i;do{let{data:r,error:s}=await M({prefix:e,paginationToken:i,config:{...o,bucket:n}});if(s)return{items:t,error:s};r?.items&&t.push(...r.items),i=r?.hasMore?r.paginationToken:void 0}while(i);return{items:t}}function v(n,e,o){for(let t of e)if(n[t]!==void 0)return n[t];return o}import{S3Client as Ae}from"@aws-sdk/client-s3";import{homedir as X}from"os";import{join as D}from"path";import{readFileSync as Y,writeFileSync as Z,existsSync as L,mkdirSync as ee}from"fs";import{chmod as te}from"fs/promises";var x=D(X(),".tigris"),p=D(x,"config.json");function ne(){L(x)||ee(x,{recursive:!0,mode:448})}function d(){if(L(p))try{let n=Y(p,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function m(n){ne(),Z(p,JSON.stringify(n,null,2),{mode:384});try{await te(p,384)}catch{}}async function A(n){let e=d();e.tokens=n,await m(e)}async function f(){return d().tokens||null}async function I(){let n=d();delete n.tokens,await m(n)}async function F(n){let e=d();e.organizations=n,await m(e)}function K(){return d().organizations||[]}function P(){return d().selectedOrganization||null}function j(){let n=d();return n.temporaryCredentials||n.credentials||null}async function G(n){let e=d();e.loginMethod=n,await m(e)}function U(){return d().loginMethod||null}import w from"axios";import oe from"open";function h(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var q=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function H(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_STORAGE_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var S=class{config;baseUrl;constructor(){this.config=h(),this.baseUrl=`https://${this.config.domain}`}async login(e){let t=(await w.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(t.user_code,t.verification_uri),await this.sleep(2e3);try{await oe(t.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(t.device_code,t.interval||5);await A(i),G("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,o){let i=0;for(;i<60;){i++;try{let s=(await w.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(r){if(w.isAxiosError(r)&&r.response){let s=r.response.data?.error;if(s==="authorization_pending"){await this.sleep(o*1e3);continue}if(s==="slow_down"){o+=5,await this.sleep(o*1e3);continue}throw new Error(r.response.data?.error_description||"Authentication failed")}throw r}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await f();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let o=300*1e3;return Date.now()+o>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let o=null;if(e?.refreshToken?o=e:o=await f(),!o)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await w.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:o.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,r={accessToken:i.access_token,refreshToken:i.refresh_token||o.refreshToken,idToken:i.id_token||o.idToken,expiresAt:Date.now()+(i.expires_in||3600)*1e3};return await A(r),r}catch{throw await I(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await f();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let o=e.idToken.split(".")[1],t=Buffer.from(o,"base64").toString("utf8");return JSON.parse(t)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let o=e.split(".")[1],t=Buffer.from(o,"base64").toString("utf8"),r=JSON.parse(t)[q];if(!r)return;let s=r?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;F(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),K()}async logout(){await I()}async isAuthenticated(){return await f()!==null}sleep(e){return new Promise(o=>setTimeout(o,e))}},_=null;function W(){return _||(_=new S),_}var B=H(),ie=h();async function re(){return U()}async function J(){if(await re()==="oauth"){let t=await W().getAccessToken();if(!P())throw new Error('No organization selected. Please run "tigris orgs select" first.');let r=B.endpoint,s=B.iamEndpoint,a=ie.domain;return{sessionToken:t,accessKeyId:"",secretAccessKey:"",endpoint:r,organizationId:P()??void 0,iamEndpoint:s,authDomain:a}}let e=j();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{remove as O,removeBucket as se,list as ae}from"@tigrisdata/storage";async function E(n){let e=Q.createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{e.question(`${n} (y/N): `,t=>{e.close(),o(t.toLowerCase()==="y")})})}async function ce(n){let e=v(n,["path"]),o=v(n,["force","f","F"]);e||(console.error("path argument is required"),process.exit(1));let{bucket:t,path:i}=z(e);t||(console.error("Invalid path"),process.exit(1));let r=await J();if(!i){if(!o&&!await E(`Are you sure you want to delete bucket '${t}'?`)){console.log("Aborted");return}let{error:l}=await se(t,{config:r});l&&(console.error(l.message),process.exit(1)),console.log(`Removed bucket '${t}'`);return}let s=e.includes("*"),a=i.endsWith("/");if(!s&&!a&&(a=await R(t,i,r)),s||a){let l=s?i.replace("*",""):i.endsWith("/")?i:`${i}/`,{items:y,error:b}=await $(t,l||void 0,r);b&&(console.error(b.message),process.exit(1));let T=y,g=l,V=T.some(c=>c.name===g),k=!1;if(!V){let{data:c}=await ae({prefix:g,limit:1,config:{...r,bucket:t}});k=c?.items?.some(u=>u.name===g)||!1}let N=T.length+(k?1:0);if(N===0){console.log("No objects to remove");return}if(!o&&!await E(`Are you sure you want to delete ${N} object(s)?`)){console.log("Aborted");return}let C=0;for(let c of T){let{error:u}=await O(c.name,{config:{...r,bucket:t}});u?console.error(`Failed to remove ${c.name}: ${u.message}`):(console.log(`Removed ${t}/${c.name}`),C++)}if(k){let{error:c}=await O(g,{config:{...r,bucket:t}});c?console.error(`Failed to remove ${g}: ${c.message}`):(console.log(`Removed ${t}/${g}`),C++)}console.log(`Removed ${C} object(s)`)}else{if(!o&&!await E(`Are you sure you want to delete '${t}/${i}'?`)){console.log("Aborted");return}let{error:l}=await O(i,{config:{...r,bucket:t}});l&&(console.error(l.message),process.exit(1)),console.log(`Removed ${t}/${i}`)}}export{ce as default};
1
+ import*as Q from"readline";import{list as M}from"@tigrisdata/storage";function z(n){let e=n.split("/");return{bucket:e[0],path:e.slice(1).join("/")}}async function R(n,e,o){let{data:t}=await M({prefix:`${e}/`,limit:1,config:{...o,bucket:n}});return!!(t?.items&&t.items.length>0)}async function $(n,e,o){let t=[],i;do{let{data:r,error:s}=await M({prefix:e,paginationToken:i,config:{...o,bucket:n}});if(s)return{items:t,error:s};r?.items&&t.push(...r.items),i=r?.hasMore?r.paginationToken:void 0}while(i);return{items:t}}function x(n,e,o){for(let t of e)if(n[t]!==void 0)return n[t];return o}import{S3Client as Ie}from"@aws-sdk/client-s3";import{homedir as X}from"os";import{join as D}from"path";import{readFileSync as Y,writeFileSync as Z,existsSync as L,mkdirSync as ee}from"fs";import{chmod as te}from"fs/promises";var v=D(X(),".tigris"),p=D(v,"config.json");function ne(){L(v)||ee(v,{recursive:!0,mode:448})}function d(){if(L(p))try{let n=Y(p,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function m(n){ne(),Z(p,JSON.stringify(n,null,2),{mode:384});try{await te(p,384)}catch{}}async function I(n){let e=d();e.tokens=n,await m(e)}async function f(){return d().tokens||null}async function A(){let n=d();delete n.tokens,await m(n)}async function F(n){let e=d();e.organizations=n,await m(e)}function K(){return d().organizations||[]}function P(){return d().selectedOrganization||null}function j(){let n=d();return n.temporaryCredentials||n.credentials||null}async function U(n){let e=d();e.loginMethod=n,await m(e)}function q(){return d().loginMethod||null}import w from"axios";import oe from"open";function h(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var G=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function B(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var S=class{config;baseUrl;constructor(){this.config=h(),this.baseUrl=`https://${this.config.domain}`}async login(e){let t=(await w.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(t.user_code,t.verification_uri),await this.sleep(2e3);try{await oe(t.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(t.device_code,t.interval||5);await I(i),U("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,o){let i=0;for(;i<60;){i++;try{let s=(await w.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(r){if(w.isAxiosError(r)&&r.response){let s=r.response.data?.error;if(s==="authorization_pending"){await this.sleep(o*1e3);continue}if(s==="slow_down"){o+=5,await this.sleep(o*1e3);continue}throw new Error(r.response.data?.error_description||"Authentication failed")}throw r}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await f();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let o=300*1e3;return Date.now()+o>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let o=null;if(e?.refreshToken?o=e:o=await f(),!o)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await w.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:o.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,r={accessToken:i.access_token,refreshToken:i.refresh_token||o.refreshToken,idToken:i.id_token||o.idToken,expiresAt:Date.now()+(i.expires_in||3600)*1e3};return await I(r),r}catch{throw await A(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await f();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let o=e.idToken.split(".")[1],t=Buffer.from(o,"base64").toString("utf8");return JSON.parse(t)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let o=e.split(".")[1],t=Buffer.from(o,"base64").toString("utf8"),r=JSON.parse(t)[G];if(!r)return;let s=r?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;F(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),K()}async logout(){await A()}async isAuthenticated(){return await f()!==null}sleep(e){return new Promise(o=>setTimeout(o,e))}},_=null;function H(){return _||(_=new S),_}var W=B(),ie=h();async function re(){return q()}async function J(){if(await re()==="oauth"){let t=await H().getAccessToken();if(!P())throw new Error('No organization selected. Please run "tigris orgs select" first.');let r=W.endpoint,s=W.iamEndpoint,a=ie.domain;return{sessionToken:t,accessKeyId:"",secretAccessKey:"",endpoint:r,organizationId:P()??void 0,iamEndpoint:s,authDomain:a}}let e=j();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{remove as O,removeBucket as se,list as ae}from"@tigrisdata/storage";async function b(n){let e=Q.createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{e.question(`${n} (y/N): `,t=>{e.close(),o(t.toLowerCase()==="y")})})}async function ce(n){let e=x(n,["path"]),o=x(n,["force","f","F"]);e||(console.error("path argument is required"),process.exit(1));let{bucket:t,path:i}=z(e);t||(console.error("Invalid path"),process.exit(1));let r=await J();if(!i){if(!o&&!await b(`Are you sure you want to delete bucket '${t}'?`)){console.log("Aborted");return}let{error:l}=await se(t,{config:r});l&&(console.error(l.message),process.exit(1)),console.log(`Removed bucket '${t}'`);return}let s=e.includes("*"),a=i.endsWith("/");if(!s&&!a&&(a=await R(t,i,r)),s||a){let l=s?i.replace("*",""):i.endsWith("/")?i:`${i}/`,{items:y,error:E}=await $(t,l||void 0,r);E&&(console.error(E.message),process.exit(1));let T=y,g=l,V=T.some(c=>c.name===g),k=!1;if(!V){let{data:c}=await ae({prefix:g,limit:1,config:{...r,bucket:t}});k=c?.items?.some(u=>u.name===g)||!1}let N=T.length+(k?1:0);if(N===0){console.log("No objects to remove");return}if(!o&&!await b(`Are you sure you want to delete ${N} object(s)?`)){console.log("Aborted");return}let C=0;for(let c of T){let{error:u}=await O(c.name,{config:{...r,bucket:t}});u?console.error(`Failed to remove ${c.name}: ${u.message}`):(console.log(`Removed ${t}/${c.name}`),C++)}if(k){let{error:c}=await O(g,{config:{...r,bucket:t}});c?console.error(`Failed to remove ${g}: ${c.message}`):(console.log(`Removed ${t}/${g}`),C++)}console.log(`Removed ${C} object(s)`)}else{if(!o&&!await b(`Are you sure you want to delete '${t}/${i}'?`)){console.log("Aborted");return}let{error:l}=await O(i,{config:{...r,bucket:t}});l&&(console.error(l.message),process.exit(1)),console.log(`Removed ${t}/${i}`)}process.exit(0)}export{ce as default};
@@ -1,7 +1,7 @@
1
- function C(t,e,n){for(let o of e)if(t[o]!==void 0)return t[o];return n}function te(t){return JSON.stringify(t,null,2)}function ne(t,e=" "){return Object.entries(t).map(([n,o])=>`${e}<${n}>${o}</${n}>`).join(`
2
- `)}function oe(t,e,n){let o=[`<${e}>`];return t.forEach(i=>{o.push(` <${n}>`),o.push(ne(i," ")),o.push(` </${n}>`)}),o.push(`</${e}>`),o.join(`
3
- `)}function N(t){if(t==null)return"";if(t instanceof Date)return E(t);if(typeof t=="string"){let e=new Date(t);if(!isNaN(e.getTime())&&t.includes("T"))return E(e)}return String(t)}function E(t){return new Intl.DateTimeFormat(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(t)}function ie(t,e){return e.map(n=>{if(n.width)return n.width;let o=n.header.length,i=t.reduce((r,s)=>{let a=N(s[n.key]);return Math.max(r,a.length)},0);return Math.max(o,i)})}function re(t,e){let n=[],o=ie(t,e),i="\u250C"+o.map(c=>"\u2500".repeat(c+2)).join("\u252C")+"\u2510",r="\u251C"+o.map(c=>"\u2500".repeat(c+2)).join("\u253C")+"\u2524",s="\u2514"+o.map(c=>"\u2500".repeat(c+2)).join("\u2534")+"\u2518";n.push(`
4
- `+i);let a="\u2502 "+e.map((c,T)=>c.header.padEnd(o[T])).join(" \u2502 ")+" \u2502";return n.push(a),n.push(r),t.forEach(c=>{let T=e.map((O,P)=>{let b=N(c[O.key]);return O.align==="right"?b.padStart(o[P]):b.padEnd(o[P])});n.push("\u2502 "+T.join(" \u2502 ")+" \u2502")}),n.push(s+`
5
- `),n.join(`
6
- `)}function D(t,e,n,o,i){switch(e){case"json":return te(t);case"xml":return oe(t,n,o);default:return re(t,i)}}import{S3Client as Ke}from"@aws-sdk/client-s3";import{homedir as se}from"os";import{join as z}from"path";import{readFileSync as ae,writeFileSync as ce,existsSync as R,mkdirSync as de}from"fs";import{chmod as ge}from"fs/promises";var w=z(se(),".tigris"),l=z(w,"config.json");function ue(){R(w)||de(w,{recursive:!0,mode:448})}function d(){if(R(l))try{let t=ae(l,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function p(t){ue(),ce(l,JSON.stringify(t,null,2),{mode:384});try{await ge(l,384)}catch{}}async function k(t){let e=d();e.tokens=t,await p(e)}async function g(){return d().tokens||null}async function x(){let t=d();delete t.tokens,await p(t)}async function j(t){let e=d();e.organizations=t,await p(e)}function $(){return d().organizations||[]}function S(){return d().selectedOrganization||null}function K(){let t=d();return t.temporaryCredentials||t.credentials||null}async function L(t){let e=d();e.loginMethod=t,await p(e)}function F(){return d().loginMethod||null}import m from"axios";import le from"open";function f(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var U=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function V(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_STORAGE_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var v=class{config;baseUrl;constructor(){this.config=f(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await m.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(o.user_code,o.verification_uri),await this.sleep(2e3);try{await le(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await k(i),L("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,n){let i=0;for(;i<60;){i++;try{let s=(await m.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(r){if(m.isAxiosError(r)&&r.response){let s=r.response.data?.error;if(s==="authorization_pending"){await this.sleep(n*1e3);continue}if(s==="slow_down"){n+=5,await this.sleep(n*1e3);continue}throw new Error(r.response.data?.error_description||"Authentication failed")}throw r}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await g();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let n=300*1e3;return Date.now()+n>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let n=null;if(e?.refreshToken?n=e:n=await g(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await m.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:n.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,r={accessToken:i.access_token,refreshToken:i.refresh_token||n.refreshToken,idToken:i.id_token||n.idToken,expiresAt:Date.now()+(i.expires_in||3600)*1e3};return await k(r),r}catch{throw await x(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await g();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let n=e.idToken.split(".")[1],o=Buffer.from(n,"base64").toString("utf8");return JSON.parse(o)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let n=e.split(".")[1],o=Buffer.from(n,"base64").toString("utf8"),r=JSON.parse(o)[U];if(!r)return;let s=r?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;j(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),$()}async logout(){await x()}async isAuthenticated(){return await g()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},A=null;function G(){return A||(A=new v),A}var B=V(),pe=f();async function fe(){return F()}async function q(){if(await fe()==="oauth"){let o=await G().getAccessToken();if(!S())throw new Error('No organization selected. Please run "tigris orgs select" first.');let r=B.endpoint,s=B.iamEndpoint,a=pe.domain;return{sessionToken:o,accessKeyId:"",secretAccessKey:"",endpoint:r,organizationId:S()??void 0,iamEndpoint:s,authDomain:a}}let e=K();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{listBucketSnapshots as Se}from"@tigrisdata/storage";import{readFileSync as me,existsSync as he}from"fs";import{join as H,dirname as ye}from"path";import{fileURLToPath as Te}from"url";import*as J from"yaml";var Ce=Te(import.meta.url),we=ye(Ce),_=null;function ke(){let t=we;for(let e=0;e<5;e++){let n=H(t,"specs.yaml");if(he(n))return n;t=H(t,"..")}throw new Error("Could not find specs.yaml")}function xe(){if(!_){let t=ke(),e=me(t,"utf8");_=J.parse(e)}return _}function W(t,e){let o=xe().commands.find(i=>i.name===t);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var Y={success:"\u2714",failure:"\u2716",hint:"\u2192"};function I(){return process.stdout.isTTY===!0}function h(t){let e=W(t.command,t.operation);if(e)return e.messages}function y(t,e){let n=t;return n=n.replace(/\\n/g,`
7
- `),e&&(n=n.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let r=e[i];return r!==void 0?String(r):`{{${i}}}`})),n}function X(t,e){if(!I())return;let n=h(t);n?.onStart&&console.log(y(n.onStart,e))}function Q(t,e){if(!I())return;let n=h(t);n?.onSuccess&&console.log(`${Y.success} ${y(n.onSuccess,e)}`)}function M(t,e,n){let o=h(t);o?.onFailure&&console.error(`${Y.failure} ${y(o.onFailure,n)}`),e&&console.error(` ${e}`)}function Z(t,e){if(!I())return;let n=h(t);n?.onEmpty&&console.log(y(n.onEmpty,e))}function ee(t,e){return{command:t,operation:e}}var u=ee("snapshots","list");async function Ae(t){X(u);let e=C(t,["name"]),n=C(t,["format","f","F"],"table");e||(M(u,"Bucket name is required"),process.exit(1));let o=await q(),{data:i,error:r}=await Se(e,{config:o});if(r&&(M(u,r.message),process.exit(1)),!i||i.length===0){Z(u);return}let s=i.map(c=>({name:c.name||"",version:c.version||"",created:c.creationDate})),a=D(s,n,"snapshots","snapshot",[{key:"name",header:"Name"},{key:"version",header:"Version"},{key:"created",header:"Created"}]);console.log(a),Q(u,{count:s.length})}export{Ae as default};
1
+ function T(n,e,t){for(let o of e)if(n[o]!==void 0)return n[o];return t}function ne(n){return JSON.stringify(n,null,2)}function te(n,e=" "){return Object.entries(n).map(([t,o])=>`${e}<${t}>${o}</${t}>`).join(`
2
+ `)}function oe(n,e,t){let o=[`<${e}>`];return n.forEach(i=>{o.push(` <${t}>`),o.push(te(i," ")),o.push(` </${t}>`)}),o.push(`</${e}>`),o.join(`
3
+ `)}function N(n){if(n==null)return"";if(n instanceof Date)return E(n);if(typeof n=="string"){let e=new Date(n);if(!isNaN(e.getTime())&&n.includes("T"))return E(e)}return String(n)}function E(n){return new Intl.DateTimeFormat(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(n)}function ie(n,e){return e.map(t=>{if(t.width)return t.width;let o=t.header.length,i=n.reduce((r,s)=>{let a=N(s[t.key]);return Math.max(r,a.length)},0);return Math.max(o,i)})}function re(n,e){let t=[],o=ie(n,e),i="\u250C"+o.map(c=>"\u2500".repeat(c+2)).join("\u252C")+"\u2510",r="\u251C"+o.map(c=>"\u2500".repeat(c+2)).join("\u253C")+"\u2524",s="\u2514"+o.map(c=>"\u2500".repeat(c+2)).join("\u2534")+"\u2518";t.push(`
4
+ `+i);let a="\u2502 "+e.map((c,C)=>c.header.padEnd(o[C])).join(" \u2502 ")+" \u2502";return t.push(a),t.push(r),n.forEach(c=>{let C=e.map((O,P)=>{let b=N(c[O.key]);return O.align==="right"?b.padStart(o[P]):b.padEnd(o[P])});t.push("\u2502 "+C.join(" \u2502 ")+" \u2502")}),t.push(s+`
5
+ `),t.join(`
6
+ `)}function D(n,e,t,o,i){switch(e){case"json":return ne(n);case"xml":return oe(n,t,o);default:return re(n,i)}}import{S3Client as Ke}from"@aws-sdk/client-s3";import{homedir as se}from"os";import{join as z}from"path";import{readFileSync as ae,writeFileSync as ce,existsSync as R,mkdirSync as de}from"fs";import{chmod as ue}from"fs/promises";var w=z(se(),".tigris"),l=z(w,"config.json");function ge(){R(w)||de(w,{recursive:!0,mode:448})}function d(){if(R(l))try{let n=ae(l,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function f(n){ge(),ce(l,JSON.stringify(n,null,2),{mode:384});try{await ue(l,384)}catch{}}async function k(n){let e=d();e.tokens=n,await f(e)}async function u(){return d().tokens||null}async function x(){let n=d();delete n.tokens,await f(n)}async function j(n){let e=d();e.organizations=n,await f(e)}function $(){return d().organizations||[]}function S(){return d().selectedOrganization||null}function K(){let n=d();return n.temporaryCredentials||n.credentials||null}async function L(n){let e=d();e.loginMethod=n,await f(e)}function F(){return d().loginMethod||null}import m from"axios";import le from"open";function p(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var U=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function V(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var _=class{config;baseUrl;constructor(){this.config=p(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await m.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(o.user_code,o.verification_uri),await this.sleep(2e3);try{await le(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await k(i),L("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,t){let i=0;for(;i<60;){i++;try{let s=(await m.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(r){if(m.isAxiosError(r)&&r.response){let s=r.response.data?.error;if(s==="authorization_pending"){await this.sleep(t*1e3);continue}if(s==="slow_down"){t+=5,await this.sleep(t*1e3);continue}throw new Error(r.response.data?.error_description||"Authentication failed")}throw r}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await u();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let t=300*1e3;return Date.now()+t>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let t=null;if(e?.refreshToken?t=e:t=await u(),!t)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await m.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:t.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,r={accessToken:i.access_token,refreshToken:i.refresh_token||t.refreshToken,idToken:i.id_token||t.idToken,expiresAt:Date.now()+(i.expires_in||3600)*1e3};return await k(r),r}catch{throw await x(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await u();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let t=e.idToken.split(".")[1],o=Buffer.from(t,"base64").toString("utf8");return JSON.parse(o)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let t=e.split(".")[1],o=Buffer.from(t,"base64").toString("utf8"),r=JSON.parse(o)[U];if(!r)return;let s=r?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;j(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),$()}async logout(){await x()}async isAuthenticated(){return await u()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},A=null;function B(){return A||(A=new _),A}var G=V(),fe=p();async function pe(){return F()}async function q(){if(await pe()==="oauth"){let o=await B().getAccessToken();if(!S())throw new Error('No organization selected. Please run "tigris orgs select" first.');let r=G.endpoint,s=G.iamEndpoint,a=fe.domain;return{sessionToken:o,accessKeyId:"",secretAccessKey:"",endpoint:r,organizationId:S()??void 0,iamEndpoint:s,authDomain:a}}let e=K();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{listBucketSnapshots as Se}from"@tigrisdata/storage";import{readFileSync as me,existsSync as he}from"fs";import{join as H,dirname as ye}from"path";import{fileURLToPath as Ce}from"url";import*as J from"yaml";var Te=Ce(import.meta.url),we=ye(Te),v=null;function ke(){let n=we;for(let e=0;e<5;e++){let t=H(n,"specs.yaml");if(he(t))return t;n=H(n,"..")}throw new Error("Could not find specs.yaml")}function xe(){if(!v){let n=ke(),e=me(n,"utf8");v=J.parse(e)}return v}function W(n,e){let o=xe().commands.find(i=>i.name===n);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var Y={success:"\u2714",failure:"\u2716",hint:"\u2192"};function I(){return process.stdout.isTTY===!0}function h(n){let e=W(n.command,n.operation);if(e)return e.messages}function y(n,e){let t=n;return t=t.replace(/\\n/g,`
7
+ `),e&&(t=t.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let r=e[i];return r!==void 0?String(r):`{{${i}}}`})),t}function X(n,e){if(!I())return;let t=h(n);t?.onStart&&console.log(y(t.onStart,e))}function Q(n,e){if(!I())return;let t=h(n);t?.onSuccess&&console.log(`${Y.success} ${y(t.onSuccess,e)}`)}function M(n,e,t){let o=h(n);o?.onFailure&&console.error(`${Y.failure} ${y(o.onFailure,t)}`),e&&console.error(` ${e}`)}function Z(n,e){if(!I())return;let t=h(n);t?.onEmpty&&console.log(y(t.onEmpty,e))}function ee(n,e){return{command:n,operation:e}}var g=ee("snapshots","list");async function Ae(n){X(g);let e=T(n,["name"]),t=T(n,["format","f","F"],"table");e||(M(g,"Bucket name is required"),process.exit(1));let o=await q(),{data:i,error:r}=await Se(e,{config:o});if(r&&(M(g,r.message),process.exit(1)),!i||i.length===0){Z(g);return}let s=i.map(c=>({name:c.name||"",version:c.version||"",created:c.creationDate})),a=D(s,t,"snapshots","snapshot",[{key:"name",header:"Name"},{key:"version",header:"Version"},{key:"created",header:"Created"}]);console.log(a),Q(g,{count:s.length})}export{Ae as default};
@@ -1,2 +1,2 @@
1
- function m(t,e,n){for(let o of e)if(t[o]!==void 0)return t[o];return n}import{S3Client as Ae}from"@aws-sdk/client-s3";import{homedir as H}from"os";import{join as _}from"path";import{readFileSync as B,writeFileSync as J,existsSync as I,mkdirSync as Y}from"fs";import{chmod as W}from"fs/promises";var h=_(H(),".tigris"),d=_(h,"config.json");function Q(){I(h)||Y(h,{recursive:!0,mode:448})}function c(){if(I(d))try{let t=B(d,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function l(t){Q(),J(d,JSON.stringify(t,null,2),{mode:384});try{await W(d,384)}catch{}}async function y(t){let e=c();e.tokens=t,await l(e)}async function g(){return c().tokens||null}async function C(){let t=c();delete t.tokens,await l(t)}async function M(t){let e=c();e.organizations=t,await l(e)}function P(){return c().organizations||[]}function T(){return c().selectedOrganization||null}function O(){let t=c();return t.temporaryCredentials||t.credentials||null}async function E(t){let e=c();e.loginMethod=t,await l(e)}function N(){return c().loginMethod||null}import u from"axios";import X from"open";function p(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var b=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function z(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_STORAGE_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var k=class{config;baseUrl;constructor(){this.config=p(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await u.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(o.user_code,o.verification_uri),await this.sleep(2e3);try{await X(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await y(i),E("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,n){let i=0;for(;i<60;){i++;try{let s=(await u.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(r){if(u.isAxiosError(r)&&r.response){let s=r.response.data?.error;if(s==="authorization_pending"){await this.sleep(n*1e3);continue}if(s==="slow_down"){n+=5,await this.sleep(n*1e3);continue}throw new Error(r.response.data?.error_description||"Authentication failed")}throw r}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await g();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let n=300*1e3;return Date.now()+n>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let n=null;if(e?.refreshToken?n=e:n=await g(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await u.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:n.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,r={accessToken:i.access_token,refreshToken:i.refresh_token||n.refreshToken,idToken:i.id_token||n.idToken,expiresAt:Date.now()+(i.expires_in||3600)*1e3};return await y(r),r}catch{throw await C(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await g();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let n=e.idToken.split(".")[1],o=Buffer.from(n,"base64").toString("utf8");return JSON.parse(o)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let n=e.split(".")[1],o=Buffer.from(n,"base64").toString("utf8"),r=JSON.parse(o)[b];if(!r)return;let s=r?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;M(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),P()}async logout(){await C()}async isAuthenticated(){return await g()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},w=null;function D(){return w||(w=new k),w}var R=z(),Z=p();async function ee(){return N()}async function K(){if(await ee()==="oauth"){let o=await D().getAccessToken();if(!T())throw new Error('No organization selected. Please run "tigris orgs select" first.');let r=R.endpoint,s=R.iamEndpoint,a=Z.domain;return{sessionToken:o,accessKeyId:"",secretAccessKey:"",endpoint:r,organizationId:T()??void 0,iamEndpoint:s,authDomain:a}}let e=O();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{createBucketSnapshot as ge}from"@tigrisdata/storage";import{readFileSync as te,existsSync as ne}from"fs";import{join as L,dirname as oe}from"path";import{fileURLToPath as ie}from"url";import*as $ from"yaml";var re=ie(import.meta.url),se=oe(re),S=null;function ae(){let t=se;for(let e=0;e<5;e++){let n=L(t,"specs.yaml");if(ne(n))return n;t=L(t,"..")}throw new Error("Could not find specs.yaml")}function ce(){if(!S){let t=ae(),e=te(t,"utf8");S=$.parse(e)}return S}function F(t,e){let o=ce().commands.find(i=>i.name===t);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var j={success:"\u2714",failure:"\u2716",hint:"\u2192"};function U(){return process.stdout.isTTY===!0}function x(t){let e=F(t.command,t.operation);if(e)return e.messages}function A(t,e){let n=t;return n=n.replace(/\\n/g,`
2
- `),e&&(n=n.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let r=e[i];return r!==void 0?String(r):`{{${i}}}`})),n}function V(t,e){if(!U())return;let n=x(t);n?.onStart&&console.log(A(n.onStart,e))}function G(t,e){if(!U())return;let n=x(t);n?.onSuccess&&console.log(`${j.success} ${A(n.onSuccess,e)}`)}function v(t,e,n){let o=x(t);o?.onFailure&&console.error(`${j.failure} ${A(o.onFailure,n)}`),e&&console.error(` ${e}`)}function q(t,e){return{command:t,operation:e}}var f=q("snapshots","take");async function de(t){V(f);let e=m(t,["name"]),n=m(t,["snapshot-name","snapshotName"]);e||(v(f,"Bucket name is required"),process.exit(1));let o=await K(),{data:i,error:r}=await ge(e,{name:n,config:o});r&&(v(f,r.message),process.exit(1)),G(f,{name:e,snapshotName:n||i?.snapshotVersion,version:i?.snapshotVersion})}export{de as default};
1
+ function m(t,e,n){for(let o of e)if(t[o]!==void 0)return t[o];return n}import{S3Client as Ae}from"@aws-sdk/client-s3";import{homedir as B}from"os";import{join as _}from"path";import{readFileSync as H,writeFileSync as J,existsSync as I,mkdirSync as Y}from"fs";import{chmod as W}from"fs/promises";var h=_(B(),".tigris"),g=_(h,"config.json");function Q(){I(h)||Y(h,{recursive:!0,mode:448})}function c(){if(I(g))try{let t=H(g,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function l(t){Q(),J(g,JSON.stringify(t,null,2),{mode:384});try{await W(g,384)}catch{}}async function y(t){let e=c();e.tokens=t,await l(e)}async function d(){return c().tokens||null}async function C(){let t=c();delete t.tokens,await l(t)}async function M(t){let e=c();e.organizations=t,await l(e)}function P(){return c().organizations||[]}function T(){return c().selectedOrganization||null}function O(){let t=c();return t.temporaryCredentials||t.credentials||null}async function E(t){let e=c();e.loginMethod=t,await l(e)}function b(){return c().loginMethod||null}import u from"axios";import X from"open";function p(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var N=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function z(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var k=class{config;baseUrl;constructor(){this.config=p(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await u.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(o.user_code,o.verification_uri),await this.sleep(2e3);try{await X(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await y(i),E("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,n){let i=0;for(;i<60;){i++;try{let s=(await u.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(r){if(u.isAxiosError(r)&&r.response){let s=r.response.data?.error;if(s==="authorization_pending"){await this.sleep(n*1e3);continue}if(s==="slow_down"){n+=5,await this.sleep(n*1e3);continue}throw new Error(r.response.data?.error_description||"Authentication failed")}throw r}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await d();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let n=300*1e3;return Date.now()+n>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let n=null;if(e?.refreshToken?n=e:n=await d(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await u.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:n.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,r={accessToken:i.access_token,refreshToken:i.refresh_token||n.refreshToken,idToken:i.id_token||n.idToken,expiresAt:Date.now()+(i.expires_in||3600)*1e3};return await y(r),r}catch{throw await C(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await d();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let n=e.idToken.split(".")[1],o=Buffer.from(n,"base64").toString("utf8");return JSON.parse(o)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let n=e.split(".")[1],o=Buffer.from(n,"base64").toString("utf8"),r=JSON.parse(o)[N];if(!r)return;let s=r?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;M(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),P()}async logout(){await C()}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},w=null;function D(){return w||(w=new k),w}var R=z(),Z=p();async function ee(){return b()}async function K(){if(await ee()==="oauth"){let o=await D().getAccessToken();if(!T())throw new Error('No organization selected. Please run "tigris orgs select" first.');let r=R.endpoint,s=R.iamEndpoint,a=Z.domain;return{sessionToken:o,accessKeyId:"",secretAccessKey:"",endpoint:r,organizationId:T()??void 0,iamEndpoint:s,authDomain:a}}let e=O();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{createBucketSnapshot as de}from"@tigrisdata/storage";import{readFileSync as te,existsSync as ne}from"fs";import{join as L,dirname as oe}from"path";import{fileURLToPath as ie}from"url";import*as $ from"yaml";var re=ie(import.meta.url),se=oe(re),S=null;function ae(){let t=se;for(let e=0;e<5;e++){let n=L(t,"specs.yaml");if(ne(n))return n;t=L(t,"..")}throw new Error("Could not find specs.yaml")}function ce(){if(!S){let t=ae(),e=te(t,"utf8");S=$.parse(e)}return S}function F(t,e){let o=ce().commands.find(i=>i.name===t);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var j={success:"\u2714",failure:"\u2716",hint:"\u2192"};function U(){return process.stdout.isTTY===!0}function x(t){let e=F(t.command,t.operation);if(e)return e.messages}function A(t,e){let n=t;return n=n.replace(/\\n/g,`
2
+ `),e&&(n=n.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let r=e[i];return r!==void 0?String(r):`{{${i}}}`})),n}function V(t,e){if(!U())return;let n=x(t);n?.onStart&&console.log(A(n.onStart,e))}function G(t,e){if(!U())return;let n=x(t);n?.onSuccess&&console.log(`${j.success} ${A(n.onSuccess,e)}`)}function v(t,e,n){let o=x(t);o?.onFailure&&console.error(`${j.failure} ${A(o.onFailure,n)}`),e&&console.error(` ${e}`)}function q(t,e){return{command:t,operation:e}}var f=q("snapshots","take");async function ge(t){V(f);let e=m(t,["name"]),n=m(t,["snapshot-name","snapshotName"]);e||(v(f,"Bucket name is required"),process.exit(1));let o=await K(),{data:i,error:r}=await de(e,{name:n,config:o});r&&(v(f,r.message),process.exit(1)),G(f,{name:e,snapshotName:n||i?.snapshotVersion,version:i?.snapshotVersion})}export{ge as default};
package/dist/lib/touch.js CHANGED
@@ -1 +1 @@
1
- import{list as J}from"@tigrisdata/storage";function k(t){let e=t.split("/");return{bucket:e[0],path:e.slice(1).join("/")}}function C(t,e,n){for(let i of e)if(t[i]!==void 0)return t[i];return n}import{S3Client as ae}from"@aws-sdk/client-s3";import{homedir as b}from"os";import{join as x}from"path";import{readFileSync as D,writeFileSync as R,existsSync as I,mkdirSync as K}from"fs";import{chmod as L}from"fs/promises";var p=x(b(),".tigris"),g=x(p,"config.json");function j(){I(p)||K(p,{recursive:!0,mode:448})}function c(){if(I(g))try{let t=D(g,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function l(t){j(),R(g,JSON.stringify(t,null,2),{mode:384});try{await L(g,384)}catch{}}async function m(t){let e=c();e.tokens=t,await l(e)}async function d(){return c().tokens||null}async function h(){let t=c();delete t.tokens,await l(t)}async function A(t){let e=c();e.organizations=t,await l(e)}function P(){return c().organizations||[]}function T(){return c().selectedOrganization||null}function _(){let t=c();return t.temporaryCredentials||t.credentials||null}async function S(t){let e=c();e.loginMethod=t,await l(e)}function v(){return c().loginMethod||null}import u from"axios";import F from"open";function f(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var O=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function E(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_STORAGE_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var w=class{config;baseUrl;constructor(){this.config=f(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(await u.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(i.user_code,i.verification_uri),await this.sleep(2e3);try{await F(i.verification_uri_complete)}catch{}e?.onWaiting?.();let r=await this.pollForToken(i.device_code,i.interval||5);await m(r),S("oauth"),await this.extractAndStoreOrganizations(r.idToken)}async pollForToken(e,n){let r=0;for(;r<60;){r++;try{let s=(await u.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(o){if(u.isAxiosError(o)&&o.response){let s=o.response.data?.error;if(s==="authorization_pending"){await this.sleep(n*1e3);continue}if(s==="slow_down"){n+=5,await this.sleep(n*1e3);continue}throw new Error(o.response.data?.error_description||"Authentication failed")}throw o}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await d();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let n=300*1e3;return Date.now()+n>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let n=null;if(e?.refreshToken?n=e:n=await d(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let r=(await u.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:n.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,o={accessToken:r.access_token,refreshToken:r.refresh_token||n.refreshToken,idToken:r.id_token||n.idToken,expiresAt:Date.now()+(r.expires_in||3600)*1e3};return await m(o),o}catch{throw await h(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await d();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let n=e.idToken.split(".")[1],i=Buffer.from(n,"base64").toString("utf8");return JSON.parse(i)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let n=e.split(".")[1],i=Buffer.from(n,"base64").toString("utf8"),o=JSON.parse(i)[O];if(!o)return;let s=o?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;A(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),P()}async logout(){await h()}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},y=null;function N(){return y||(y=new w),y}var z=E(),G=f();async function U(){return v()}async function M(){if(await U()==="oauth"){let i=await N().getAccessToken();if(!T())throw new Error('No organization selected. Please run "tigris orgs select" first.');let o=z.endpoint,s=z.iamEndpoint,a=G.domain;return{sessionToken:i,accessKeyId:"",secretAccessKey:"",endpoint:o,organizationId:T()??void 0,iamEndpoint:s,authDomain:a}}let e=_();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{put as q}from"@tigrisdata/storage";async function $(t){let e=C(t,["path"]);e||(console.error("path argument is required"),process.exit(1));let{bucket:n,path:i}=k(e);n||(console.error("Invalid path"),process.exit(1)),i||(console.error("Object key is required (use mk to create buckets)"),process.exit(1));let r=await M(),{error:o}=await q(i,"",{config:{...r,bucket:n}});o&&(console.error(o.message),process.exit(1)),console.log(`Created '${n}/${i}'`)}export{$ as default};
1
+ import{list as B}from"@tigrisdata/storage";function k(t){let e=t.split("/");return{bucket:e[0],path:e.slice(1).join("/")}}function C(t,e,n){for(let i of e)if(t[i]!==void 0)return t[i];return n}import{S3Client as ae}from"@aws-sdk/client-s3";import{homedir as b}from"os";import{join as x}from"path";import{readFileSync as D,writeFileSync as R,existsSync as I,mkdirSync as K}from"fs";import{chmod as L}from"fs/promises";var p=x(b(),".tigris"),g=x(p,"config.json");function j(){I(p)||K(p,{recursive:!0,mode:448})}function c(){if(I(g))try{let t=D(g,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function f(t){j(),R(g,JSON.stringify(t,null,2),{mode:384});try{await L(g,384)}catch{}}async function m(t){let e=c();e.tokens=t,await f(e)}async function d(){return c().tokens||null}async function h(){let t=c();delete t.tokens,await f(t)}async function P(t){let e=c();e.organizations=t,await f(e)}function A(){return c().organizations||[]}function T(){return c().selectedOrganization||null}function _(){let t=c();return t.temporaryCredentials||t.credentials||null}async function S(t){let e=c();e.loginMethod=t,await f(e)}function v(){return c().loginMethod||null}import u from"axios";import F from"open";function l(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var O=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function E(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var w=class{config;baseUrl;constructor(){this.config=l(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(await u.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(i.user_code,i.verification_uri),await this.sleep(2e3);try{await F(i.verification_uri_complete)}catch{}e?.onWaiting?.();let r=await this.pollForToken(i.device_code,i.interval||5);await m(r),S("oauth"),await this.extractAndStoreOrganizations(r.idToken)}async pollForToken(e,n){let r=0;for(;r<60;){r++;try{let s=(await u.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(o){if(u.isAxiosError(o)&&o.response){let s=o.response.data?.error;if(s==="authorization_pending"){await this.sleep(n*1e3);continue}if(s==="slow_down"){n+=5,await this.sleep(n*1e3);continue}throw new Error(o.response.data?.error_description||"Authentication failed")}throw o}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await d();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let n=300*1e3;return Date.now()+n>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let n=null;if(e?.refreshToken?n=e:n=await d(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let r=(await u.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:n.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,o={accessToken:r.access_token,refreshToken:r.refresh_token||n.refreshToken,idToken:r.id_token||n.idToken,expiresAt:Date.now()+(r.expires_in||3600)*1e3};return await m(o),o}catch{throw await h(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await d();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let n=e.idToken.split(".")[1],i=Buffer.from(n,"base64").toString("utf8");return JSON.parse(i)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let n=e.split(".")[1],i=Buffer.from(n,"base64").toString("utf8"),o=JSON.parse(i)[O];if(!o)return;let s=o?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;P(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),A()}async logout(){await h()}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},y=null;function N(){return y||(y=new w),y}var z=E(),U=l();async function q(){return v()}async function M(){if(await q()==="oauth"){let i=await N().getAccessToken();if(!T())throw new Error('No organization selected. Please run "tigris orgs select" first.');let o=z.endpoint,s=z.iamEndpoint,a=U.domain;return{sessionToken:i,accessKeyId:"",secretAccessKey:"",endpoint:o,organizationId:T()??void 0,iamEndpoint:s,authDomain:a}}let e=_();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{put as G}from"@tigrisdata/storage";async function $(t){let e=C(t,["path"]);e||(console.error("path argument is required"),process.exit(1));let{bucket:n,path:i}=k(e);n||(console.error("Invalid path"),process.exit(1)),i||(console.error("Object key is required (use mk to create buckets)"),process.exit(1));let r=await M(),{error:o}=await G(i,"",{config:{...r,bucket:n}});o&&(console.error(o.message),process.exit(1)),console.log(`Created '${n}/${i}'`),process.exit(0)}export{$ as default};
@@ -1,3 +1,3 @@
1
- import g from"axios";import H from"open";function k(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var S=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";import{homedir as F}from"os";import{join as x}from"path";import{readFileSync as U,writeFileSync as j,existsSync as A,mkdirSync as L}from"fs";import{chmod as G}from"fs/promises";var f=x(F(),".tigris"),p=x(f,"config.json");function V(){A(f)||L(f,{recursive:!0,mode:448})}function c(){if(A(p))try{let n=U(p,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function d(n){V(),j(p,JSON.stringify(n,null,2),{mode:384});try{await G(p,384)}catch{}}async function u(n){let e=c();e.tokens=n,await d(e)}async function l(){return c().tokens||null}async function m(){let n=c();delete n.tokens,await d(n)}async function v(n){let e=c();e.organizations=n,await d(e)}function _(){return c().organizations||[]}function I(){return c().selectedOrganization||null}async function O(n){let e=c();e.loginMethod=n,await d(e)}var C=class{config;baseUrl;constructor(){this.config=k(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await g.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(o.user_code,o.verification_uri),await this.sleep(2e3);try{await H(o.verification_uri_complete)}catch{}e?.onWaiting?.();let r=await this.pollForToken(o.device_code,o.interval||5);await u(r),O("oauth"),await this.extractAndStoreOrganizations(r.idToken)}async pollForToken(e,t){let r=0;for(;r<60;){r++;try{let s=(await g.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(i){if(g.isAxiosError(i)&&i.response){let s=i.response.data?.error;if(s==="authorization_pending"){await this.sleep(t*1e3);continue}if(s==="slow_down"){t+=5,await this.sleep(t*1e3);continue}throw new Error(i.response.data?.error_description||"Authentication failed")}throw i}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await l();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let t=300*1e3;return Date.now()+t>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let t=null;if(e?.refreshToken?t=e:t=await l(),!t)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let r=(await g.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:t.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,i={accessToken:r.access_token,refreshToken:r.refresh_token||t.refreshToken,idToken:r.id_token||t.idToken,expiresAt:Date.now()+(r.expires_in||3600)*1e3};return await u(i),i}catch{throw await m(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await l();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let t=e.idToken.split(".")[1],o=Buffer.from(t,"base64").toString("utf8");return JSON.parse(o)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let t=e.split(".")[1],o=Buffer.from(t,"base64").toString("utf8"),i=JSON.parse(o)[S];if(!i)return;let s=i?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;v(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),_()}async logout(){await m()}async isAuthenticated(){return await l()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},h=null;function P(){return h||(h=new C),h}import{readFileSync as J,existsSync as Y}from"fs";import{join as M,dirname as B}from"path";import{fileURLToPath as q}from"url";import*as E from"yaml";var K=q(import.meta.url),W=B(K),y=null;function Q(){let n=W;for(let e=0;e<5;e++){let t=M(n,"specs.yaml");if(Y(t))return t;n=M(n,"..")}throw new Error("Could not find specs.yaml")}function X(){if(!y){let n=Q(),e=J(n,"utf8");y=E.parse(e)}return y}function b(n,e){let o=X().commands.find(r=>r.name===n);return o?e&&o.operations?o.operations.find(r=>r.name===e)||null:o:null}var Z={success:"\u2714",failure:"\u2716",hint:"\u2192"};function ee(){return process.stdout.isTTY===!0}function z(n){let e=b(n.command,n.operation);if(e)return e.messages}function N(n,e){let t=n;return t=t.replace(/\\n/g,`
2
- `),e&&(t=t.replace(/\{\{(\w+)\}\}/g,(o,r)=>{let i=e[r];return i!==void 0?String(i):`{{${r}}}`})),t}function T(n,e,t){let o=z(n);o?.onFailure&&console.error(`${Z.failure} ${N(o.onFailure,t)}`),e&&console.error(` ${e}`)}function D(n,e){if(!ee())return;let t=z(n);t?.onAlreadyDone&&console.log(N(t.onAlreadyDone,e))}function $(n,e){return{command:n,operation:e}}var w=$("whoami");async function ne(){try{let n=P();if(!await n.isAuthenticated()){D(w);return}let t=await n.getIdTokenClaims(),o=await n.getOrganizations(),r=I(),i=[];if(i.push(""),i.push("User Information:"),i.push(` Email: ${t.email||"N/A"}`),i.push(` User ID: ${t.sub}`),o.length>0){if(i.push(""),i.push(`Organizations (${o.length}):`),o.forEach(s=>{let R=s.id===r?">":" ";i.push(` ${R} ${s.name} (${s.id})`)}),r){let s=o.find(a=>a.id===r);s&&(i.push(""),i.push(`Active: ${s.name}`))}}else i.push(""),i.push("Organizations: None");i.push(""),console.log(i.join(`
3
- `))}catch(n){n instanceof Error?T(w,n.message):T(w),process.exit(1)}}export{ne as default};
1
+ import{listOrganizations as ue}from"@tigrisdata/iam";import w from"axios";import Z from"open";function f(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var E=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function z(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||"https://iam.storageapi.dev"}}import{homedir as J}from"os";import{join as N}from"path";import{readFileSync as Y,writeFileSync as B,existsSync as b,mkdirSync as W}from"fs";import{chmod as Q}from"fs/promises";var A=N(J(),".tigris"),m=N(A,"config.json");function X(){b(A)||W(A,{recursive:!0,mode:448})}function c(){if(b(m))try{let t=Y(m,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function h(t){X(),B(m,JSON.stringify(t,null,2),{mode:384});try{await Q(m,384)}catch{}}async function S(t){let e=c();e.tokens=t,await h(e)}async function d(){return c().tokens||null}async function x(){let t=c();delete t.tokens,await h(t)}async function D(t){let e=c();e.organizations=t,await h(e)}function $(){return c().organizations||[]}function l(){return c().selectedOrganization||null}function C(){let t=c();return t.temporaryCredentials||t.credentials||null}async function K(t){let e=c();e.loginMethod=t,await h(e)}function y(){return c().loginMethod||null}var _=class{config;baseUrl;constructor(){this.config=f(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await w.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(o.user_code,o.verification_uri),await this.sleep(2e3);try{await Z(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await S(i),K("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,n){let i=0;for(;i<60;){i++;try{let r=(await w.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(r.expires_in||3600)*1e3;return{accessToken:r.access_token,refreshToken:r.refresh_token,idToken:r.id_token,expiresAt:a}}catch(s){if(w.isAxiosError(s)&&s.response){let r=s.response.data?.error;if(r==="authorization_pending"){await this.sleep(n*1e3);continue}if(r==="slow_down"){n+=5,await this.sleep(n*1e3);continue}throw new Error(s.response.data?.error_description||"Authentication failed")}throw s}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await d();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let n=300*1e3;return Date.now()+n>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let n=null;if(e?.refreshToken?n=e:n=await d(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await w.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:n.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,s={accessToken:i.access_token,refreshToken:i.refresh_token||n.refreshToken,idToken:i.id_token||n.idToken,expiresAt:Date.now()+(i.expires_in||3600)*1e3};return await S(s),s}catch{throw await x(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await d();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let n=e.idToken.split(".")[1],o=Buffer.from(n,"base64").toString("utf8");return JSON.parse(o)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let n=e.split(".")[1],o=Buffer.from(n,"base64").toString("utf8"),s=JSON.parse(o)[E];if(!s)return;let r=s?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(r.length===0)return;D(r)}catch{}}async getOrganizations(){return await this.getAccessToken(),$()}async logout(){await x()}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},v=null;function T(){return v||(v=new _),v}import{S3Client as _e}from"@aws-sdk/client-s3";var L=z(),ee=f();async function te(){return y()}async function R(){if(await te()==="oauth"){let o=await T().getAccessToken();if(!l())throw new Error('No organization selected. Please run "tigris orgs select" first.');let s=L.endpoint,r=L.iamEndpoint,a=ee.domain;return{sessionToken:o,accessKeyId:"",secretAccessKey:"",endpoint:s,organizationId:l()??void 0,iamEndpoint:r,authDomain:a}}let e=C();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{readFileSync as ne,existsSync as ie}from"fs";import{join as F,dirname as oe}from"path";import{fileURLToPath as se}from"url";import*as U from"yaml";var re=se(import.meta.url),ae=oe(re),I=null;function ce(){let t=ae;for(let e=0;e<5;e++){let n=F(t,"specs.yaml");if(ie(n))return n;t=F(t,"..")}throw new Error("Could not find specs.yaml")}function ge(){if(!I){let t=ce(),e=ne(t,"utf8");I=U.parse(e)}return I}function j(t,e){let o=ge().commands.find(i=>i.name===t);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var de={success:"\u2714",failure:"\u2716",hint:"\u2192"};function le(){return process.stdout.isTTY===!0}function G(t){let e=j(t.command,t.operation);if(e)return e.messages}function V(t,e){let n=t;return n=n.replace(/\\n/g,`
2
+ `),e&&(n=n.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let s=e[i];return s!==void 0?String(s):`{{${i}}}`})),n}function k(t,e,n){let o=G(t);o?.onFailure&&console.error(`${de.failure} ${V(o.onFailure,n)}`),e&&console.error(` ${e}`)}function M(t,e){if(!le())return;let n=G(t);n?.onAlreadyDone&&console.log(V(n.onAlreadyDone,e))}function q(t,e){return{command:t,operation:e}}var u=q("whoami");async function pe(){try{let t=y(),e=C(),n,o;if(t==="oauth"){let s=T();if(!await s.isAuthenticated()){M(u);return}let a=await s.getIdTokenClaims();n=a.email,o=a.sub}else if(e)n=void 0,o=e.accessKeyId;else{M(u);return}let i=[];if(i.push(""),i.push("User Information:"),i.push(` Email: ${n||"N/A"}`),i.push(` User ID: ${o||"N/A"}`),t==="oauth"){let s=await R(),r=l(),{data:a,error:O}=await ue({config:s});O&&(k(u,O.message),process.exit(1));let p=a?.organizations??[];if(p.length>0){if(i.push(""),i.push(`Organizations (${p.length}):`),p.forEach(g=>{let H=g.id===r?">":" ";i.push(` ${H} ${g.name} (${g.id})`)}),r){let g=p.find(P=>P.id===r);g&&(i.push(""),i.push(`Active: ${g.name}`))}}else i.push(""),i.push("Organizations: None")}else i.push(""),i.push("Login method: Access Key Credentials"),i.push(" (Organization listing requires OAuth login: tigris login)");i.push(""),console.log(i.join(`
3
+ `))}catch(t){t instanceof Error?k(u,t.message):k(u),process.exit(1)}}export{pe as default};
package/dist/specs.yaml CHANGED
@@ -171,6 +171,24 @@ commands:
171
171
  onSuccess: 'Logged out. Your configured credentials are still saved.'
172
172
  onFailure: 'Failed to logout'
173
173
 
174
+ # credentials
175
+ - name: credentials
176
+ description: Manage and test credentials
177
+ alias: creds
178
+ operations:
179
+ - name: test
180
+ description: Test if credentials have access to Tigris (optionally to a specific bucket)
181
+ alias: t
182
+ messages:
183
+ onStart: 'Testing credentials...'
184
+ onSuccess: 'Credentials are valid'
185
+ onFailure: 'Credentials test failed'
186
+ arguments:
187
+ - name: bucket
188
+ description: Bucket name to test access against (optional)
189
+ alias: b
190
+ required: false
191
+
174
192
  #########################
175
193
  # Unix style commands
176
194
  #########################
@@ -429,6 +447,39 @@ commands:
429
447
  type: positional
430
448
  required: true
431
449
  multiple: true
450
+ # set
451
+ - name: set
452
+ description: Update bucket settings
453
+ alias: s
454
+ messages:
455
+ onStart: 'Updating bucket...'
456
+ onSuccess: 'Bucket {{name}} updated successfully'
457
+ onFailure: 'Failed to update bucket'
458
+ arguments:
459
+ - name: name
460
+ description: Name of the bucket
461
+ type: positional
462
+ required: true
463
+ - name: access
464
+ description: Bucket access level
465
+ options: *access_options
466
+ - name: region
467
+ description: Allowed regions (can specify multiple)
468
+ options: *region_options
469
+ multiple: true
470
+ - name: allow-object-acl
471
+ description: Enable object-level ACL
472
+ type: boolean
473
+ - name: disable-directory-listing
474
+ description: Disable directory listing
475
+ type: boolean
476
+ - name: cache-control
477
+ description: Default cache-control header value
478
+ - name: custom-domain
479
+ description: Custom domain for the bucket
480
+ - name: enable-delete-protection
481
+ description: Enable delete protection
482
+ type: boolean
432
483
 
433
484
  #########################
434
485
  # Manage forks
@@ -1 +1 @@
1
- function f(n,r,t){for(let e of r)if(n[e]!==void 0)return n[e];return t}export{f as getOption};
1
+ function t(n,r,o){for(let e of r)if(n[e]!==void 0)return n[e];return o}function f(n){if(n!==void 0)return typeof n=="boolean"?n:n==="true"}export{t as getOption,f as parseBoolean};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tigrisdata/cli",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "description": "Command line interface for Tigris object storage",
5
5
  "type": "module",
6
6
  "exports": {
@@ -78,7 +78,8 @@
78
78
  },
79
79
  "dependencies": {
80
80
  "@aws-sdk/client-s3": "^3.908.0",
81
- "@tigrisdata/storage": "^2.10.1",
81
+ "@tigrisdata/iam": "^1.0.0",
82
+ "@tigrisdata/storage": "^2.11.0",
82
83
  "axios": "^1.12.2",
83
84
  "commander": "^11.0.0",
84
85
  "enquirer": "^2.4.1",