@tigrisdata/cli 2.4.0 → 2.6.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.
Files changed (43) hide show
  1. package/dist/auth/client.js +1 -1
  2. package/dist/auth/config.js +1 -1
  3. package/dist/auth/s3-client.js +1 -1
  4. package/dist/auth/storage.js +1 -1
  5. package/dist/cli.js +5 -5
  6. package/dist/constants.js +1 -0
  7. package/dist/index.js +5 -5
  8. package/dist/lib/access-keys/assign.js +3 -3
  9. package/dist/lib/access-keys/create.js +3 -3
  10. package/dist/lib/access-keys/delete.js +3 -3
  11. package/dist/lib/access-keys/get.js +3 -3
  12. package/dist/lib/access-keys/list.js +8 -8
  13. package/dist/lib/buckets/create.js +2 -2
  14. package/dist/lib/buckets/delete.js +2 -2
  15. package/dist/lib/buckets/get.js +7 -7
  16. package/dist/lib/buckets/list.js +7 -7
  17. package/dist/lib/buckets/set.js +2 -2
  18. package/dist/lib/configure/index.js +2 -2
  19. package/dist/lib/cp.js +1 -1
  20. package/dist/lib/credentials/test.js +2 -2
  21. package/dist/lib/forks/create.js +2 -2
  22. package/dist/lib/forks/list.js +7 -7
  23. package/dist/lib/login/credentials.js +2 -2
  24. package/dist/lib/login/oauth.js +3 -3
  25. package/dist/lib/login/select.js +4 -4
  26. package/dist/lib/logout.js +2 -2
  27. package/dist/lib/ls.js +5 -5
  28. package/dist/lib/mk.js +1 -1
  29. package/dist/lib/mv.js +1 -1
  30. package/dist/lib/objects/delete.js +2 -2
  31. package/dist/lib/objects/get.js +2 -2
  32. package/dist/lib/objects/list.js +7 -7
  33. package/dist/lib/objects/put.js +6 -6
  34. package/dist/lib/organizations/create.js +3 -3
  35. package/dist/lib/organizations/list.js +7 -7
  36. package/dist/lib/organizations/select.js +5 -5
  37. package/dist/lib/rm.js +1 -1
  38. package/dist/lib/snapshots/list.js +6 -6
  39. package/dist/lib/snapshots/take.js +2 -2
  40. package/dist/lib/touch.js +1 -1
  41. package/dist/lib/whoami.js +3 -3
  42. package/dist/specs.yaml +131 -81
  43. package/package.json +4 -2
@@ -1 +1 @@
1
- import f from"axios";import N 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 w=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";import{homedir as x}from"os";import{join as C}from"path";import{readFileSync as A,writeFileSync as S,existsSync as y,mkdirSync as P}from"fs";import{chmod as O}from"fs/promises";var p=C(x(),".tigris"),g=C(p,"config.json");function E(){y(p)||P(p,{recursive:!0,mode:448})}function c(){if(y(g))try{let t=A(g,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function l(t){E(),S(g,JSON.stringify(t,null,2),{mode:384});try{await O(g,384)}catch{}}async function u(t){let e=c();e.tokens=t,await l(e)}async function d(){return c().tokens||null}async function m(){let t=c();delete t.tokens,await l(t)}async function _(t){let e=c();e.organizations=t,await l(e)}function v(){return c().organizations||[]}async function I(t){let e=c();e.loginMethod=t,await l(e)}var T=class{config;baseUrl;constructor(){this.config=k(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(await f.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 N(i.verification_uri_complete)}catch{}e?.onWaiting?.();let r=await this.pollForToken(i.device_code,i.interval||5);await u(r),I("oauth"),await this.extractAndStoreOrganizations(r.idToken)}async pollForToken(e,n){let r=0;for(;r<60;){r++;try{let s=(await f.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(f.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 f.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 u(o),o}catch{throw await m(),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)[w];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;_(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),v()}async logout(){await m()}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},h=null;function J(){return h||(h=new T),h}export{T as TigrisAuthClient,J as getAuthClient};
1
+ import g from"axios";import D from"open";function h(){let t=process.env.TIGRIS_ENV==="development",e=process.env.AUTH0_DOMAIN||t?"auth-dev.tigris.dev":"auth.tigris.dev",n=process.env.AUTH0_CLIENT_ID||t?"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF":"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",o=process.env.AUTH0_AUDIENCE||t?"https://tigris-api-dev":"https://tigris-os-api";return{domain:e,clientId:n,audience:o}}var C=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";import{homedir as v}from"os";import{join as I}from"path";import{readFileSync as y,writeFileSync as O,existsSync as S,mkdirSync as P}from"fs";import{loadSharedConfigFiles as K}from"@smithy/shared-ini-file-loader";import{chmod as x}from"fs/promises";var p=I(v(),".tigris"),l=I(p,"config.json");function N(){S(p)||P(p,{recursive:!0,mode:448})}function c(){if(S(l))try{let t=y(l,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function f(t){N(),O(l,JSON.stringify(t,null,2),{mode:384});try{await x(l,384)}catch{}}async function u(t){let e=c();e.tokens=t,await f(e)}async function d(){return c().tokens||null}async function T(){let t=c();delete t.tokens,await f(t)}async function A(t){let e=c();e.organizations=t,await f(e)}function w(){return c().organizations||[]}async function E(t){let e=c();e.loginMethod=t,await f(e)}var _=class{config;baseUrl;constructor(){this.config=h(),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 D(o.verification_uri_complete)}catch{}e?.onWaiting?.();let r=await this.pollForToken(o.device_code,o.interval||5);await u(r),E("oauth"),await this.extractAndStoreOrganizations(r.idToken)}async pollForToken(e,n){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(n*1e3);continue}if(s==="slow_down"){n+=5,await this.sleep(n*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 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 g.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,i={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 u(i),i}catch{throw await T(),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"),i=JSON.parse(o)[C];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;A(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),w()}async logout(){await T()}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},m=null;function q(){return m||(m=new _),m}export{_ as TigrisAuthClient,q as getAuthClient};
@@ -1 +1 @@
1
- function i(){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 t=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"}}export{t as TIGRIS_CLAIMS_NAMESPACE,i as getAuth0Config,e as getTigrisConfig};
1
+ var t="https://t3.storage.dev",n="https://iam.storageapi.dev";function p(){let e=process.env.TIGRIS_ENV==="development",i=process.env.AUTH0_DOMAIN||e?"auth-dev.tigris.dev":"auth.tigris.dev",s=process.env.AUTH0_CLIENT_ID||e?"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF":"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",o=process.env.AUTH0_AUDIENCE||e?"https://tigris-api-dev":"https://tigris-os-api";return{domain:i,clientId:s,audience:o}}var T=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function E(){return process.env.TIGRIS_STORAGE_ENDPOINT||process.env.TIGRIS_IAM_ENDPOINT?{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||t,iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||n}:{endpoint:process.env.AWS_ENDPOINT_URL_S3||t,iamEndpoint:process.env.AWS_ENDPOINT_URL_IAM||n}}export{T as TIGRIS_CLAIMS_NAMESPACE,p as getAuth0Config,E as getTigrisConfig};
@@ -1 +1 @@
1
- import{S3Client as M}from"@aws-sdk/client-s3";import{homedir as b}from"os";import{join as v}from"path";import{readFileSync as K,writeFileSync as R,existsSync as x,mkdirSync as L}from"fs";import{chmod as U}from"fs/promises";var h=v(b(),".tigris"),g=v(h,"config.json");function F(){x(h)||L(h,{recursive:!0,mode:448})}function c(){if(x(g))try{let n=K(g,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function l(n){F(),R(g,JSON.stringify(n,null,2),{mode:384});try{await U(g,384)}catch{}}async function T(n){let e=c();e.tokens=n,await l(e)}async function d(){return c().tokens||null}async function w(){let n=c();delete n.tokens,await l(n)}async function S(n){let e=c();e.organizations=n,await l(e)}function P(){return c().organizations||[]}function f(){return c().selectedOrganization||null}function u(){let n=c();return n.temporaryCredentials||n.credentials||null}async function O(n){let e=c();e.loginMethod=n,await l(e)}function E(){return c().loginMethod||null}import m from"axios";import G 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 C=class{config;baseUrl;constructor(){this.config=p(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(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?.(i.user_code,i.verification_uri),await this.sleep(2e3);try{await G(i.verification_uri_complete)}catch{}e?.onWaiting?.();let r=await this.pollForToken(i.device_code,i.interval||5);await T(r),O("oauth"),await this.extractAndStoreOrganizations(r.idToken)}async pollForToken(e,t){let r=0;for(;r<60;){r++;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(o){if(m.isAxiosError(o)&&o.response){let s=o.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(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 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 d(),!t)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let r=(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,o={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 T(o),o}catch{throw await w(),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 t=e.idToken.split(".")[1],i=Buffer.from(t,"base64").toString("utf8");return JSON.parse(i)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let t=e.split(".")[1],i=Buffer.from(t,"base64").toString("utf8"),o=JSON.parse(i)[N];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;S(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),P()}async logout(){await w()}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},y=null;function k(){return y||(y=new C),y}var _=z(),j=p();async function A(){return E()}async function re(){if(await A()==="oauth"){let i=await k().getAccessToken();if(!f())throw new Error('No organization selected. Please run "tigris orgs select" first.');let o=_.endpoint,s=_.iamEndpoint,a=j.domain;return{sessionToken:i,accessKeyId:"",secretAccessKey:"",endpoint:o,organizationId:f()??void 0,iamEndpoint:s,authDomain:a}}let e=u();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.')}async function se(){if(await A()==="oauth"){let i=await k().getAccessToken(),r=f();if(!r)throw new Error('No organization selected. Please run "tigris orgs select" first.');let o=_.endpoint,s=new M({region:"auto",endpoint:o,credentials:{sessionToken:i,accessKeyId:"",secretAccessKey:""}});return s.middlewareStack.add(a=>async I=>{let D=I.request;return D.headers["x-Tigris-Namespace"]=r,await a(I)},{name:"x-Tigris-Namespace-Middleware",step:"build",override:!0}),s}let e=u();if(e)return new M({region:"auto",endpoint:e.endpoint,credentials:{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey}});throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}async function ae(){return await A()!==null?!0:u()!==null}export{A as getLoginMethod,se as getS3Client,re as getStorageConfig,ae as isAuthenticated};
1
+ import{S3Client as u}from"@aws-sdk/client-s3";import{fromIni as b}from"@aws-sdk/credential-providers";import{homedir as D}from"os";import{join as p}from"path";import{readFileSync as W,writeFileSync as j,existsSync as m,mkdirSync as q}from"fs";import{loadSharedConfigFiles as H}from"@smithy/shared-ini-file-loader";import{chmod as J}from"fs/promises";var c="https://t3.storage.dev",w="https://iam.storageapi.dev";var S=p(D(),".tigris"),T=p(S,"config.json");function Y(){m(S)||q(S,{recursive:!0,mode:448})}function d(){if(m(T))try{let t=W(T,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function h(t){Y(),j(T,JSON.stringify(t,null,2),{mode:384});try{await J(T,384)}catch{}}async function E(t){let e=d();e.tokens=t,await h(e)}async function f(){return d().tokens||null}async function k(){let t=d();delete t.tokens,await h(t)}async function R(t){let e=d();e.organizations=t,await h(e)}function z(){return d().organizations||[]}function C(){return d().selectedOrganization||null}function y(){if(process.env.TIGRIS_STORAGE_ACCESS_KEY_ID||process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY){let i=process.env.TIGRIS_STORAGE_ACCESS_KEY_ID,o=process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY;if(!i||!o)return null;let r=process.env.TIGRIS_STORAGE_ENDPOINT||c;return{accessKeyId:i,secretAccessKey:o,endpoint:r}}let t=process.env.AWS_ACCESS_KEY_ID,e=process.env.AWS_SECRET_ACCESS_KEY;if(!t||!e)return null;let n=process.env.AWS_ENDPOINT_URL_S3||c;return{accessKeyId:t,secretAccessKey:e,endpoint:n}}function _(){if(!process.env.AWS_PROFILE)return!1;let t=p(D(),".aws");return m(p(t,"credentials"))||m(p(t,"config"))}async function v(t){try{let{configFile:e}=await H(),n=e[t];return n?{endpoint:n.endpoint_url_s3||n.endpoint_url,iamEndpoint:n.endpoint_url_iam,region:n.region}:{}}catch{return{}}}function l(){let t=d();return t.temporaryCredentials||t.credentials||null}async function M(t){let e=d();e.loginMethod=t,await h(e)}function G(){return d().loginMethod||null}import I from"axios";import B from"open";function A(){let t=process.env.TIGRIS_ENV==="development",e=process.env.AUTH0_DOMAIN||t?"auth-dev.tigris.dev":"auth.tigris.dev",n=process.env.AUTH0_CLIENT_ID||t?"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF":"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",i=process.env.AUTH0_AUDIENCE||t?"https://tigris-api-dev":"https://tigris-os-api";return{domain:e,clientId:n,audience:i}}var L=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function F(){return process.env.TIGRIS_STORAGE_ENDPOINT||process.env.TIGRIS_IAM_ENDPOINT?{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||c,iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||w}:{endpoint:process.env.AWS_ENDPOINT_URL_S3||c,iamEndpoint:process.env.AWS_ENDPOINT_URL_IAM||w}}var P=class{config;baseUrl;constructor(){this.config=A(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(await I.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 B(i.verification_uri_complete)}catch{}e?.onWaiting?.();let o=await this.pollForToken(i.device_code,i.interval||5);await E(o),M("oauth"),await this.extractAndStoreOrganizations(o.idToken)}async pollForToken(e,n){let o=0;for(;o<60;){o++;try{let s=(await I.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(I.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 f();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 f(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let o=(await I.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:o.access_token,refreshToken:o.refresh_token||n.refreshToken,idToken:o.id_token||n.idToken,expiresAt:Date.now()+(o.expires_in||3600)*1e3};return await E(r),r}catch{throw await k(),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 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"),r=JSON.parse(i)[L];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;R(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),z()}async logout(){await k()}async isAuthenticated(){return await f()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},O=null;function x(){return O||(O=new P),O}var g=F(),$=A();async function N(){return G()}async function Ce(){if(_()){let i=process.env.AWS_PROFILE||"default",o=await v(i),r=await b({profile:i})();return{accessKeyId:r.accessKeyId,secretAccessKey:r.secretAccessKey,endpoint:o.endpoint||g.endpoint||c,iamEndpoint:o.iamEndpoint||g.iamEndpoint}}let t=await N();if(t==="oauth"){let o=await x().getAccessToken();if(!C())throw new Error('No organization selected. Please run "tigris orgs select" first.');return{sessionToken:o,accessKeyId:"",secretAccessKey:"",endpoint:g.endpoint,organizationId:C()??void 0,iamEndpoint:g.iamEndpoint,authDomain:$.domain}}if(t==="credentials"){let i=l();if(i)return{accessKeyId:i.accessKeyId,secretAccessKey:i.secretAccessKey,endpoint:i.endpoint}}let e=y();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};let n=l();if(n)return{accessKeyId:n.accessKeyId,secretAccessKey:n.secretAccessKey,endpoint:n.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}async function ye(){if(_()){let i=process.env.AWS_PROFILE||"default",o=await v(i);return new u({region:"auto",endpoint:o.endpoint||g.endpoint||c,credentials:b({profile:i})})}let t=await N();if(t==="oauth"){let o=await x().getAccessToken(),r=C();if(!r)throw new Error('No organization selected. Please run "tigris orgs select" first.');let s=new u({region:"auto",endpoint:g.endpoint,credentials:{sessionToken:o,accessKeyId:"",secretAccessKey:""}});return s.middlewareStack.add(a=>async K=>{let U=K.request;return U.headers["x-Tigris-Namespace"]=r,await a(K)},{name:"x-Tigris-Namespace-Middleware",step:"build",override:!0}),s}if(t==="credentials"){let i=l();if(i)return new u({region:"auto",endpoint:i.endpoint,credentials:{accessKeyId:i.accessKeyId,secretAccessKey:i.secretAccessKey}})}let e=y();if(e)return new u({region:"auto",endpoint:e.endpoint,credentials:{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey}});let n=l();if(n)return new u({region:"auto",endpoint:n.endpoint,credentials:{accessKeyId:n.accessKeyId,secretAccessKey:n.secretAccessKey}});throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}async function _e(){return _()||await N()!==null||y()!==null||l()!==null}export{N as getLoginMethod,ye as getS3Client,Ce as getStorageConfig,_e as isAuthenticated};
@@ -1 +1 @@
1
- import{homedir as c}from"os";import{join as s}from"path";import{readFileSync as g,writeFileSync as f,existsSync as a,mkdirSync as l}from"fs";import{chmod as d}from"fs/promises";var r=s(c(),".tigris"),i=s(r,"config.json");function u(){a(r)||l(r,{recursive:!0,mode:448})}function e(){if(a(i))try{let n=g(i,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function t(n){u(),f(i,JSON.stringify(n,null,2),{mode:384});try{await d(i,384)}catch{}}async function x(n){let o=e();o.tokens=n,await t(o)}async function v(){return e().tokens||null}async function O(){let n=e();delete n.tokens,await t(n)}async function z(n){let o=e();o.organizations=n,await t(o)}function w(){return e().organizations||[]}async function S(n){let o=e();o.selectedOrganization=n,await t(o)}function h(){return e().selectedOrganization||null}function k(){let n=e();return n.temporaryCredentials||n.credentials||null}function P(){return e().credentials||null}async function T(n){let o=e();o.credentials=n,await t(o)}async function I(n){let o=e();o.temporaryCredentials=n,await t(o)}async function F(){let n=e();delete n.temporaryCredentials,await t(n)}async function M(){let n=e();delete n.credentials,await t(n)}async function N(n){let o=e();o.loginMethod=n,await t(o)}function j(){return e().loginMethod||null}async function D(){let o=e().credentials;await t({credentials:o})}export{D as clearAllData,M as clearCredentials,F as clearTemporaryCredentials,O as clearTokens,k as getCredentials,j as getLoginMethod,w as getOrganizations,P as getSavedCredentials,h as getSelectedOrganization,v as getTokens,T as storeCredentials,N as storeLoginMethod,z as storeOrganizations,S as storeSelectedOrganization,I as storeTemporaryCredentials,x as storeTokens};
1
+ import{homedir as d}from"os";import{join as r}from"path";import{readFileSync as p,writeFileSync as C,existsSync as s,mkdirSync as S}from"fs";import{loadSharedConfigFiles as m}from"@smithy/shared-ini-file-loader";import{chmod as _}from"fs/promises";var a="https://t3.storage.dev";var l=r(d(),".tigris"),c=r(l,"config.json");function E(){s(l)||S(l,{recursive:!0,mode:448})}function o(){if(s(c))try{let n=p(c,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function t(n){E(),C(c,JSON.stringify(n,null,2),{mode:384});try{await _(c,384)}catch{}}async function w(n){let e=o();e.tokens=n,await t(e)}async function R(){return o().tokens||null}async function h(){let n=o();delete n.tokens,await t(n)}async function D(n){let e=o();e.organizations=n,await t(e)}function z(){return o().organizations||[]}async function G(n){let e=o();e.selectedOrganization=n,await t(e)}function N(){return o().selectedOrganization||null}function y(){if(process.env.TIGRIS_STORAGE_ACCESS_KEY_ID||process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY){let f=process.env.TIGRIS_STORAGE_ACCESS_KEY_ID,g=process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY;if(!f||!g)return null;let u=process.env.TIGRIS_STORAGE_ENDPOINT||a;return{accessKeyId:f,secretAccessKey:g,endpoint:u}}let n=process.env.AWS_ACCESS_KEY_ID,e=process.env.AWS_SECRET_ACCESS_KEY;if(!n||!e)return null;let i=process.env.AWS_ENDPOINT_URL_S3||a;return{accessKeyId:n,secretAccessKey:e,endpoint:i}}function k(){if(!process.env.AWS_PROFILE)return!1;let n=r(d(),".aws");return s(r(n,"credentials"))||s(r(n,"config"))}async function K(n){try{let{configFile:e}=await m(),i=e[n];return i?{endpoint:i.endpoint_url_s3||i.endpoint_url,iamEndpoint:i.endpoint_url_iam,region:i.region}:{}}catch{return{}}}function F(){let n=o();return y()||n.temporaryCredentials||n.credentials||null}function L(){let n=o();return n.temporaryCredentials||n.credentials||null}function M(){return o().credentials||null}async function Y(n){let e=o();e.credentials=n,await t(e)}async function U(n){let e=o();e.temporaryCredentials=n,await t(e)}async function W(){let n=o();delete n.temporaryCredentials,await t(n)}async function j(){let n=o();delete n.credentials,await t(n)}async function J(n){let e=o();e.loginMethod=n,await t(e)}function b(){return o().loginMethod||null}async function q(){let e=o().credentials;await t({credentials:e})}export{q as clearAllData,j as clearCredentials,W as clearTemporaryCredentials,h as clearTokens,K as getAwsProfileConfig,F as getCredentials,y as getEnvCredentials,b as getLoginMethod,z as getOrganizations,M as getSavedCredentials,N as getSelectedOrganization,L as getStoredCredentials,R as getTokens,k as hasAwsProfile,Y as storeCredentials,J as storeLoginMethod,D as storeOrganizations,G as storeSelectedOrganization,U as storeTemporaryCredentials,w as storeTokens};
package/dist/cli.js CHANGED
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
- import{Command as E}from"commander";import{readFileSync as k,existsSync as q}from"fs";import{join as u,dirname as R}from"path";import{fileURLToPath as P}from"url";import*as C from"yaml";var b="2.4.0";process.on("unhandledRejection",e=>{(e===""||e===void 0)&&(console.error(`
2
+ import{Command as E}from"commander";import{readFileSync as k,existsSync as q}from"fs";import{join as u,dirname as R}from"path";import{fileURLToPath as P}from"url";import*as C from"yaml";var b="2.6.0";process.on("unhandledRejection",e=>{(e===""||e===void 0)&&(console.error(`
3
3
  Operation cancelled`),process.exit(1)),console.error(`
4
4
  Error:`,e instanceof Error?e.message:e),process.exit(1)});process.on("uncaughtException",e=>{console.error(`
5
- Error:`,e.message),process.exit(1)});var D=P(import.meta.url),p=R(D),V=u(p,"specs.yaml"),M=k(V,"utf8"),l=C.parse(M);function y(e,t){return(t?[u(p,"lib",e,`${t}.js`),u(p,"lib",e,t,"index.js")]:[u(p,"lib",`${e}.js`),u(p,"lib",e,"index.js")]).some(i=>q(i))}function A(e){let t;e.type==="positional"?t=` ${e.name}`:(t=` --${e.name}`,e.alias&&e.alias.length===1&&(t+=`, -${e.alias}`));let n=26,i=t.length>=n?t+" ":t.padEnd(n),s=e.description;return e.options&&(Array.isArray(e.options)&&typeof e.options[0]=="string"?s+=` (options: ${e.options.join(", ")})`:s+=` (options: ${e.options.map(o=>o.value).join(", ")})`),e.default&&(s+=` [default: ${e.default}]`),e.required&&(s+=" [required]"),e["required-when"]&&(s+=` [required when: ${e["required-when"]}]`),e.multiple&&(s+=" [multiple values: comma-separated]"),e.type==="positional"&&(s+=" [positional argument]"),e.examples&&e.examples.length>0&&(s+=` (examples: ${e.examples.join(", ")})`),`${i}${s}`}function w(e){if(console.log(`
5
+ Error:`,e.message),process.exit(1)});var D=P(import.meta.url),p=R(D),V=u(p,"specs.yaml"),M=k(V,"utf8"),l=C.parse(M);function y(e,t){return(t?[u(p,"lib",e,`${t}.js`),u(p,"lib",e,t,"index.js")]:[u(p,"lib",`${e}.js`),u(p,"lib",e,"index.js")]).some(i=>q(i))}function v(e){let t;e.type==="positional"?t=` ${e.name}`:(t=` --${e.name}`,e.alias&&e.alias.length===1&&(t+=`, -${e.alias}`));let n=26,i=t.length>=n?t+" ":t.padEnd(n),s=e.description;return e.options&&(Array.isArray(e.options)&&typeof e.options[0]=="string"?s+=` (options: ${e.options.join(", ")})`:s+=` (options: ${e.options.map(o=>o.value).join(", ")})`),e.default&&(s+=` [default: ${e.default}]`),e.required&&(s+=" [required]"),e["required-when"]&&(s+=` [required when: ${e["required-when"]}]`),e.multiple&&(s+=" [multiple values: comma-separated]"),e.type==="positional"&&(s+=" [positional argument]"),e.examples&&e.examples.length>0&&(s+=` (examples: ${e.examples.join(", ")})`),`${i}${s}`}function w(e){if(console.log(`
6
6
  ${l.name} ${e.name} - ${e.description}
7
- `),e.operations&&e.operations.length>0){let t=e.operations.filter(n=>y(e.name,n.name));t.length>0&&(console.log("Operations:"),t.forEach(n=>{let i=` ${n.name}`;if(n.alias){let o=Array.isArray(n.alias)?n.alias:[n.alias];i+=` (${o.join(", ")})`}let s=i.padEnd(24);console.log(`${s}${n.description}`)}),console.log())}e.arguments&&e.arguments.length>0&&(console.log("Arguments:"),e.arguments.forEach(t=>{console.log(A(t))}),console.log()),console.log(`Use "${l.name} ${e.name} <operation> help" for more information about an operation.`)}function U(e,t){console.log(`
7
+ `),e.operations&&e.operations.length>0){let t=e.operations.filter(n=>y(e.name,n.name));t.length>0&&(console.log("Operations:"),t.forEach(n=>{let i=` ${n.name}`;if(n.alias){let o=Array.isArray(n.alias)?n.alias:[n.alias];i+=` (${o.join(", ")})`}let s=i.padEnd(24);console.log(`${s}${n.description}`)}),console.log())}e.arguments&&e.arguments.length>0&&(console.log("Arguments:"),e.arguments.forEach(t=>{console.log(v(t))}),console.log()),console.log(`Use "${l.name} ${e.name} <operation> help" for more information about an operation.`)}function U(e,t){console.log(`
8
8
  ${l.name} ${e.name} ${t.name} - ${t.description}
9
- `),t.arguments&&t.arguments.length>0&&(console.log("Arguments:"),t.arguments.forEach(n=>{console.log(A(n))}),console.log())}function T(e){return y(e.name)?!0:e.operations?e.operations.some(t=>y(e.name,t.name)):!1}function v(){console.log(`Tigris CLI Version: ${b}
9
+ `),t.arguments&&t.arguments.length>0&&(console.log("Arguments:"),t.arguments.forEach(n=>{console.log(v(n))}),console.log())}function T(e){return y(e.name)?!0:e.operations?e.operations.some(t=>y(e.name,t.name)):!1}function A(){console.log(`Tigris CLI Version: ${b}
10
10
  `),console.log(`Usage: tigris [command] [options]
11
11
  `),console.log("Commands:"),l.commands.filter(T).forEach(t=>{let n=` ${t.name}`;t.alias&&(n+=` (${t.alias})`);let i=n.padEnd(24);console.log(`${i}${t.description}`)}),console.log(`
12
12
  Use "${l.name} <command> help" for more information about a command.`)}function m(e,t=[]){t.forEach(n=>{if(n.type==="positional"){let i=n.required?`<${n.name}>`:`[${n.name}]`;e.argument(i,n.description)}else{let s=n.alias&&n.alias.length===1?`-${n.alias}, --${n.name}`:`--${n.name}`;n.type==="flag"||(n.type==="boolean"?s+=" [value]":n.options?s+=" <value>":s+=n.required||n["required-when"]?" <value>":" [value]"),e.option(s,n.description,n.default)}})}function g(e,t){for(let n of e){if(n["required-when"]){let[i,s]=n["required-when"].split("="),o=h(t,i,e),r=h(t,n.name,e);if(o===s&&!r)return console.error(`--${n.name} is required when --${i} is ${s}`),!1}if(n.required&&!h(t,n.name,e))return console.error(`--${n.name} is required`),!1}return!0}function h(e,t,n){if(n){let s=n.find(o=>o.name===t);if(s&&s.alias){let o=s.alias.charAt(0).toUpperCase()+s.alias.slice(1);if(e[o]!==void 0)return e[o]}}let i=[t,t.replace(/-/g,""),t.replace(/-/g,"").toLowerCase(),t.charAt(0).toUpperCase(),_(t)];for(let s of i)if(e[s]!==void 0)return e[s]}function _(e){return e.replace(/-([a-z])/g,(t,n)=>n.toUpperCase())}async function H(e,t){let n=t?[`./lib/${e}/${t}.js`,`./lib/${e}/${t}/index.js`]:[`./lib/${e}.js`,`./lib/${e}/index.js`];for(let s of n){let o=await import(s).catch(()=>null);if(o)return{module:o,error:null}}return{module:null,error:`Command not found: ${t?`${e} ${t}`:e}`}}async function $(e,t,n=[],i={},s){if(s){let x=s.replace(/\\n/g,`
13
- `);console.log(x)}let{module:o,error:r}=await H(e,t);(r||!o)&&(console.error(r),process.exit(1));let a=t||e,d=o.default||o[a];typeof d!="function"&&(console.error(`Command not implemented: ${a}`),process.exit(1)),await d({...i,_positional:n})}var f=new E;f.name(l.name).description(l.description).version(l.version);function c(e,t,n){let i;"optsWithGlobals"in n&&typeof n.optsWithGlobals=="function"?i=n.optsWithGlobals():"opts"in n&&typeof n.opts=="function"?i=n.opts():i=n;let s={...i};return e.filter(r=>r.type==="positional").forEach((r,a)=>{t[a]!==void 0&&(r.multiple?s[r.name]=t[a].split(",").map(d=>d.trim()):s[r.name]=t[a])}),e.forEach(r=>{r.multiple&&r.type!=="positional"&&s[r.name]&&typeof s[r.name]=="string"&&(s[r.name]=s[r.name].split(",").map(a=>a.trim()))}),s}l.commands.forEach(e=>{let t=f.command(e.name).description(e.description);if(e.alias&&t.alias(e.alias),e.operations&&e.operations.length>0)if(e.operations.forEach(n=>{let i=t.command(n.name).description(n.description);n.alias&&(Array.isArray(n.alias)?n.alias:[n.alias]).forEach(o=>i.alias(o)),m(i,n.arguments),i.action(async(...s)=>{let o=s.pop(),r=s;n.arguments&&!g(n.arguments,c(n.arguments,r,o))||await $(e.name,n.name,r,c(n.arguments||[],r,o),n.message)}),i.command("help").description("Show help for this operation").action(()=>{U(e,n)})}),e.default){let n=e.operations?.find(i=>i.name===e.default);if(n){m(t,e.arguments),m(t,n.arguments);let i=[...e.arguments||[],...n.arguments||[]];t.action(async(...s)=>{let o=s.pop(),r=s;i.length>0&&!g(i,c(i,r,o))||await $(e.name,n.name,r,c(i,r,o),e.message||n.message)})}}else t.action(()=>{w(e)});else m(t,e.arguments),t.action(async(...n)=>{let i=n.pop(),s=n;e.arguments&&!g(e.arguments,c(e.arguments,s,i))||await $(e.name,void 0,s,c(e.arguments||[],s,i),e.message)});t.command("help").description("Show help for this command").action(()=>{w(e)})});f.command("help").description("Show general help").action(()=>{v()});f.action(()=>{v()});f.parse();
13
+ `);console.log(x)}let{module:o,error:r}=await H(e,t);(r||!o)&&(console.error(r),process.exit(1));let a=t||e,d=o.default||o[a];typeof d!="function"&&(console.error(`Command not implemented: ${a}`),process.exit(1)),await d({...i,_positional:n})}var f=new E;f.name(l.name).description(l.description).version(l.version);function c(e,t,n){let i;"optsWithGlobals"in n&&typeof n.optsWithGlobals=="function"?i=n.optsWithGlobals():"opts"in n&&typeof n.opts=="function"?i=n.opts():i=n;let s={...i};return e.filter(r=>r.type==="positional").forEach((r,a)=>{t[a]!==void 0&&(r.multiple?s[r.name]=t[a].split(",").map(d=>d.trim()):s[r.name]=t[a])}),e.forEach(r=>{r.multiple&&r.type!=="positional"&&s[r.name]&&typeof s[r.name]=="string"&&(s[r.name]=s[r.name].split(",").map(a=>a.trim()))}),s}l.commands.forEach(e=>{let t=f.command(e.name).description(e.description);if(e.alias&&t.alias(e.alias),e.operations&&e.operations.length>0)if(e.operations.forEach(n=>{let i=t.command(n.name).description(n.description);n.alias&&(Array.isArray(n.alias)?n.alias:[n.alias]).forEach(o=>i.alias(o)),m(i,n.arguments),i.action(async(...s)=>{let o=s.pop(),r=s;n.arguments&&!g(n.arguments,c(n.arguments,r,o))||await $(e.name,n.name,r,c(n.arguments||[],r,o),n.message)}),i.command("help").description("Show help for this operation").action(()=>{U(e,n)})}),e.default){let n=e.operations?.find(i=>i.name===e.default);if(n){m(t,e.arguments),m(t,n.arguments);let i=[...e.arguments||[],...n.arguments||[]];t.action(async(...s)=>{let o=s.pop(),r=s;i.length>0&&!g(i,c(i,r,o))||await $(e.name,n.name,r,c(i,r,o),e.message||n.message)})}}else t.action(()=>{w(e)});else m(t,e.arguments),t.action(async(...n)=>{let i=n.pop(),s=n;e.arguments&&!g(e.arguments,c(e.arguments,s,i))||await $(e.name,void 0,s,c(e.arguments||[],s,i),e.message)});t.command("help").description("Show help for this command").action(()=>{w(e)})});f.command("help").description("Show general help").action(()=>{A()});f.action(()=>{A()});f.parse();
@@ -0,0 +1 @@
1
+ var t="https://t3.storage.dev",e="https://iam.storageapi.dev";export{e as DEFAULT_IAM_ENDPOINT,t as DEFAULT_STORAGE_ENDPOINT};
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
- import{Command as E}from"commander";import{readFileSync as k,existsSync as q}from"fs";import{join as u,dirname as R}from"path";import{fileURLToPath as P}from"url";import*as C from"yaml";var b="2.4.0";process.on("unhandledRejection",e=>{(e===""||e===void 0)&&(console.error(`
1
+ import{Command as E}from"commander";import{readFileSync as k,existsSync as q}from"fs";import{join as p,dirname as R}from"path";import{fileURLToPath as P}from"url";import*as C from"yaml";var b="2.6.0";process.on("unhandledRejection",e=>{(e===""||e===void 0)&&(console.error(`
2
2
  Operation cancelled`),process.exit(1)),console.error(`
3
3
  Error:`,e instanceof Error?e.message:e),process.exit(1)});process.on("uncaughtException",e=>{console.error(`
4
- Error:`,e.message),process.exit(1)});var D=P(import.meta.url),p=R(D),V=u(p,"specs.yaml"),M=k(V,"utf8"),l=C.parse(M);function y(e,t){return(t?[u(p,"lib",e,`${t}.js`),u(p,"lib",e,t,"index.js")]:[u(p,"lib",`${e}.js`),u(p,"lib",e,"index.js")]).some(i=>q(i))}function A(e){let t;e.type==="positional"?t=` ${e.name}`:(t=` --${e.name}`,e.alias&&e.alias.length===1&&(t+=`, -${e.alias}`));let n=26,i=t.length>=n?t+" ":t.padEnd(n),s=e.description;return e.options&&(Array.isArray(e.options)&&typeof e.options[0]=="string"?s+=` (options: ${e.options.join(", ")})`:s+=` (options: ${e.options.map(o=>o.value).join(", ")})`),e.default&&(s+=` [default: ${e.default}]`),e.required&&(s+=" [required]"),e["required-when"]&&(s+=` [required when: ${e["required-when"]}]`),e.multiple&&(s+=" [multiple values: comma-separated]"),e.type==="positional"&&(s+=" [positional argument]"),e.examples&&e.examples.length>0&&(s+=` (examples: ${e.examples.join(", ")})`),`${i}${s}`}function w(e){if(console.log(`
4
+ Error:`,e.message),process.exit(1)});var D=P(import.meta.url),u=R(D),V=p(u,"specs.yaml"),M=k(V,"utf8"),l=C.parse(M);function y(e,t){return(t?[p(u,"lib",e,`${t}.js`),p(u,"lib",e,t,"index.js")]:[p(u,"lib",`${e}.js`),p(u,"lib",e,"index.js")]).some(i=>q(i))}function v(e){let t;e.type==="positional"?t=` ${e.name}`:(t=` --${e.name}`,e.alias&&e.alias.length===1&&(t+=`, -${e.alias}`));let n=26,i=t.length>=n?t+" ":t.padEnd(n),s=e.description;return e.options&&(Array.isArray(e.options)&&typeof e.options[0]=="string"?s+=` (options: ${e.options.join(", ")})`:s+=` (options: ${e.options.map(o=>o.value).join(", ")})`),e.default&&(s+=` [default: ${e.default}]`),e.required&&(s+=" [required]"),e["required-when"]&&(s+=` [required when: ${e["required-when"]}]`),e.multiple&&(s+=" [multiple values: comma-separated]"),e.type==="positional"&&(s+=" [positional argument]"),e.examples&&e.examples.length>0&&(s+=` (examples: ${e.examples.join(", ")})`),`${i}${s}`}function w(e){if(console.log(`
5
5
  ${l.name} ${e.name} - ${e.description}
6
- `),e.operations&&e.operations.length>0){let t=e.operations.filter(n=>y(e.name,n.name));t.length>0&&(console.log("Operations:"),t.forEach(n=>{let i=` ${n.name}`;if(n.alias){let o=Array.isArray(n.alias)?n.alias:[n.alias];i+=` (${o.join(", ")})`}let s=i.padEnd(24);console.log(`${s}${n.description}`)}),console.log())}e.arguments&&e.arguments.length>0&&(console.log("Arguments:"),e.arguments.forEach(t=>{console.log(A(t))}),console.log()),console.log(`Use "${l.name} ${e.name} <operation> help" for more information about an operation.`)}function U(e,t){console.log(`
6
+ `),e.operations&&e.operations.length>0){let t=e.operations.filter(n=>y(e.name,n.name));t.length>0&&(console.log("Operations:"),t.forEach(n=>{let i=` ${n.name}`;if(n.alias){let o=Array.isArray(n.alias)?n.alias:[n.alias];i+=` (${o.join(", ")})`}let s=i.padEnd(24);console.log(`${s}${n.description}`)}),console.log())}e.arguments&&e.arguments.length>0&&(console.log("Arguments:"),e.arguments.forEach(t=>{console.log(v(t))}),console.log()),console.log(`Use "${l.name} ${e.name} <operation> help" for more information about an operation.`)}function U(e,t){console.log(`
7
7
  ${l.name} ${e.name} ${t.name} - ${t.description}
8
- `),t.arguments&&t.arguments.length>0&&(console.log("Arguments:"),t.arguments.forEach(n=>{console.log(A(n))}),console.log())}function T(e){return y(e.name)?!0:e.operations?e.operations.some(t=>y(e.name,t.name)):!1}function v(){console.log(`Tigris CLI Version: ${b}
8
+ `),t.arguments&&t.arguments.length>0&&(console.log("Arguments:"),t.arguments.forEach(n=>{console.log(v(n))}),console.log())}function T(e){return y(e.name)?!0:e.operations?e.operations.some(t=>y(e.name,t.name)):!1}function A(){console.log(`Tigris CLI Version: ${b}
9
9
  `),console.log(`Usage: tigris [command] [options]
10
10
  `),console.log("Commands:"),l.commands.filter(T).forEach(t=>{let n=` ${t.name}`;t.alias&&(n+=` (${t.alias})`);let i=n.padEnd(24);console.log(`${i}${t.description}`)}),console.log(`
11
11
  Use "${l.name} <command> help" for more information about a command.`)}function m(e,t=[]){t.forEach(n=>{if(n.type==="positional"){let i=n.required?`<${n.name}>`:`[${n.name}]`;e.argument(i,n.description)}else{let s=n.alias&&n.alias.length===1?`-${n.alias}, --${n.name}`:`--${n.name}`;n.type==="flag"||(n.type==="boolean"?s+=" [value]":n.options?s+=" <value>":s+=n.required||n["required-when"]?" <value>":" [value]"),e.option(s,n.description,n.default)}})}function g(e,t){for(let n of e){if(n["required-when"]){let[i,s]=n["required-when"].split("="),o=h(t,i,e),r=h(t,n.name,e);if(o===s&&!r)return console.error(`--${n.name} is required when --${i} is ${s}`),!1}if(n.required&&!h(t,n.name,e))return console.error(`--${n.name} is required`),!1}return!0}function h(e,t,n){if(n){let s=n.find(o=>o.name===t);if(s&&s.alias){let o=s.alias.charAt(0).toUpperCase()+s.alias.slice(1);if(e[o]!==void 0)return e[o]}}let i=[t,t.replace(/-/g,""),t.replace(/-/g,"").toLowerCase(),t.charAt(0).toUpperCase(),_(t)];for(let s of i)if(e[s]!==void 0)return e[s]}function _(e){return e.replace(/-([a-z])/g,(t,n)=>n.toUpperCase())}async function H(e,t){let n=t?[`./lib/${e}/${t}.js`,`./lib/${e}/${t}/index.js`]:[`./lib/${e}.js`,`./lib/${e}/index.js`];for(let s of n){let o=await import(s).catch(()=>null);if(o)return{module:o,error:null}}return{module:null,error:`Command not found: ${t?`${e} ${t}`:e}`}}async function $(e,t,n=[],i={},s){if(s){let x=s.replace(/\\n/g,`
12
- `);console.log(x)}let{module:o,error:r}=await H(e,t);(r||!o)&&(console.error(r),process.exit(1));let a=t||e,d=o.default||o[a];typeof d!="function"&&(console.error(`Command not implemented: ${a}`),process.exit(1)),await d({...i,_positional:n})}var f=new E;f.name(l.name).description(l.description).version(l.version);function c(e,t,n){let i;"optsWithGlobals"in n&&typeof n.optsWithGlobals=="function"?i=n.optsWithGlobals():"opts"in n&&typeof n.opts=="function"?i=n.opts():i=n;let s={...i};return e.filter(r=>r.type==="positional").forEach((r,a)=>{t[a]!==void 0&&(r.multiple?s[r.name]=t[a].split(",").map(d=>d.trim()):s[r.name]=t[a])}),e.forEach(r=>{r.multiple&&r.type!=="positional"&&s[r.name]&&typeof s[r.name]=="string"&&(s[r.name]=s[r.name].split(",").map(a=>a.trim()))}),s}l.commands.forEach(e=>{let t=f.command(e.name).description(e.description);if(e.alias&&t.alias(e.alias),e.operations&&e.operations.length>0)if(e.operations.forEach(n=>{let i=t.command(n.name).description(n.description);n.alias&&(Array.isArray(n.alias)?n.alias:[n.alias]).forEach(o=>i.alias(o)),m(i,n.arguments),i.action(async(...s)=>{let o=s.pop(),r=s;n.arguments&&!g(n.arguments,c(n.arguments,r,o))||await $(e.name,n.name,r,c(n.arguments||[],r,o),n.message)}),i.command("help").description("Show help for this operation").action(()=>{U(e,n)})}),e.default){let n=e.operations?.find(i=>i.name===e.default);if(n){m(t,e.arguments),m(t,n.arguments);let i=[...e.arguments||[],...n.arguments||[]];t.action(async(...s)=>{let o=s.pop(),r=s;i.length>0&&!g(i,c(i,r,o))||await $(e.name,n.name,r,c(i,r,o),e.message||n.message)})}}else t.action(()=>{w(e)});else m(t,e.arguments),t.action(async(...n)=>{let i=n.pop(),s=n;e.arguments&&!g(e.arguments,c(e.arguments,s,i))||await $(e.name,void 0,s,c(e.arguments||[],s,i),e.message)});t.command("help").description("Show help for this command").action(()=>{w(e)})});f.command("help").description("Show general help").action(()=>{v()});f.action(()=>{v()});f.parse();
12
+ `);console.log(x)}let{module:o,error:r}=await H(e,t);(r||!o)&&(console.error(r),process.exit(1));let a=t||e,d=o.default||o[a];typeof d!="function"&&(console.error(`Command not implemented: ${a}`),process.exit(1)),await d({...i,_positional:n})}var f=new E;f.name(l.name).description(l.description).version(l.version);function c(e,t,n){let i;"optsWithGlobals"in n&&typeof n.optsWithGlobals=="function"?i=n.optsWithGlobals():"opts"in n&&typeof n.opts=="function"?i=n.opts():i=n;let s={...i};return e.filter(r=>r.type==="positional").forEach((r,a)=>{t[a]!==void 0&&(r.multiple?s[r.name]=t[a].split(",").map(d=>d.trim()):s[r.name]=t[a])}),e.forEach(r=>{r.multiple&&r.type!=="positional"&&s[r.name]&&typeof s[r.name]=="string"&&(s[r.name]=s[r.name].split(",").map(a=>a.trim()))}),s}l.commands.forEach(e=>{let t=f.command(e.name).description(e.description);if(e.alias&&t.alias(e.alias),e.operations&&e.operations.length>0)if(e.operations.forEach(n=>{let i=t.command(n.name).description(n.description);n.alias&&(Array.isArray(n.alias)?n.alias:[n.alias]).forEach(o=>i.alias(o)),m(i,n.arguments),i.action(async(...s)=>{let o=s.pop(),r=s;n.arguments&&!g(n.arguments,c(n.arguments,r,o))||await $(e.name,n.name,r,c(n.arguments||[],r,o),n.message)}),i.command("help").description("Show help for this operation").action(()=>{U(e,n)})}),e.default){let n=e.operations?.find(i=>i.name===e.default);if(n){m(t,e.arguments),m(t,n.arguments);let i=[...e.arguments||[],...n.arguments||[]];t.action(async(...s)=>{let o=s.pop(),r=s;i.length>0&&!g(i,c(i,r,o))||await $(e.name,n.name,r,c(i,r,o),e.message||n.message)})}}else t.action(()=>{w(e)});else m(t,e.arguments),t.action(async(...n)=>{let i=n.pop(),s=n;e.arguments&&!g(e.arguments,c(e.arguments,s,i))||await $(e.name,void 0,s,c(e.arguments||[],s,i),e.message)});t.command("help").description("Show help for this command").action(()=>{w(e)})});f.command("help").description("Show general help").action(()=>{A()});f.action(()=>{A()});f.parse();
@@ -1,3 +1,3 @@
1
- function u(t,e,n){for(let o of e)if(t[o]!==void 0)return t[o];return n}import{S3Client as Ne}from"@aws-sdk/client-s3";import{homedir as ee}from"os";import{join as N}from"path";import{readFileSync as te,writeFileSync as ne,existsSync as R,mkdirSync as oe}from"fs";import{chmod as ie}from"fs/promises";var k=N(ee(),".tigris"),m=N(k,"config.json");function re(){R(k)||oe(k,{recursive:!0,mode:448})}function g(){if(R(m))try{let t=te(m,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function h(t){re(),ne(m,JSON.stringify(t,null,2),{mode:384});try{await ie(m,384)}catch{}}async function w(t){let e=g();e.tokens=t,await h(e)}async function f(){return g().tokens||null}async function x(){let t=g();delete t.tokens,await h(t)}async function z(t){let e=g();e.organizations=t,await h(e)}function D(){return g().organizations||[]}function A(){return g().selectedOrganization||null}async function $(t){let e=g();e.loginMethod=t,await h(e)}function L(){return g().loginMethod||null}import T from"axios";import se from"open";function y(){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 K=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function C(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var v=class{config;baseUrl;constructor(){this.config=y(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await T.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 se(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await w(i),$("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,n){let i=0;for(;i<60;){i++;try{let c=(await T.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,s=Date.now()+(c.expires_in||3600)*1e3;return{accessToken:c.access_token,refreshToken:c.refresh_token,idToken:c.id_token,expiresAt:s}}catch(r){if(T.isAxiosError(r)&&r.response){let c=r.response.data?.error;if(c==="authorization_pending"){await this.sleep(n*1e3);continue}if(c==="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 f();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 f(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await T.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 w(r),r}catch{throw await x(),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 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)[K];if(!r)return;let c=r?.ns?.map(s=>typeof s=="object"&&s!==null?{id:s.id,name:s.name,displayName:s.name}:{id:s,name:s,displayName:s})||[];if(c.length===0)return;z(c)}catch{}}async getOrganizations(){return await this.getAccessToken(),D()}async logout(){await x()}async isAuthenticated(){return await f()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},S=null;function _(){return S||(S=new v),S}var $e=C(),Le=y();async function F(){return L()}import{assignBucketRoles as me,revokeAllBucketRoles as he}from"@tigrisdata/iam";import{readFileSync as ae,existsSync as ce}from"fs";import{join as j,dirname as de}from"path";import{fileURLToPath as le}from"url";import*as U from"yaml";var ge=le(import.meta.url),ue=de(ge),I=null;function fe(){let t=ue;for(let e=0;e<5;e++){let n=j(t,"specs.yaml");if(ce(n))return n;t=j(t,"..")}throw new Error("Could not find specs.yaml")}function pe(){if(!I){let t=fe(),e=ae(t,"utf8");I=U.parse(e)}return I}function q(t,e){let o=pe().commands.find(i=>i.name===t);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var V={success:"\u2714",failure:"\u2716",hint:"\u2192"};function G(){return process.stdout.isTTY===!0}function M(t){let e=q(t.command,t.operation);if(e)return e.messages}function O(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 B(t,e){if(!G())return;let n=M(t);n?.onStart&&console.log(O(n.onStart,e))}function b(t,e){if(!G())return;let n=M(t);n?.onSuccess&&console.log(`${V.success} ${O(n.onSuccess,e)}`)}function d(t,e,n){let o=M(t);o?.onFailure&&console.error(`${V.failure} ${O(o.onFailure,n)}`),e&&console.error(` ${e}`)}function H(t,e){return{command:t,operation:e}}var a=H("access-keys","assign"),J=["Editor","ReadOnly","NamespaceAdmin"];function Y(t){return t?Array.isArray(t)?t:[t]:[]}async function ye(t){B(a);let e=u(t,["id"]),n=u(t,["admin"]),o=u(t,["revokeRoles","revoke-roles"]),i=Y(u(t,["bucket","b"])),r=Y(u(t,["role","r"]));e||(d(a,"Access key ID is required"),process.exit(1)),n&&o&&(d(a,"Cannot use --admin and --revoke-roles together"),process.exit(1)),await F()!=="oauth"&&(d(a,`Bucket roles can only be managed when logged in via OAuth.
3
- Run "tigris login oauth" first.`),process.exit(1));let s=_();await s.isAuthenticated()||(d(a,'Not authenticated. Run "tigris login oauth" first.'),process.exit(1));let W=await s.getAccessToken(),Q=A(),X=C(),P={sessionToken:W,organizationId:Q??void 0,iamEndpoint:X.iamEndpoint};if(o){let{error:l}=await he(e,{config:P});l&&(d(a,l.message),process.exit(1)),b(a);return}let p;if(n)p=[{bucket:"*",role:"NamespaceAdmin"}];else{i.length===0&&(d(a,"At least one bucket name is required (or use --admin or --revoke-roles)"),process.exit(1)),r.length===0&&(d(a,"At least one role is required (or use --admin or --revoke-roles)"),process.exit(1));for(let l of r)J.includes(l)||(d(a,`Invalid role "${l}". Valid roles are: ${J.join(", ")}`),process.exit(1));r.length===1?p=i.map(l=>({bucket:l,role:r[0]})):r.length===i.length?p=i.map((l,Z)=>({bucket:l,role:r[Z]})):(d(a,`Number of roles (${r.length}) must be 1 or match number of buckets (${i.length})`),process.exit(1))}let{error:E}=await me(e,p,{config:P});E&&(d(a,E.message),process.exit(1)),b(a)}export{ye as default};
1
+ function p(n,e,t){for(let o of e)if(n[o]!==void 0)return n[o];return t}import{S3Client as je}from"@aws-sdk/client-s3";import{fromIni as We}from"@aws-sdk/credential-providers";import{homedir as te}from"os";import{join as b}from"path";import{readFileSync as oe,writeFileSync as ie,existsSync as K,mkdirSync as se}from"fs";import{loadSharedConfigFiles as ve}from"@smithy/shared-ini-file-loader";import{chmod as re}from"fs/promises";var f="https://t3.storage.dev",S="https://iam.storageapi.dev";var _=b(te(),".tigris"),h=b(_,"config.json");function ae(){K(_)||se(_,{recursive:!0,mode:448})}function g(){if(K(h))try{let n=oe(h,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function y(n){ae(),ie(h,JSON.stringify(n,null,2),{mode:384});try{await re(h,384)}catch{}}async function w(n){let e=g();e.tokens=n,await y(e)}async function u(){return g().tokens||null}async function I(){let n=g();delete n.tokens,await y(n)}async function z(n){let e=g();e.organizations=n,await y(e)}function L(){return g().organizations||[]}function k(){return g().selectedOrganization||null}async function G(n){let e=g();e.loginMethod=n,await y(e)}function F(){return g().loginMethod||null}import A from"axios";import ce from"open";function C(){let n=process.env.TIGRIS_ENV==="development",e=process.env.AUTH0_DOMAIN||n?"auth-dev.tigris.dev":"auth.tigris.dev",t=process.env.AUTH0_CLIENT_ID||n?"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF":"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",o=process.env.AUTH0_AUDIENCE||n?"https://tigris-api-dev":"https://tigris-os-api";return{domain:e,clientId:t,audience:o}}var U=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function T(){return process.env.TIGRIS_STORAGE_ENDPOINT||process.env.TIGRIS_IAM_ENDPOINT?{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||f,iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||S}:{endpoint:process.env.AWS_ENDPOINT_URL_S3||f,iamEndpoint:process.env.AWS_ENDPOINT_URL_IAM||S}}var v=class{config;baseUrl;constructor(){this.config=C(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await A.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 ce(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await w(i),G("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,t){let i=0;for(;i<60;){i++;try{let c=(await A.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,r=Date.now()+(c.expires_in||3600)*1e3;return{accessToken:c.access_token,refreshToken:c.refresh_token,idToken:c.id_token,expiresAt:r}}catch(s){if(A.isAxiosError(s)&&s.response){let c=s.response.data?.error;if(c==="authorization_pending"){await this.sleep(t*1e3);continue}if(c==="slow_down"){t+=5,await this.sleep(t*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 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 A.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,s={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 w(s),s}catch{throw await I(),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"),s=JSON.parse(o)[U];if(!s)return;let c=s?.ns?.map(r=>typeof r=="object"&&r!==null?{id:r.id,name:r.name,displayName:r.name}:{id:r,name:r,displayName:r})||[];if(c.length===0)return;z(c)}catch{}}async getOrganizations(){return await this.getAccessToken(),L()}async logout(){await I()}async isAuthenticated(){return await u()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},E=null;function x(){return E||(E=new v),E}var Je=T(),Qe=C();async function $(){return F()}import{assignBucketRoles as ye,revokeAllBucketRoles as Ce}from"@tigrisdata/iam";import{readFileSync as de,existsSync as le}from"fs";import{join as j,dirname as ge}from"path";import{fileURLToPath as pe}from"url";import*as V from"yaml";var fe=pe(import.meta.url),ue=ge(fe),O=null;function me(){let n=ue;for(let e=0;e<5;e++){let t=j(n,"specs.yaml");if(le(t))return t;n=j(n,"..")}throw new Error("Could not find specs.yaml")}function he(){if(!O){let n=me(),e=de(n,"utf8");O=V.parse(e)}return O}function W(n,e){let o=he().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 q(){return process.stdout.isTTY===!0}function P(n){let e=W(n.command,n.operation);if(e)return e.messages}function R(n,e){let t=n;return t=t.replace(/\\n/g,`
2
+ `),e&&(t=t.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let s=e[i];return s!==void 0?String(s):`{{${i}}}`})),t}function B(n,e){if(!q())return;let t=P(n);t?.onStart&&console.log(R(t.onStart,e))}function N(n,e){if(!q())return;let t=P(n);t?.onSuccess&&console.log(`${Y.success} ${R(t.onSuccess,e)}`)}function d(n,e,t){let o=P(n);o?.onFailure&&console.error(`${Y.failure} ${R(o.onFailure,t)}`),e&&console.error(` ${e}`)}function H(n,e){return{command:n,operation:e}}var a=H("access-keys","assign"),J=["Editor","ReadOnly","NamespaceAdmin"];function Q(n){return n?Array.isArray(n)?n:[n]:[]}async function Te(n){B(a);let e=p(n,["id"]),t=p(n,["admin"]),o=p(n,["revokeRoles","revoke-roles"]),i=Q(p(n,["bucket","b"])),s=Q(p(n,["role","r"]));e||(d(a,"Access key ID is required"),process.exit(1)),t&&o&&(d(a,"Cannot use --admin and --revoke-roles together"),process.exit(1)),await $()!=="oauth"&&(d(a,`Bucket roles can only be managed when logged in via OAuth.
3
+ Run "tigris login oauth" first.`),process.exit(1));let r=x();await r.isAuthenticated()||(d(a,'Not authenticated. Run "tigris login oauth" first.'),process.exit(1));let X=await r.getAccessToken(),Z=k(),ee=T(),M={sessionToken:X,organizationId:Z??void 0,iamEndpoint:ee.iamEndpoint};if(o){let{error:l}=await Ce(e,{config:M});l&&(d(a,l.message),process.exit(1)),N(a);return}let m;if(t)m=[{bucket:"*",role:"NamespaceAdmin"}];else{i.length===0&&(d(a,"At least one bucket name is required (or use --admin or --revoke-roles)"),process.exit(1)),s.length===0&&(d(a,"At least one role is required (or use --admin or --revoke-roles)"),process.exit(1));for(let l of s)J.includes(l)||(d(a,`Invalid role "${l}". Valid roles are: ${J.join(", ")}`),process.exit(1));s.length===1?m=i.map(l=>({bucket:l,role:s[0]})):s.length===i.length?m=i.map((l,ne)=>({bucket:l,role:s[ne]})):(d(a,`Number of roles (${s.length}) must be 1 or match number of buckets (${i.length})`),process.exit(1))}let{error:D}=await ye(e,m,{config:M});D&&(d(a,D.message),process.exit(1)),N(a)}export{Te as default};
@@ -1,3 +1,3 @@
1
- function O(t,e,n){for(let o of e)if(t[o]!==void 0)return t[o];return n}import{S3Client as Se}from"@aws-sdk/client-s3";import{homedir as H}from"os";import{join as P}from"path";import{readFileSync as B,writeFileSync as J,existsSync as E,mkdirSync as Y}from"fs";import{chmod as W}from"fs/promises";var C=P(H(),".tigris"),u=P(C,"config.json");function Q(){E(C)||Y(C,{recursive:!0,mode:448})}function c(){if(E(u))try{let t=B(u,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function f(t){Q(),J(u,JSON.stringify(t,null,2),{mode:384});try{await W(u,384)}catch{}}async function T(t){let e=c();e.tokens=t,await f(e)}async function d(){return c().tokens||null}async function w(){let t=c();delete t.tokens,await f(t)}async function b(t){let e=c();e.organizations=t,await f(e)}function N(){return c().organizations||[]}function k(){return c().selectedOrganization||null}async function z(t){let e=c();e.loginMethod=t,await f(e)}function D(){return c().loginMethod||null}import h 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 R=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function m(){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=p(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await h.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 T(i),z("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,n){let i=0;for(;i<60;){i++;try{let s=(await h.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(h.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 h.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 T(r),r}catch{throw await w(),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)[R];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;b(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),N()}async logout(){await w()}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},A=null;function x(){return A||(A=new S),A}var Ie=m(),Me=p();async function K(){return D()}import{createAccessKey as ae}from"@tigrisdata/iam";import{readFileSync as Z,existsSync as ee}from"fs";import{join as L,dirname as te}from"path";import{fileURLToPath as ne}from"url";import*as $ from"yaml";var oe=ne(import.meta.url),ie=te(oe),v=null;function re(){let t=ie;for(let e=0;e<5;e++){let n=L(t,"specs.yaml");if(ee(n))return n;t=L(t,"..")}throw new Error("Could not find specs.yaml")}function se(){if(!v){let t=re(),e=Z(t,"utf8");v=$.parse(e)}return v}function F(t,e){let o=se().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 _(t){let e=F(t.command,t.operation);if(e)return e.messages}function I(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 G(t,e){if(!U())return;let n=_(t);n?.onStart&&console.log(I(n.onStart,e))}function V(t,e){if(!U())return;let n=_(t);n?.onSuccess&&console.log(`${j.success} ${I(n.onSuccess,e)}`)}function l(t,e,n){let o=_(t);o?.onFailure&&console.error(`${j.failure} ${I(o.onFailure,n)}`),e&&console.error(` ${e}`)}function q(t,e){return{command:t,operation:e}}var g=q("access-keys","create");async function ce(t){G(g);let e=O(t,["name"]);e||(l(g,"Access key name is required"),process.exit(1)),await K()!=="oauth"&&(l(g,`Access keys can only be created when logged in via OAuth.
3
- Run "tigris login oauth" first.`),process.exit(1));let o=x();await o.isAuthenticated()||(l(g,'Not authenticated. Run "tigris login oauth" first.'),process.exit(1));let r=await o.getAccessToken(),s=k(),a=m(),{data:y,error:M}=await ae(e,{config:{sessionToken:r,organizationId:s??void 0,iamEndpoint:a.iamEndpoint}});M&&(l(g,M.message),process.exit(1)),console.log(` Name: ${y.name}`),console.log(` Access Key ID: ${y.id}`),console.log(` Secret Access Key: ${y.secret}`),console.log(""),console.log(" Save these credentials securely. The secret will not be shown again."),V(g)}export{ce as default};
1
+ function N(n,e,t){for(let o of e)if(n[o]!==void 0)return n[o];return t}import{S3Client as Ke}from"@aws-sdk/client-s3";import{fromIni as Re}from"@aws-sdk/credential-providers";import{homedir as H}from"os";import{join as M}from"path";import{readFileSync as J,writeFileSync as B,existsSync as K,mkdirSync as Q}from"fs";import{loadSharedConfigFiles as ye}from"@smithy/shared-ini-file-loader";import{chmod as X}from"fs/promises";var l="https://t3.storage.dev",T="https://iam.storageapi.dev";var A=M(H(),".tigris"),f=M(A,"config.json");function Z(){K(A)||Q(A,{recursive:!0,mode:448})}function c(){if(K(f))try{let n=J(f,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function u(n){Z(),B(f,JSON.stringify(n,null,2),{mode:384});try{await X(f,384)}catch{}}async function S(n){let e=c();e.tokens=n,await u(e)}async function g(){return c().tokens||null}async function _(){let n=c();delete n.tokens,await u(n)}async function D(n){let e=c();e.organizations=n,await u(e)}function R(){return c().organizations||[]}function w(){return c().selectedOrganization||null}async function b(n){let e=c();e.loginMethod=n,await u(e)}function z(){return c().loginMethod||null}import y from"axios";import ee from"open";function m(){let n=process.env.TIGRIS_ENV==="development",e=process.env.AUTH0_DOMAIN||n?"auth-dev.tigris.dev":"auth.tigris.dev",t=process.env.AUTH0_CLIENT_ID||n?"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF":"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",o=process.env.AUTH0_AUDIENCE||n?"https://tigris-api-dev":"https://tigris-os-api";return{domain:e,clientId:t,audience:o}}var L=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function h(){return process.env.TIGRIS_STORAGE_ENDPOINT||process.env.TIGRIS_IAM_ENDPOINT?{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||l,iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||T}:{endpoint:process.env.AWS_ENDPOINT_URL_S3||l,iamEndpoint:process.env.AWS_ENDPOINT_URL_IAM||T}}var E=class{config;baseUrl;constructor(){this.config=m(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await y.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 ee(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await S(i),b("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,t){let i=0;for(;i<60;){i++;try{let r=(await y.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(y.isAxiosError(s)&&s.response){let r=s.response.data?.error;if(r==="authorization_pending"){await this.sleep(t*1e3);continue}if(r==="slow_down"){t+=5,await this.sleep(t*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 g();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 g(),!t)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await y.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,s={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 S(s),s}catch{throw await _(),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 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"),s=JSON.parse(o)[L];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(),R()}async logout(){await _()}async isAuthenticated(){return await g()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},I=null;function k(){return I||(I=new E),I}var Fe=h(),Ue=m();async function G(){return z()}import{createAccessKey as de}from"@tigrisdata/iam";import{readFileSync as ne,existsSync as te}from"fs";import{join as F,dirname as oe}from"path";import{fileURLToPath as ie}from"url";import*as U from"yaml";var se=ie(import.meta.url),re=oe(se),v=null;function ae(){let n=re;for(let e=0;e<5;e++){let t=F(n,"specs.yaml");if(te(t))return t;n=F(n,"..")}throw new Error("Could not find specs.yaml")}function ce(){if(!v){let n=ae(),e=ne(n,"utf8");v=U.parse(e)}return v}function $(n,e){let o=ce().commands.find(i=>i.name===n);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var j={success:"\u2714",failure:"\u2716",hint:"\u2192"};function W(){return process.stdout.isTTY===!0}function x(n){let e=$(n.command,n.operation);if(e)return e.messages}function O(n,e){let t=n;return t=t.replace(/\\n/g,`
2
+ `),e&&(t=t.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let s=e[i];return s!==void 0?String(s):`{{${i}}}`})),t}function Y(n,e){if(!W())return;let t=x(n);t?.onStart&&console.log(O(t.onStart,e))}function V(n,e){if(!W())return;let t=x(n);t?.onSuccess&&console.log(`${j.success} ${O(t.onSuccess,e)}`)}function p(n,e,t){let o=x(n);o?.onFailure&&console.error(`${j.failure} ${O(o.onFailure,t)}`),e&&console.error(` ${e}`)}function q(n,e){return{command:n,operation:e}}var d=q("access-keys","create");async function le(n){Y(d);let e=N(n,["name"]);e||(p(d,"Access key name is required"),process.exit(1)),await G()!=="oauth"&&(p(d,`Access keys can only be created when logged in via OAuth.
3
+ Run "tigris login oauth" first.`),process.exit(1));let o=k();await o.isAuthenticated()||(p(d,'Not authenticated. Run "tigris login oauth" first.'),process.exit(1));let s=await o.getAccessToken(),r=w(),a=h(),{data:C,error:P}=await de(e,{config:{sessionToken:s,organizationId:r??void 0,iamEndpoint:a.iamEndpoint}});P&&(p(d,P.message),process.exit(1)),console.log(` Name: ${C.name}`),console.log(` Access Key ID: ${C.id}`),console.log(` Secret Access Key: ${C.secret}`),console.log(""),console.log(" Save these credentials securely. The secret will not be shown again."),V(d)}export{le as default};
@@ -1,3 +1,3 @@
1
- function M(t,e,n){for(let o of e)if(t[o]!==void 0)return t[o];return n}import{S3Client as xe}from"@aws-sdk/client-s3";import{homedir as q}from"os";import{join as O}from"path";import{readFileSync as H,writeFileSync as B,existsSync as P,mkdirSync as J}from"fs";import{chmod as Y}from"fs/promises";var y=O(q(),".tigris"),u=O(y,"config.json");function W(){P(y)||J(y,{recursive:!0,mode:448})}function c(){if(P(u))try{let t=H(u,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function f(t){W(),B(u,JSON.stringify(t,null,2),{mode:384});try{await Y(u,384)}catch{}}async function C(t){let e=c();e.tokens=t,await f(e)}async function g(){return c().tokens||null}async function T(){let t=c();delete t.tokens,await f(t)}async function E(t){let e=c();e.organizations=t,await f(e)}function b(){return c().organizations||[]}function w(){return c().selectedOrganization||null}async function N(t){let e=c();e.loginMethod=t,await f(e)}function z(){return c().loginMethod||null}import h from"axios";import Q 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 D=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function m(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var x=class{config;baseUrl;constructor(){this.config=p(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await h.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 Q(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await C(i),N("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,n){let i=0;for(;i<60;){i++;try{let s=(await h.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(h.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 h.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 C(r),r}catch{throw await T(),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)[D];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;E(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),b()}async logout(){await T()}async isAuthenticated(){return await g()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},k=null;function A(){return k||(k=new x),k}var _e=m(),Ie=p();async function R(){return z()}import{removeAccessKey as se}from"@tigrisdata/iam";import{readFileSync as X,existsSync as Z}from"fs";import{join as K,dirname as ee}from"path";import{fileURLToPath as te}from"url";import*as L from"yaml";var ne=te(import.meta.url),oe=ee(ne),S=null;function ie(){let t=oe;for(let e=0;e<5;e++){let n=K(t,"specs.yaml");if(Z(n))return n;t=K(t,"..")}throw new Error("Could not find specs.yaml")}function re(){if(!S){let t=ie(),e=X(t,"utf8");S=L.parse(e)}return S}function $(t,e){let o=re().commands.find(i=>i.name===t);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var F={success:"\u2714",failure:"\u2716",hint:"\u2192"};function j(){return process.stdout.isTTY===!0}function v(t){let e=$(t.command,t.operation);if(e)return e.messages}function _(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 U(t,e){if(!j())return;let n=v(t);n?.onStart&&console.log(_(n.onStart,e))}function G(t,e){if(!j())return;let n=v(t);n?.onSuccess&&console.log(`${F.success} ${_(n.onSuccess,e)}`)}function l(t,e,n){let o=v(t);o?.onFailure&&console.error(`${F.failure} ${_(o.onFailure,n)}`),e&&console.error(` ${e}`)}function V(t,e){return{command:t,operation:e}}var d=V("access-keys","delete");async function ae(t){U(d);let e=M(t,["id"]);e||(l(d,"Access key ID is required"),process.exit(1)),await R()!=="oauth"&&(l(d,`Access keys can only be deleted when logged in via OAuth.
3
- Run "tigris login oauth" first.`),process.exit(1));let o=A();await o.isAuthenticated()||(l(d,'Not authenticated. Run "tigris login oauth" first.'),process.exit(1));let r=await o.getAccessToken(),s=w(),a=m(),{error:I}=await se(e,{config:{sessionToken:r,organizationId:s??void 0,iamEndpoint:a.iamEndpoint}});I&&(l(d,I.message),process.exit(1)),G(d)}export{ae as default};
1
+ function P(n,e,t){for(let o of e)if(n[o]!==void 0)return n[o];return t}import{S3Client as Me}from"@aws-sdk/client-s3";import{fromIni as Re}from"@aws-sdk/credential-providers";import{homedir as q}from"os";import{join as N}from"path";import{readFileSync as H,writeFileSync as J,existsSync as M,mkdirSync as B}from"fs";import{loadSharedConfigFiles as he}from"@smithy/shared-ini-file-loader";import{chmod as Q}from"fs/promises";var g="https://t3.storage.dev",y="https://iam.storageapi.dev";var T=N(q(),".tigris"),f=N(T,"config.json");function X(){M(T)||B(T,{recursive:!0,mode:448})}function c(){if(M(f))try{let n=H(f,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function u(n){X(),J(f,JSON.stringify(n,null,2),{mode:384});try{await Q(f,384)}catch{}}async function A(n){let e=c();e.tokens=n,await u(e)}async function l(){return c().tokens||null}async function S(){let n=c();delete n.tokens,await u(n)}async function D(n){let e=c();e.organizations=n,await u(e)}function R(){return c().organizations||[]}function _(){return c().selectedOrganization||null}async function K(n){let e=c();e.loginMethod=n,await u(e)}function b(){return c().loginMethod||null}import C from"axios";import Z from"open";function m(){let n=process.env.TIGRIS_ENV==="development",e=process.env.AUTH0_DOMAIN||n?"auth-dev.tigris.dev":"auth.tigris.dev",t=process.env.AUTH0_CLIENT_ID||n?"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF":"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",o=process.env.AUTH0_AUDIENCE||n?"https://tigris-api-dev":"https://tigris-os-api";return{domain:e,clientId:t,audience:o}}var z=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function h(){return process.env.TIGRIS_STORAGE_ENDPOINT||process.env.TIGRIS_IAM_ENDPOINT?{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||g,iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||y}:{endpoint:process.env.AWS_ENDPOINT_URL_S3||g,iamEndpoint:process.env.AWS_ENDPOINT_URL_IAM||y}}var I=class{config;baseUrl;constructor(){this.config=m(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await C.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 A(i),K("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,t){let i=0;for(;i<60;){i++;try{let r=(await C.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(C.isAxiosError(s)&&s.response){let r=s.response.data?.error;if(r==="authorization_pending"){await this.sleep(t*1e3);continue}if(r==="slow_down"){t+=5,await this.sleep(t*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 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 i=(await C.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,s={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 A(s),s}catch{throw await S(),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"),s=JSON.parse(o)[z];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(),R()}async logout(){await S()}async isAuthenticated(){return await l()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},w=null;function E(){return w||(w=new I),w}var Ge=h(),Fe=m();async function L(){return b()}import{removeAccessKey as ce}from"@tigrisdata/iam";import{readFileSync as ee,existsSync as ne}from"fs";import{join as G,dirname as te}from"path";import{fileURLToPath as oe}from"url";import*as F from"yaml";var ie=oe(import.meta.url),se=te(ie),k=null;function re(){let n=se;for(let e=0;e<5;e++){let t=G(n,"specs.yaml");if(ne(t))return t;n=G(n,"..")}throw new Error("Could not find specs.yaml")}function ae(){if(!k){let n=re(),e=ee(n,"utf8");k=F.parse(e)}return k}function U(n,e){let o=ae().commands.find(i=>i.name===n);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var $={success:"\u2714",failure:"\u2716",hint:"\u2192"};function j(){return process.stdout.isTTY===!0}function v(n){let e=U(n.command,n.operation);if(e)return e.messages}function x(n,e){let t=n;return t=t.replace(/\\n/g,`
2
+ `),e&&(t=t.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let s=e[i];return s!==void 0?String(s):`{{${i}}}`})),t}function W(n,e){if(!j())return;let t=v(n);t?.onStart&&console.log(x(t.onStart,e))}function Y(n,e){if(!j())return;let t=v(n);t?.onSuccess&&console.log(`${$.success} ${x(t.onSuccess,e)}`)}function p(n,e,t){let o=v(n);o?.onFailure&&console.error(`${$.failure} ${x(o.onFailure,t)}`),e&&console.error(` ${e}`)}function V(n,e){return{command:n,operation:e}}var d=V("access-keys","delete");async function de(n){W(d);let e=P(n,["id"]);e||(p(d,"Access key ID is required"),process.exit(1)),await L()!=="oauth"&&(p(d,`Access keys can only be deleted when logged in via OAuth.
3
+ Run "tigris login oauth" first.`),process.exit(1));let o=E();await o.isAuthenticated()||(p(d,'Not authenticated. Run "tigris login oauth" first.'),process.exit(1));let s=await o.getAccessToken(),r=_(),a=h(),{error:O}=await ce(e,{config:{sessionToken:s,organizationId:r??void 0,iamEndpoint:a.iamEndpoint}});O&&(p(d,O.message),process.exit(1)),Y(d)}export{de as default};
@@ -1,3 +1,3 @@
1
- function P(t,e,n){for(let o of e)if(t[o]!==void 0)return t[o];return n}import{S3Client as Se}from"@aws-sdk/client-s3";import{homedir as B}from"os";import{join as E}from"path";import{readFileSync as J,writeFileSync as Y,existsSync as b,mkdirSync as W}from"fs";import{chmod as Q}from"fs/promises";var C=E(B(),".tigris"),f=E(C,"config.json");function X(){b(C)||W(C,{recursive:!0,mode:448})}function g(){if(b(f))try{let t=J(f,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function p(t){X(),Y(f,JSON.stringify(t,null,2),{mode:384});try{await Q(f,384)}catch{}}async function T(t){let e=g();e.tokens=t,await p(e)}async function l(){return g().tokens||null}async function w(){let t=g();delete t.tokens,await p(t)}async function N(t){let e=g();e.organizations=t,await p(e)}function z(){return g().organizations||[]}function k(){return g().selectedOrganization||null}async function D(t){let e=g();e.loginMethod=t,await p(e)}function R(){return g().loginMethod||null}import y from"axios";import Z from"open";function m(){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 $=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function h(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var A=class{config;baseUrl;constructor(){this.config=m(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await y.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 T(i),D("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,n){let i=0;for(;i<60;){i++;try{let s=(await y.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(y.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 l();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 l(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await y.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 T(r),r}catch{throw await w(),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 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)[$];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;N(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),z()}async logout(){await w()}async isAuthenticated(){return await l()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},x=null;function S(){return x||(x=new A),x}var Me=h(),Oe=m();async function K(){return R()}import{getAccessKey as ce}from"@tigrisdata/iam";import{readFileSync as ee,existsSync as te}from"fs";import{join as L,dirname as ne}from"path";import{fileURLToPath as oe}from"url";import*as F from"yaml";var ie=oe(import.meta.url),re=ne(ie),v=null;function se(){let t=re;for(let e=0;e<5;e++){let n=L(t,"specs.yaml");if(te(n))return n;t=L(t,"..")}throw new Error("Could not find specs.yaml")}function ae(){if(!v){let t=se(),e=ee(t,"utf8");v=F.parse(e)}return v}function j(t,e){let o=ae().commands.find(i=>i.name===t);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var U={success:"\u2714",failure:"\u2716",hint:"\u2192"};function G(){return process.stdout.isTTY===!0}function _(t){let e=j(t.command,t.operation);if(e)return e.messages}function I(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(!G())return;let n=_(t);n?.onStart&&console.log(I(n.onStart,e))}function q(t,e){if(!G())return;let n=_(t);n?.onSuccess&&console.log(`${U.success} ${I(n.onSuccess,e)}`)}function u(t,e,n){let o=_(t);o?.onFailure&&console.error(`${U.failure} ${I(o.onFailure,n)}`),e&&console.error(` ${e}`)}function H(t,e){return{command:t,operation:e}}var d=H("access-keys","get");async function ge(t){V(d);let e=P(t,["id"]);e||(u(d,"Access key ID is required"),process.exit(1)),await K()!=="oauth"&&(u(d,`Access keys can only be retrieved when logged in via OAuth.
3
- Run "tigris login oauth" first.`),process.exit(1));let o=S();await o.isAuthenticated()||(u(d,'Not authenticated. Run "tigris login oauth" first.'),process.exit(1));let r=await o.getAccessToken(),s=k(),a=h(),{data:c,error:M}=await ce(e,{config:{sessionToken:r,organizationId:s??void 0,iamEndpoint:a.iamEndpoint}});if(M&&(u(d,M.message),process.exit(1)),console.log(` Name: ${c.name}`),console.log(` ID: ${c.id}`),console.log(` Status: ${c.status}`),console.log(` Created: ${c.createdAt}`),console.log(` Organization: ${c.organizationId}`),c.roles&&c.roles.length>0){console.log(" Roles:");for(let O of c.roles)console.log(` - ${O.bucket}: ${O.role}`)}else console.log(" Roles: None");q(d)}export{ge as default};
1
+ function M(n,e,t){for(let o of e)if(n[o]!==void 0)return n[o];return t}import{S3Client as De}from"@aws-sdk/client-s3";import{fromIni as be}from"@aws-sdk/credential-providers";import{homedir as J}from"os";import{join as R}from"path";import{readFileSync as B,writeFileSync as Q,existsSync as D,mkdirSync as X}from"fs";import{loadSharedConfigFiles as ye}from"@smithy/shared-ini-file-loader";import{chmod as Z}from"fs/promises";var g="https://t3.storage.dev",T="https://iam.storageapi.dev";var A=R(J(),".tigris"),u=R(A,"config.json");function ee(){D(A)||X(A,{recursive:!0,mode:448})}function d(){if(D(u))try{let n=B(u,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function m(n){ee(),Q(u,JSON.stringify(n,null,2),{mode:384});try{await Z(u,384)}catch{}}async function S(n){let e=d();e.tokens=n,await m(e)}async function p(){return d().tokens||null}async function _(){let n=d();delete n.tokens,await m(n)}async function K(n){let e=d();e.organizations=n,await m(e)}function b(){return d().organizations||[]}function w(){return d().selectedOrganization||null}async function z(n){let e=d();e.loginMethod=n,await m(e)}function L(){return d().loginMethod||null}import y from"axios";import ne from"open";function h(){let n=process.env.TIGRIS_ENV==="development",e=process.env.AUTH0_DOMAIN||n?"auth-dev.tigris.dev":"auth.tigris.dev",t=process.env.AUTH0_CLIENT_ID||n?"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF":"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",o=process.env.AUTH0_AUDIENCE||n?"https://tigris-api-dev":"https://tigris-os-api";return{domain:e,clientId:t,audience:o}}var G=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function C(){return process.env.TIGRIS_STORAGE_ENDPOINT||process.env.TIGRIS_IAM_ENDPOINT?{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||g,iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||T}:{endpoint:process.env.AWS_ENDPOINT_URL_S3||g,iamEndpoint:process.env.AWS_ENDPOINT_URL_IAM||T}}var E=class{config;baseUrl;constructor(){this.config=h(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await y.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 ne(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await S(i),z("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,t){let i=0;for(;i<60;){i++;try{let r=(await y.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(y.isAxiosError(s)&&s.response){let r=s.response.data?.error;if(r==="authorization_pending"){await this.sleep(t*1e3);continue}if(r==="slow_down"){t+=5,await this.sleep(t*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 p();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 p(),!t)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await y.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,s={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 S(s),s}catch{throw await _(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await p();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"),s=JSON.parse(o)[G];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;K(r)}catch{}}async getOrganizations(){return await this.getAccessToken(),b()}async logout(){await _()}async isAuthenticated(){return await p()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},I=null;function k(){return I||(I=new E),I}var $e=C(),Ue=h();async function F(){return L()}import{getAccessKey as le}from"@tigrisdata/iam";import{readFileSync as te,existsSync as oe}from"fs";import{join as $,dirname as ie}from"path";import{fileURLToPath as se}from"url";import*as U from"yaml";var re=se(import.meta.url),ae=ie(re),v=null;function ce(){let n=ae;for(let e=0;e<5;e++){let t=$(n,"specs.yaml");if(oe(t))return t;n=$(n,"..")}throw new Error("Could not find specs.yaml")}function de(){if(!v){let n=ce(),e=te(n,"utf8");v=U.parse(e)}return v}function j(n,e){let o=de().commands.find(i=>i.name===n);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var W={success:"\u2714",failure:"\u2716",hint:"\u2192"};function Y(){return process.stdout.isTTY===!0}function x(n){let e=j(n.command,n.operation);if(e)return e.messages}function O(n,e){let t=n;return t=t.replace(/\\n/g,`
2
+ `),e&&(t=t.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let s=e[i];return s!==void 0?String(s):`{{${i}}}`})),t}function V(n,e){if(!Y())return;let t=x(n);t?.onStart&&console.log(O(t.onStart,e))}function q(n,e){if(!Y())return;let t=x(n);t?.onSuccess&&console.log(`${W.success} ${O(t.onSuccess,e)}`)}function f(n,e,t){let o=x(n);o?.onFailure&&console.error(`${W.failure} ${O(o.onFailure,t)}`),e&&console.error(` ${e}`)}function H(n,e){return{command:n,operation:e}}var l=H("access-keys","get");async function ge(n){V(l);let e=M(n,["id"]);e||(f(l,"Access key ID is required"),process.exit(1)),await F()!=="oauth"&&(f(l,`Access keys can only be retrieved when logged in via OAuth.
3
+ Run "tigris login oauth" first.`),process.exit(1));let o=k();await o.isAuthenticated()||(f(l,'Not authenticated. Run "tigris login oauth" first.'),process.exit(1));let s=await o.getAccessToken(),r=w(),a=C(),{data:c,error:P}=await le(e,{config:{sessionToken:s,organizationId:r??void 0,iamEndpoint:a.iamEndpoint}});if(P&&(f(l,P.message),process.exit(1)),console.log(` Name: ${c.name}`),console.log(` ID: ${c.id}`),console.log(` Status: ${c.status}`),console.log(` Created: ${c.createdAt}`),console.log(` Organization: ${c.organizationId}`),c.roles&&c.roles.length>0){console.log(" Roles:");for(let N of c.roles)console.log(` - ${N.bucket}: ${N.role}`)}else console.log(" Roles: None");q(l)}export{ge as default};
@@ -1,8 +1,8 @@
1
- function Q(t){return JSON.stringify(t,null,2)}function Z(t,e=" "){return Object.entries(t).map(([n,i])=>`${e}<${n}>${i}</${n}>`).join(`
2
- `)}function ee(t,e,n){let i=[`<${e}>`];return t.forEach(o=>{i.push(` <${n}>`),i.push(Z(o," ")),i.push(` </${n}>`)}),i.push(`</${e}>`),i.join(`
3
- `)}function z(t){if(t==null)return"";if(t instanceof Date)return N(t);if(typeof t=="string"){let e=new Date(t);if(!isNaN(e.getTime())&&t.includes("T"))return N(e)}return String(t)}function N(t){return new Intl.DateTimeFormat(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(t)}function te(t,e){return e.map(n=>{if(n.width)return n.width;let i=n.header.length,o=t.reduce((r,s)=>{let a=z(s[n.key]);return Math.max(r,a.length)},0);return Math.max(i,o)})}function ne(t,e){let n=[],i=te(t,e),o="\u250C"+i.map(c=>"\u2500".repeat(c+2)).join("\u252C")+"\u2510",r="\u251C"+i.map(c=>"\u2500".repeat(c+2)).join("\u253C")+"\u2524",s="\u2514"+i.map(c=>"\u2500".repeat(c+2)).join("\u2534")+"\u2518";n.push(`
4
- `+o);let a="\u2502 "+e.map((c,l)=>c.header.padEnd(i[l])).join(" \u2502 ")+" \u2502";return n.push(a),n.push(r),t.forEach(c=>{let l=e.map((g,b)=>{let E=z(c[g.key]);return g.align==="right"?E.padStart(i[b]):E.padEnd(i[b])});n.push("\u2502 "+l.join(" \u2502 ")+" \u2502")}),n.push(s+`
5
- `),n.join(`
6
- `)}function D(t,e,n,i,o){switch(e){case"json":return Q(t);case"xml":return ee(t,n,i);default:return ne(t,o)}}import{S3Client as ze}from"@aws-sdk/client-s3";import{homedir as ie}from"os";import{join as R}from"path";import{readFileSync as oe,writeFileSync as re,existsSync as j,mkdirSync as se}from"fs";import{chmod as ae}from"fs/promises";var x=R(ie(),".tigris"),f=R(x,"config.json");function ce(){j(x)||se(x,{recursive:!0,mode:448})}function d(){if(j(f))try{let t=oe(f,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function m(t){ce(),re(f,JSON.stringify(t,null,2),{mode:384});try{await ae(f,384)}catch{}}async function S(t){let e=d();e.tokens=t,await m(e)}async function p(){return d().tokens||null}async function A(){let t=d();delete t.tokens,await m(t)}async function $(t){let e=d();e.organizations=t,await m(e)}function K(){return d().organizations||[]}function _(){return d().selectedOrganization||null}async function L(t){let e=d();e.loginMethod=t,await m(e)}function F(){return d().loginMethod||null}import C from"axios";import de 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 U=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function y(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var I=class{config;baseUrl;constructor(){this.config=h(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(await C.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 de(i.verification_uri_complete)}catch{}e?.onWaiting?.();let o=await this.pollForToken(i.device_code,i.interval||5);await S(o),L("oauth"),await this.extractAndStoreOrganizations(o.idToken)}async pollForToken(e,n){let o=0;for(;o<60;){o++;try{let s=(await C.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(C.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 p();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 p(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let o=(await C.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:o.access_token,refreshToken:o.refresh_token||n.refreshToken,idToken:o.id_token||n.idToken,expiresAt:Date.now()+(o.expires_in||3600)*1e3};return await S(r),r}catch{throw await A(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await p();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"),r=JSON.parse(i)[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;$(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),K()}async logout(){await A()}async isAuthenticated(){return await p()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},v=null;function M(){return v||(v=new I),v}var $e=y(),Ke=h();async function V(){return F()}import{listAccessKeys as Ce}from"@tigrisdata/iam";import{readFileSync as ge,existsSync as ue}from"fs";import{join as G,dirname as le}from"path";import{fileURLToPath as pe}from"url";import*as q from"yaml";var fe=pe(import.meta.url),me=le(fe),O=null;function he(){let t=me;for(let e=0;e<5;e++){let n=G(t,"specs.yaml");if(ue(n))return n;t=G(t,"..")}throw new Error("Could not find specs.yaml")}function ye(){if(!O){let t=he(),e=ge(t,"utf8");O=q.parse(e)}return O}function B(t,e){let i=ye().commands.find(o=>o.name===t);return i?e&&i.operations?i.operations.find(o=>o.name===e)||null:i:null}var H={success:"\u2714",failure:"\u2716",hint:"\u2192"};function P(){return process.stdout.isTTY===!0}function T(t){let e=B(t.command,t.operation);if(e)return e.messages}function w(t,e){let n=t;return n=n.replace(/\\n/g,`
7
- `),e&&(n=n.replace(/\{\{(\w+)\}\}/g,(i,o)=>{let r=e[o];return r!==void 0?String(r):`{{${o}}}`})),n}function J(t,e){if(!P())return;let n=T(t);n?.onStart&&console.log(w(n.onStart,e))}function W(t,e){if(!P())return;let n=T(t);n?.onSuccess&&console.log(`${H.success} ${w(n.onSuccess,e)}`)}function k(t,e,n){let i=T(t);i?.onFailure&&console.error(`${H.failure} ${w(i.onFailure,n)}`),e&&console.error(` ${e}`)}function Y(t,e){if(!P())return;let n=T(t);n?.onEmpty&&console.log(w(n.onEmpty,e))}function X(t,e){return{command:t,operation:e}}var u=X("access-keys","list");async function Te(){J(u),await V()!=="oauth"&&(k(u,`Access keys can only be listed when logged in via OAuth.
8
- Run "tigris login oauth" first.`),process.exit(1));let e=M();await e.isAuthenticated()||(k(u,'Not authenticated. Run "tigris login oauth" first.'),process.exit(1));let i=await e.getAccessToken(),o=_(),r=y(),{data:s,error:a}=await Ce({config:{sessionToken:i,organizationId:o??void 0,iamEndpoint:r.iamEndpoint}});if(a&&(k(u,a.message),process.exit(1)),!s.accessKeys||s.accessKeys.length===0){Y(u);return}let c=s.accessKeys.map(g=>({name:g.name,id:g.id,status:g.status,created:g.createdAt})),l=D(c,"table","keys","key",[{key:"name",header:"Name"},{key:"id",header:"ID"},{key:"status",header:"Status"},{key:"created",header:"Created"}]);console.log(l),W(u,{count:c.length})}export{Te as default};
1
+ function ee(n){return JSON.stringify(n,null,2)}function ne(n,e=" "){return Object.entries(n).map(([t,i])=>`${e}<${t}>${i}</${t}>`).join(`
2
+ `)}function te(n,e,t){let i=[`<${e}>`];return n.forEach(o=>{i.push(` <${t}>`),i.push(ne(o," ")),i.push(` </${t}>`)}),i.push(`</${e}>`),i.join(`
3
+ `)}function b(n){if(n==null)return"";if(n instanceof Date)return K(n);if(typeof n=="string"){let e=new Date(n);if(!isNaN(e.getTime())&&n.includes("T"))return K(e)}return String(n)}function K(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 i=t.header.length,o=n.reduce((r,s)=>{let a=b(s[t.key]);return Math.max(r,a.length)},0);return Math.max(i,o)})}function oe(n,e){let t=[],i=ie(n,e),o="\u250C"+i.map(c=>"\u2500".repeat(c+2)).join("\u252C")+"\u2510",r="\u251C"+i.map(c=>"\u2500".repeat(c+2)).join("\u253C")+"\u2524",s="\u2514"+i.map(c=>"\u2500".repeat(c+2)).join("\u2534")+"\u2518";t.push(`
4
+ `+o);let a="\u2502 "+e.map((c,u)=>c.header.padEnd(i[u])).join(" \u2502 ")+" \u2502";return t.push(a),t.push(r),n.forEach(c=>{let u=e.map((g,D)=>{let R=b(c[g.key]);return g.align==="right"?R.padStart(i[D]):R.padEnd(i[D])});t.push("\u2502 "+u.join(" \u2502 ")+" \u2502")}),t.push(s+`
5
+ `),t.join(`
6
+ `)}function z(n,e,t,i,o){switch(e){case"json":return ee(n);case"xml":return te(n,t,i);default:return oe(n,o)}}import{S3Client as We}from"@aws-sdk/client-s3";import{fromIni as Ye}from"@aws-sdk/credential-providers";import{homedir as re}from"os";import{join as L}from"path";import{readFileSync as se,writeFileSync as ae,existsSync as F,mkdirSync as ce}from"fs";import{loadSharedConfigFiles as ve}from"@smithy/shared-ini-file-loader";import{chmod as de}from"fs/promises";var p="https://t3.storage.dev",_="https://iam.storageapi.dev";var I=L(re(),".tigris"),m=L(I,"config.json");function ge(){F(I)||ce(I,{recursive:!0,mode:448})}function d(){if(F(m))try{let n=se(m,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function h(n){ge(),ae(m,JSON.stringify(n,null,2),{mode:384});try{await de(m,384)}catch{}}async function E(n){let e=d();e.tokens=n,await h(e)}async function f(){return d().tokens||null}async function k(){let n=d();delete n.tokens,await h(n)}async function G(n){let e=d();e.organizations=n,await h(e)}function j(){return d().organizations||[]}function x(){return d().selectedOrganization||null}async function $(n){let e=d();e.loginMethod=n,await h(e)}function U(){return d().loginMethod||null}import C from"axios";import le from"open";function y(){let n=process.env.TIGRIS_ENV==="development",e=process.env.AUTH0_DOMAIN||n?"auth-dev.tigris.dev":"auth.tigris.dev",t=process.env.AUTH0_CLIENT_ID||n?"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF":"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",i=process.env.AUTH0_AUDIENCE||n?"https://tigris-api-dev":"https://tigris-os-api";return{domain:e,clientId:t,audience:i}}var W=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function T(){return process.env.TIGRIS_STORAGE_ENDPOINT||process.env.TIGRIS_IAM_ENDPOINT?{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||p,iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||_}:{endpoint:process.env.AWS_ENDPOINT_URL_S3||p,iamEndpoint:process.env.AWS_ENDPOINT_URL_IAM||_}}var O=class{config;baseUrl;constructor(){this.config=y(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(await C.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 le(i.verification_uri_complete)}catch{}e?.onWaiting?.();let o=await this.pollForToken(i.device_code,i.interval||5);await E(o),$("oauth"),await this.extractAndStoreOrganizations(o.idToken)}async pollForToken(e,t){let o=0;for(;o<60;){o++;try{let s=(await C.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(C.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 f();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 f(),!t)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let o=(await C.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:o.access_token,refreshToken:o.refresh_token||t.refreshToken,idToken:o.id_token||t.idToken,expiresAt:Date.now()+(o.expires_in||3600)*1e3};return await E(r),r}catch{throw await k(),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 t=e.idToken.split(".")[1],i=Buffer.from(t,"base64").toString("utf8");return JSON.parse(i)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let t=e.split(".")[1],i=Buffer.from(t,"base64").toString("utf8"),r=JSON.parse(i)[W];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;G(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),j()}async logout(){await k()}async isAuthenticated(){return await f()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},v=null;function P(){return v||(v=new O),v}var Xe=T(),Qe=y();async function V(){return U()}import{listAccessKeys as Ae}from"@tigrisdata/iam";import{readFileSync as ue,existsSync as pe}from"fs";import{join as Y,dirname as fe}from"path";import{fileURLToPath as me}from"url";import*as J from"yaml";var he=me(import.meta.url),ye=fe(he),N=null;function Te(){let n=ye;for(let e=0;e<5;e++){let t=Y(n,"specs.yaml");if(pe(t))return t;n=Y(n,"..")}throw new Error("Could not find specs.yaml")}function Ce(){if(!N){let n=Te(),e=ue(n,"utf8");N=J.parse(e)}return N}function H(n,e){let i=Ce().commands.find(o=>o.name===n);return i?e&&i.operations?i.operations.find(o=>o.name===e)||null:i:null}var q={success:"\u2714",failure:"\u2716",hint:"\u2192"};function M(){return process.stdout.isTTY===!0}function A(n){let e=H(n.command,n.operation);if(e)return e.messages}function S(n,e){let t=n;return t=t.replace(/\\n/g,`
7
+ `),e&&(t=t.replace(/\{\{(\w+)\}\}/g,(i,o)=>{let r=e[o];return r!==void 0?String(r):`{{${o}}}`})),t}function B(n,e){if(!M())return;let t=A(n);t?.onStart&&console.log(S(t.onStart,e))}function X(n,e){if(!M())return;let t=A(n);t?.onSuccess&&console.log(`${q.success} ${S(t.onSuccess,e)}`)}function w(n,e,t){let i=A(n);i?.onFailure&&console.error(`${q.failure} ${S(i.onFailure,t)}`),e&&console.error(` ${e}`)}function Q(n,e){if(!M())return;let t=A(n);t?.onEmpty&&console.log(S(t.onEmpty,e))}function Z(n,e){return{command:n,operation:e}}var l=Z("access-keys","list");async function Se(){B(l),await V()!=="oauth"&&(w(l,`Access keys can only be listed when logged in via OAuth.
8
+ Run "tigris login oauth" first.`),process.exit(1));let e=P();await e.isAuthenticated()||(w(l,'Not authenticated. Run "tigris login oauth" first.'),process.exit(1));let i=await e.getAccessToken(),o=x(),r=T(),{data:s,error:a}=await Ae({config:{sessionToken:i,organizationId:o??void 0,iamEndpoint:r.iamEndpoint}});if(a&&(w(l,a.message),process.exit(1)),!s.accessKeys||s.accessKeys.length===0){Q(l);return}let c=s.accessKeys.map(g=>({name:g.name,id:g.id,status:g.status,created:g.createdAt})),u=z(c,"table","keys","key",[{key:"name",header:"Name"},{key:"id",header:"ID"},{key:"status",header:"Status"},{key:"created",header:"Created"}]);console.log(u),X(l,{count:c.length})}export{Se as default};
@@ -1,2 +1,2 @@
1
- function f(n,e,t){for(let i of e)if(n[i]!==void 0)return n[i];return t}import ye from"enquirer";import{readFileSync as ee,existsSync as ne}from"fs";import{join as D,dirname as te}from"path";import{fileURLToPath as ie}from"url";import*as R from"yaml";var oe=ie(import.meta.url),se=te(oe),x=null;function re(){let n=se;for(let e=0;e<5;e++){let t=D(n,"specs.yaml");if(ne(t))return t;n=D(n,"..")}throw new Error("Could not find specs.yaml")}function ae(){if(!x){let n=re(),e=ee(n,"utf8");x=R.parse(e)}return x}function A(n,e){let i=ae().commands.find(o=>o.name===n);return i?e&&i.operations?i.operations.find(o=>o.name===e)||null:i:null}function m(n,e,t){let i=A(n,t);return!i||!i.arguments?null:i.arguments.find(o=>o.name===e)||null}function h(n){return n.options?Array.isArray(n.options)&&typeof n.options[0]=="string"?n.options.map(e=>({name:e,message:e.charAt(0).toUpperCase()+e.slice(1),value:e})):Array.isArray(n.options)&&typeof n.options[0]=="object"?n.options.map(e=>({name:e.value,message:e.description?`${e.name} - ${e.description}`:e.name,value:e.value})):null:null}import{createBucket as Ce}from"@tigrisdata/storage";import{S3Client as Le}from"@aws-sdk/client-s3";import{homedir as ce}from"os";import{join as K}from"path";import{readFileSync as de,writeFileSync as le,existsSync as L,mkdirSync as ge}from"fs";import{chmod as ue}from"fs/promises";var v=K(ce(),".tigris"),C=K(v,"config.json");function fe(){L(v)||ge(v,{recursive:!0,mode:448})}function g(){if(L(C))try{let n=de(C,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function T(n){fe(),le(C,JSON.stringify(n,null,2),{mode:384});try{await ue(C,384)}catch{}}async function I(n){let e=g();e.tokens=n,await T(e)}async function y(){return g().tokens||null}async function _(){let n=g();delete n.tokens,await T(n)}async function $(n){let e=g();e.organizations=n,await T(e)}function F(){return g().organizations||[]}function b(){return g().selectedOrganization||null}function j(){let n=g();return n.temporaryCredentials||n.credentials||null}async function q(n){let e=g();e.loginMethod=n,await T(e)}function U(){return g().loginMethod||null}import S from"axios";import pe from"open";function w(){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 V(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var P=class{config;baseUrl;constructor(){this.config=w(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(await S.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 pe(i.verification_uri_complete)}catch{}e?.onWaiting?.();let o=await this.pollForToken(i.device_code,i.interval||5);await I(o),q("oauth"),await this.extractAndStoreOrganizations(o.idToken)}async pollForToken(e,t){let o=0;for(;o<60;){o++;try{let c=(await S.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,r=Date.now()+(c.expires_in||3600)*1e3;return{accessToken:c.access_token,refreshToken:c.refresh_token,idToken:c.id_token,expiresAt:r}}catch(s){if(S.isAxiosError(s)&&s.response){let c=s.response.data?.error;if(c==="authorization_pending"){await this.sleep(t*1e3);continue}if(c==="slow_down"){t+=5,await this.sleep(t*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 y();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 y(),!t)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let o=(await S.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,s={accessToken:o.access_token,refreshToken:o.refresh_token||t.refreshToken,idToken:o.id_token||t.idToken,expiresAt:Date.now()+(o.expires_in||3600)*1e3};return await I(s),s}catch{throw await _(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await y();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let t=e.idToken.split(".")[1],i=Buffer.from(t,"base64").toString("utf8");return JSON.parse(i)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let t=e.split(".")[1],i=Buffer.from(t,"base64").toString("utf8"),s=JSON.parse(i)[G];if(!s)return;let c=s?.ns?.map(r=>typeof r=="object"&&r!==null?{id:r.id,name:r.name,displayName:r.name}:{id:r,name:r,displayName:r})||[];if(c.length===0)return;$(c)}catch{}}async getOrganizations(){return await this.getAccessToken(),F()}async logout(){await _()}async isAuthenticated(){return await y()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},M=null;function B(){return M||(M=new P),M}var H=V(),me=w();async function he(){return U()}async function J(){if(await he()==="oauth"){let i=await B().getAccessToken();if(!b())throw new Error('No organization selected. Please run "tigris orgs select" first.');let s=H.endpoint,c=H.iamEndpoint,r=me.domain;return{sessionToken:i,accessKeyId:"",secretAccessKey:"",endpoint:s,organizationId:b()??void 0,iamEndpoint:c,authDomain:r}}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.')}var Y={success:"\u2714",failure:"\u2716",hint:"\u2192"};function W(){return process.stdout.isTTY===!0}function O(n){let e=A(n.command,n.operation);if(e)return e.messages}function E(n,e){let t=n;return t=t.replace(/\\n/g,`
2
- `),e&&(t=t.replace(/\{\{(\w+)\}\}/g,(i,o)=>{let s=e[o];return s!==void 0?String(s):`{{${o}}}`})),t}function Q(n,e){if(!W())return;let t=O(n);t?.onStart&&console.log(E(t.onStart,e))}function X(n,e){if(!W())return;let t=O(n);t?.onSuccess&&console.log(`${Y.success} ${E(t.onSuccess,e)}`)}function N(n,e,t){let i=O(n);i?.onFailure&&console.error(`${Y.failure} ${E(i.onFailure,t)}`),e&&console.error(` ${e}`)}function Z(n,e){return{command:n,operation:e}}var{prompt:Te}=ye,k=Z("buckets","create");async function we(n){Q(k);let e=!f(n,["name"]),t=f(n,["name"]),i=e?void 0:f(n,["access","a","A"]),o=e?void 0:f(n,["enable-snapshots","s","S"]),s=e?void 0:f(n,["default-tier","t","T"]),c=e?void 0:f(n,["consistency","c","C"]),r=e?void 0:f(n,["region","r","R"]),u=[];if((!t||e)&&u.push({type:"input",name:"name",message:"Bucket name:",required:!0}),!i||e){let a=m("buckets","access","create"),l=h(a),d=l?.findIndex(p=>p.value===a?.default);u.push({type:"select",name:"access",message:"Access level:",choices:l||[],initial:d!==void 0&&d>=0?d:0})}if(!s||e){let a=m("buckets","default-tier","create"),l=h(a),d=l?.findIndex(p=>p.value===a?.default);u.push({type:"select",name:"defaultTier",message:"Default storage tier:",choices:l||[],initial:d!==void 0&&d>=0?d:0})}if(!c||e){let a=m("buckets","consistency","create"),l=h(a),d=l?.findIndex(p=>p.value===a?.default);u.push({type:"select",name:"consistency",message:"Consistency level:",choices:l||[],initial:d!==void 0&&d>=0?d:0})}if(!r||e){let a=m("buckets","region","create"),l=h(a),d=l?.findIndex(p=>p.value===a?.default);u.push({type:"select",name:"region",message:"Region:",choices:l||[],initial:d!==void 0&&d>=0?d:0})}if((o===void 0||e)&&u.push({type:"confirm",name:"enableSnapshots",message:"Enable snapshots?",initial:!0}),u.length>0){let a=await Te(u);t=t||a.name,i=i||a.access,o=o!==void 0?o:a.enableSnapshots,s=s||a.defaultTier,c=c||a.consistency,r=r!==void 0?r:a.region}t||(N(k,"Bucket name is required"),process.exit(1));let{error:z}=await Ce(t,{defaultTier:s??"STANDARD",consistency:c==="strict"?"strict":"default",enableSnapshot:o===!0,region:r!=="global"&&r!==void 0?r.split(","):void 0,config:await J()});z&&(N(k,z.message),process.exit(1)),X(k,{name:t})}export{we as default};
1
+ function f(n,e,t){for(let i of e)if(n[i]!==void 0)return n[i];return t}import we from"enquirer";import{readFileSync as re,existsSync as ae}from"fs";import{join as U,dirname as ce}from"path";import{fileURLToPath as de}from"url";import*as $ from"yaml";var le=de(import.meta.url),ge=ce(le),x=null;function ue(){let n=ge;for(let e=0;e<5;e++){let t=U(n,"specs.yaml");if(ae(t))return t;n=U(n,"..")}throw new Error("Could not find specs.yaml")}function fe(){if(!x){let n=ue(),e=re(n,"utf8");x=$.parse(e)}return x}function k(n,e){let i=fe().commands.find(s=>s.name===n);return i?e&&i.operations?i.operations.find(s=>s.name===e)||null:i:null}function h(n,e,t){let i=k(n,t);return!i||!i.arguments?null:i.arguments.find(s=>s.name===e)||null}function y(n){return n.options?Array.isArray(n.options)&&typeof n.options[0]=="string"?n.options.map(e=>({name:e,message:e.charAt(0).toUpperCase()+e.slice(1),value:e})):Array.isArray(n.options)&&typeof n.options[0]=="object"?n.options.map(e=>({name:e.value,message:e.description?`${e.name} - ${e.description}`:e.name,value:e.value})):null:null}import{createBucket as Ee}from"@tigrisdata/storage";import{S3Client as He}from"@aws-sdk/client-s3";import{fromIni as Ae}from"@aws-sdk/credential-providers";import{homedir as q}from"os";import{join as C}from"path";import{readFileSync as pe,writeFileSync as me,existsSync as S,mkdirSync as he}from"fs";import{loadSharedConfigFiles as ye}from"@smithy/shared-ini-file-loader";import{chmod as Ce}from"fs/promises";var p="https://t3.storage.dev",O="https://iam.storageapi.dev";var P=C(q(),".tigris"),A=C(P,"config.json");function Te(){S(P)||he(P,{recursive:!0,mode:448})}function g(){if(S(A))try{let n=pe(A,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function _(n){Te(),me(A,JSON.stringify(n,null,2),{mode:384});try{await Ce(A,384)}catch{}}async function N(n){let e=g();e.tokens=n,await _(e)}async function T(){return g().tokens||null}async function b(){let n=g();delete n.tokens,await _(n)}async function j(n){let e=g();e.organizations=n,await _(e)}function W(){return g().organizations||[]}function D(){return g().selectedOrganization||null}function Y(){if(process.env.TIGRIS_STORAGE_ACCESS_KEY_ID||process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY){let i=process.env.TIGRIS_STORAGE_ACCESS_KEY_ID,s=process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY;if(!i||!s)return null;let o=process.env.TIGRIS_STORAGE_ENDPOINT||p;return{accessKeyId:i,secretAccessKey:s,endpoint:o}}let n=process.env.AWS_ACCESS_KEY_ID,e=process.env.AWS_SECRET_ACCESS_KEY;if(!n||!e)return null;let t=process.env.AWS_ENDPOINT_URL_S3||p;return{accessKeyId:n,secretAccessKey:e,endpoint:t}}function V(){if(!process.env.AWS_PROFILE)return!1;let n=C(q(),".aws");return S(C(n,"credentials"))||S(C(n,"config"))}async function B(n){try{let{configFile:e}=await ye(),t=e[n];return t?{endpoint:t.endpoint_url_s3||t.endpoint_url,iamEndpoint:t.endpoint_url_iam,region:t.region}:{}}catch{return{}}}function M(){let n=g();return n.temporaryCredentials||n.credentials||null}async function H(n){let e=g();e.loginMethod=n,await _(e)}function J(){return g().loginMethod||null}import w from"axios";import Se from"open";function I(){let n=process.env.TIGRIS_ENV==="development",e=process.env.AUTH0_DOMAIN||n?"auth-dev.tigris.dev":"auth.tigris.dev",t=process.env.AUTH0_CLIENT_ID||n?"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF":"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",i=process.env.AUTH0_AUDIENCE||n?"https://tigris-api-dev":"https://tigris-os-api";return{domain:e,clientId:t,audience:i}}var Q=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function X(){return process.env.TIGRIS_STORAGE_ENDPOINT||process.env.TIGRIS_IAM_ENDPOINT?{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||p,iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||O}:{endpoint:process.env.AWS_ENDPOINT_URL_S3||p,iamEndpoint:process.env.AWS_ENDPOINT_URL_IAM||O}}var K=class{config;baseUrl;constructor(){this.config=I(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(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?.(i.user_code,i.verification_uri),await this.sleep(2e3);try{await Se(i.verification_uri_complete)}catch{}e?.onWaiting?.();let s=await this.pollForToken(i.device_code,i.interval||5);await N(s),H("oauth"),await this.extractAndStoreOrganizations(s.idToken)}async pollForToken(e,t){let s=0;for(;s<60;){s++;try{let c=(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,r=Date.now()+(c.expires_in||3600)*1e3;return{accessToken:c.access_token,refreshToken:c.refresh_token,idToken:c.id_token,expiresAt:r}}catch(o){if(w.isAxiosError(o)&&o.response){let c=o.response.data?.error;if(c==="authorization_pending"){await this.sleep(t*1e3);continue}if(c==="slow_down"){t+=5,await this.sleep(t*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 T();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 T(),!t)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let s=(await w.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,o={accessToken:s.access_token,refreshToken:s.refresh_token||t.refreshToken,idToken:s.id_token||t.idToken,expiresAt:Date.now()+(s.expires_in||3600)*1e3};return await N(o),o}catch{throw await b(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await T();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let t=e.idToken.split(".")[1],i=Buffer.from(t,"base64").toString("utf8");return JSON.parse(i)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let t=e.split(".")[1],i=Buffer.from(t,"base64").toString("utf8"),o=JSON.parse(i)[Q];if(!o)return;let c=o?.ns?.map(r=>typeof r=="object"&&r!==null?{id:r.id,name:r.name,displayName:r.name}:{id:r,name:r,displayName:r})||[];if(c.length===0)return;j(c)}catch{}}async getOrganizations(){return await this.getAccessToken(),W()}async logout(){await b()}async isAuthenticated(){return await T()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},R=null;function Z(){return R||(R=new K),R}var E=X(),_e=I();async function Ie(){return J()}async function ee(){if(V()){let i=process.env.AWS_PROFILE||"default",s=await B(i),o=await Ae({profile:i})();return{accessKeyId:o.accessKeyId,secretAccessKey:o.secretAccessKey,endpoint:s.endpoint||E.endpoint||p,iamEndpoint:s.iamEndpoint||E.iamEndpoint}}let n=await Ie();if(n==="oauth"){let s=await Z().getAccessToken();if(!D())throw new Error('No organization selected. Please run "tigris orgs select" first.');return{sessionToken:s,accessKeyId:"",secretAccessKey:"",endpoint:E.endpoint,organizationId:D()??void 0,iamEndpoint:E.iamEndpoint,authDomain:_e.domain}}if(n==="credentials"){let i=M();if(i)return{accessKeyId:i.accessKeyId,secretAccessKey:i.secretAccessKey,endpoint:i.endpoint}}let e=Y();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};let t=M();if(t)return{accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey,endpoint:t.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}var ne={success:"\u2714",failure:"\u2716",hint:"\u2192"};function te(){return process.stdout.isTTY===!0}function L(n){let e=k(n.command,n.operation);if(e)return e.messages}function z(n,e){let t=n;return t=t.replace(/\\n/g,`
2
+ `),e&&(t=t.replace(/\{\{(\w+)\}\}/g,(i,s)=>{let o=e[s];return o!==void 0?String(o):`{{${s}}}`})),t}function ie(n,e){if(!te())return;let t=L(n);t?.onStart&&console.log(z(t.onStart,e))}function se(n,e){if(!te())return;let t=L(n);t?.onSuccess&&console.log(`${ne.success} ${z(t.onSuccess,e)}`)}function G(n,e,t){let i=L(n);i?.onFailure&&console.error(`${ne.failure} ${z(i.onFailure,t)}`),e&&console.error(` ${e}`)}function oe(n,e){return{command:n,operation:e}}var{prompt:ve}=we,v=oe("buckets","create");async function xe(n){ie(v);let e=!f(n,["name"]),t=f(n,["name"]),i=e?void 0:f(n,["access","a","A"]),s=e?void 0:f(n,["enable-snapshots","s","S"]),o=e?void 0:f(n,["default-tier","t","T"]),c=e?void 0:f(n,["consistency","c","C"]),r=e?void 0:f(n,["region","r","R"]),u=[];if((!t||e)&&u.push({type:"input",name:"name",message:"Bucket name:",required:!0}),!i||e){let a=h("buckets","access","create"),l=y(a),d=l?.findIndex(m=>m.value===a?.default);u.push({type:"select",name:"access",message:"Access level:",choices:l||[],initial:d!==void 0&&d>=0?d:0})}if(!o||e){let a=h("buckets","default-tier","create"),l=y(a),d=l?.findIndex(m=>m.value===a?.default);u.push({type:"select",name:"defaultTier",message:"Default storage tier:",choices:l||[],initial:d!==void 0&&d>=0?d:0})}if(!c||e){let a=h("buckets","consistency","create"),l=y(a),d=l?.findIndex(m=>m.value===a?.default);u.push({type:"select",name:"consistency",message:"Consistency level:",choices:l||[],initial:d!==void 0&&d>=0?d:0})}if(!r||e){let a=h("buckets","region","create"),l=y(a),d=l?.findIndex(m=>m.value===a?.default);u.push({type:"select",name:"region",message:"Region:",choices:l||[],initial:d!==void 0&&d>=0?d:0})}if((s===void 0||e)&&u.push({type:"confirm",name:"enableSnapshots",message:"Enable snapshots?",initial:!0}),u.length>0){let a=await ve(u);t=t||a.name,i=i||a.access,s=s!==void 0?s:a.enableSnapshots,o=o||a.defaultTier,c=c||a.consistency,r=r!==void 0?r:a.region}t||(G(v,"Bucket name is required"),process.exit(1));let{error:F}=await Ee(t,{defaultTier:o??"STANDARD",consistency:c==="strict"?"strict":"default",enableSnapshot:s===!0,region:r!=="global"&&r!==void 0?r.split(","):void 0,config:await ee()});F&&(G(v,F.message),process.exit(1)),se(v,{name:t})}export{xe as default};