@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,7 +1,7 @@
1
- import{readFileSync as xe,statSync as Se}from"fs";function g(t,e,n){for(let o of e)if(t[o]!==void 0)return t[o];return n}function ee(t){return JSON.stringify(t,null,2)}function te(t,e=" "){return Object.entries(t).map(([n,o])=>`${e}<${n}>${o}</${n}>`).join(`
2
- `)}function ne(t,e,n){let o=[`<${e}>`];return t.forEach(i=>{o.push(` <${n}>`),o.push(te(i," ")),o.push(` </${n}>`)}),o.push(`</${e}>`),o.join(`
3
- `)}function E(t){if(t==null)return"";if(t instanceof Date)return P(t);if(typeof t=="string"){let e=new Date(t);if(!isNaN(e.getTime())&&t.includes("T"))return P(e)}return String(t)}function P(t){return new Intl.DateTimeFormat(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(t)}function oe(t,e){return e.map(n=>{if(n.width)return n.width;let o=n.header.length,i=t.reduce((r,s)=>{let a=E(s[n.key]);return Math.max(r,a.length)},0);return Math.max(o,i)})}function ie(t,e){let n=[],o=oe(t,e),i="\u250C"+o.map(c=>"\u2500".repeat(c+2)).join("\u252C")+"\u2510",r="\u251C"+o.map(c=>"\u2500".repeat(c+2)).join("\u253C")+"\u2524",s="\u2514"+o.map(c=>"\u2500".repeat(c+2)).join("\u2534")+"\u2518";n.push(`
4
- `+i);let a="\u2502 "+e.map((c,u)=>c.header.padEnd(o[u])).join(" \u2502 ")+" \u2502";return n.push(a),n.push(r),t.forEach(c=>{let u=e.map((l,h)=>{let y=E(c[l.key]);return l.align==="right"?y.padStart(o[h]):y.padEnd(o[h])});n.push("\u2502 "+u.join(" \u2502 ")+" \u2502")}),n.push(s+`
1
+ import{createReadStream as Ke,statSync as ze}from"fs";import{Readable as pe}from"stream";function f(e,t,n){for(let o of t)if(e[o]!==void 0)return e[o];return n}function fe(e){return JSON.stringify(e,null,2)}function ge(e,t=" "){return Object.entries(e).map(([n,o])=>`${t}<${n}>${o}</${n}>`).join(`
2
+ `)}function me(e,t,n){let o=[`<${t}>`];return e.forEach(i=>{o.push(` <${n}>`),o.push(ge(i," ")),o.push(` </${n}>`)}),o.push(`</${t}>`),o.join(`
3
+ `)}function G(e){if(e==null)return"";if(e instanceof Date)return j(e);if(typeof e=="string"){let t=new Date(e);if(!isNaN(t.getTime())&&e.includes("T"))return j(t)}return String(e)}function j(e){return new Intl.DateTimeFormat(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(e)}function he(e,t){return t.map(n=>{if(n.width)return n.width;let o=n.header.length,i=e.reduce((r,s)=>{let a=G(s[n.key]);return Math.max(r,a.length)},0);return Math.max(o,i)})}function Te(e,t){let n=[],o=he(e,t),i="\u250C"+o.map(c=>"\u2500".repeat(c+2)).join("\u252C")+"\u2510",r="\u251C"+o.map(c=>"\u2500".repeat(c+2)).join("\u253C")+"\u2524",s="\u2514"+o.map(c=>"\u2500".repeat(c+2)).join("\u2534")+"\u2518";n.push(`
4
+ `+i);let a="\u2502 "+t.map((c,d)=>c.header.padEnd(o[d])).join(" \u2502 ")+" \u2502";return n.push(a),n.push(r),e.forEach(c=>{let d=t.map((y,C)=>{let l=G(c[y.key]);return y.align==="right"?l.padStart(o[C]):l.padEnd(o[C])});n.push("\u2502 "+d.join(" \u2502 ")+" \u2502")}),n.push(s+`
5
5
  `),n.join(`
6
- `)}function z(t,e,n,o,i){switch(e){case"json":return ee(t);case"xml":return ne(t,n,o);default:return ie(t,i)}}import{S3Client as Le}from"@aws-sdk/client-s3";import{homedir as re}from"os";import{join as N}from"path";import{readFileSync as se,writeFileSync as ae,existsSync as D,mkdirSync as ce}from"fs";import{chmod as de}from"fs/promises";var x=N(re(),".tigris"),T=N(x,"config.json");function ue(){D(x)||ce(x,{recursive:!0,mode:448})}function d(){if(D(T))try{let t=se(T,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function C(t){ue(),ae(T,JSON.stringify(t,null,2),{mode:384});try{await de(T,384)}catch{}}async function S(t){let e=d();e.tokens=t,await C(e)}async function m(){return d().tokens||null}async function A(){let t=d();delete t.tokens,await C(t)}async function j(t){let e=d();e.organizations=t,await C(e)}function R(){return d().organizations||[]}function _(){return d().selectedOrganization||null}function $(){let t=d();return t.temporaryCredentials||t.credentials||null}async function F(t){let e=d();e.loginMethod=t,await C(e)}function K(){return d().loginMethod||null}import k from"axios";import ge 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 L=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function B(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var M=class{config;baseUrl;constructor(){this.config=w(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await k.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 ge(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await S(i),F("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,n){let i=0;for(;i<60;){i++;try{let s=(await k.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(k.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 m();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 m(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await k.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 S(r),r}catch{throw await A(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await m();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)[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;j(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),R()}async logout(){await A()}async isAuthenticated(){return await m()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},v=null;function U(){return v||(v=new M),v}var V=B(),fe=w();async function pe(){return K()}async function q(){if(await pe()==="oauth"){let o=await U().getAccessToken();if(!_())throw new Error('No organization selected. Please run "tigris orgs select" first.');let r=V.endpoint,s=V.iamEndpoint,a=fe.domain;return{sessionToken:o,accessKeyId:"",secretAccessKey:"",endpoint:r,organizationId:_()??void 0,iamEndpoint:s,authDomain:a}}let e=$();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{put as Ae}from"@tigrisdata/storage";import{readFileSync as le,existsSync as me}from"fs";import{join as G,dirname as he}from"path";import{fileURLToPath as ye}from"url";import*as H from"yaml";var Te=ye(import.meta.url),Ce=he(Te),I=null;function we(){let t=Ce;for(let e=0;e<5;e++){let n=G(t,"specs.yaml");if(me(n))return n;t=G(t,"..")}throw new Error("Could not find specs.yaml")}function ke(){if(!I){let t=we(),e=le(t,"utf8");I=H.parse(e)}return I}function J(t,e){let o=ke().commands.find(i=>i.name===t);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 b(t){let e=J(t.command,t.operation);if(e)return e.messages}function O(t,e){let n=t;return n=n.replace(/\\n/g,`
7
- `),e&&(n=n.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let r=e[i];return r!==void 0?String(r):`{{${i}}}`})),n}function X(t,e){if(!Y())return;let n=b(t);n?.onStart&&console.log(O(n.onStart,e))}function Q(t,e){if(!Y())return;let n=b(t);n?.onSuccess&&console.log(`${W.success} ${O(n.onSuccess,e)}`)}function p(t,e,n){let o=b(t);o?.onFailure&&console.error(`${W.failure} ${O(o.onFailure,n)}`),e&&console.error(` ${e}`)}function Z(t,e){return{command:t,operation:e}}var f=Z("objects","put");async function _e(t){X(f);let e=g(t,["bucket"]),n=g(t,["key"]),o=g(t,["file"]),i=g(t,["access","a","A"],"private"),r=g(t,["content-type","contentType","t","T"]),s=g(t,["format","f","F"],"table");e||(p(f,"Bucket name is required"),process.exit(1)),n||(p(f,"Object key is required"),process.exit(1)),o||(p(f,"File path is required"),process.exit(1));try{Se(o)}catch{p(f,`File not found: ${o}`),process.exit(1)}let a=await q(),c=xe(o),{data:u,error:l}=await Ae(n,c,{access:i==="public"?"public":"private",contentType:r,config:{...a,bucket:e}});l&&(p(f,l.message),process.exit(1));let h=[{path:u.path,size:ve(u.size),contentType:u.contentType||"-",modified:u.modified}],y=z(h,s,"objects","object",[{key:"path",header:"Path"},{key:"size",header:"Size"},{key:"contentType",header:"Content-Type"},{key:"modified",header:"Modified"}]);console.log(y),Q(f,{key:n,bucket:e})}function ve(t){if(t===0)return"0 B";let e=["B","KB","MB","GB","TB"],n=Math.floor(Math.log(t)/Math.log(1024));return`${(t/Math.pow(1024,n)).toFixed(n>0?1:0)} ${e[n]}`}export{_e as default};
6
+ `)}function U(e,t,n,o,i){switch(t){case"json":return fe(e);case"xml":return me(e,n,o);default:return Te(e,i)}}import{S3Client as it}from"@aws-sdk/client-s3";import{fromIni as xe}from"@aws-sdk/credential-providers";import{homedir as W}from"os";import{join as h}from"path";import{readFileSync as ye,writeFileSync as Ce,existsSync as w,mkdirSync as Se}from"fs";import{loadSharedConfigFiles as we}from"@smithy/shared-ini-file-loader";import{chmod as Ae}from"fs/promises";var u="https://t3.storage.dev",v="https://iam.storageapi.dev";var O=h(W(),".tigris"),A=h(O,"config.json");function _e(){w(O)||Se(O,{recursive:!0,mode:448})}function p(){if(w(A))try{let e=ye(A,"utf8");return JSON.parse(e)}catch{return{}}return{}}async function _(e){_e(),Ce(A,JSON.stringify(e,null,2),{mode:384});try{await Ae(A,384)}catch{}}async function P(e){let t=p();t.tokens=e,await _(t)}async function T(){return p().tokens||null}async function b(){let e=p();delete e.tokens,await _(e)}async function B(e){let t=p();t.organizations=e,await _(t)}function V(){return p().organizations||[]}function M(){return p().selectedOrganization||null}function Y(){if(process.env.TIGRIS_STORAGE_ACCESS_KEY_ID||process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY){let o=process.env.TIGRIS_STORAGE_ACCESS_KEY_ID,i=process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY;if(!o||!i)return null;let r=process.env.TIGRIS_STORAGE_ENDPOINT||u;return{accessKeyId:o,secretAccessKey:i,endpoint:r}}let e=process.env.AWS_ACCESS_KEY_ID,t=process.env.AWS_SECRET_ACCESS_KEY;if(!e||!t)return null;let n=process.env.AWS_ENDPOINT_URL_S3||u;return{accessKeyId:e,secretAccessKey:t,endpoint:n}}function q(){if(!process.env.AWS_PROFILE)return!1;let e=h(W(),".aws");return w(h(e,"credentials"))||w(h(e,"config"))}async function J(e){try{let{configFile:t}=await we(),n=t[e];return n?{endpoint:n.endpoint_url_s3||n.endpoint_url,iamEndpoint:n.endpoint_url_iam,region:n.region}:{}}catch{return{}}}function N(){let e=p();return e.temporaryCredentials||e.credentials||null}async function H(e){let t=p();t.loginMethod=e,await _(t)}function X(){return p().loginMethod||null}import x from"axios";import Ie from"open";function I(){let e=process.env.TIGRIS_ENV==="development",t=process.env.AUTH0_DOMAIN||e?"auth-dev.tigris.dev":"auth.tigris.dev",n=process.env.AUTH0_CLIENT_ID||e?"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF":"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",o=process.env.AUTH0_AUDIENCE||e?"https://tigris-api-dev":"https://tigris-os-api";return{domain:t,clientId:n,audience:o}}var Q=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function Z(){return process.env.TIGRIS_STORAGE_ENDPOINT||process.env.TIGRIS_IAM_ENDPOINT?{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||u,iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||v}:{endpoint:process.env.AWS_ENDPOINT_URL_S3||u,iamEndpoint:process.env.AWS_ENDPOINT_URL_IAM||v}}var D=class{config;baseUrl;constructor(){this.config=I(),this.baseUrl=`https://${this.config.domain}`}async login(t){let o=(await x.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;t?.onDeviceCode?.(o.user_code,o.verification_uri),await this.sleep(2e3);try{await Ie(o.verification_uri_complete)}catch{}t?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await P(i),H("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(t,n){let i=0;for(;i<60;){i++;try{let s=(await x.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:t,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(x.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 t=await T();if(!t)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let n=300*1e3;return Date.now()+n>=t.expiresAt&&(t=await this.refreshAccessToken(t)),t.accessToken}async refreshAccessToken(t){let n=null;if(t?.refreshToken?n=t:n=await T(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await x.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 P(r),r}catch{throw await b(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let t=await T();if(!t||!t.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let n=t.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(t){if(t)try{let n=t.split(".")[1],o=Buffer.from(n,"base64").toString("utf8"),r=JSON.parse(o)[Q];if(!r)return;let s=r?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;B(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),V()}async logout(){await b()}async isAuthenticated(){return await T()!==null}sleep(t){return new Promise(n=>setTimeout(n,t))}},R=null;function ee(){return R||(R=new D),R}var k=Z(),ke=I();async function Ee(){return X()}async function te(){if(q()){let o=process.env.AWS_PROFILE||"default",i=await J(o),r=await xe({profile:o})();return{accessKeyId:r.accessKeyId,secretAccessKey:r.secretAccessKey,endpoint:i.endpoint||k.endpoint||u,iamEndpoint:i.iamEndpoint||k.iamEndpoint}}let e=await Ee();if(e==="oauth"){let i=await ee().getAccessToken();if(!M())throw new Error('No organization selected. Please run "tigris orgs select" first.');return{sessionToken:i,accessKeyId:"",secretAccessKey:"",endpoint:k.endpoint,organizationId:M()??void 0,iamEndpoint:k.iamEndpoint,authDomain:ke.domain}}if(e==="credentials"){let o=N();if(o)return{accessKeyId:o.accessKeyId,secretAccessKey:o.secretAccessKey,endpoint:o.endpoint}}let t=Y();if(t)return{accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey,endpoint:t.endpoint};let n=N();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.')}import{put as Fe}from"@tigrisdata/storage";import{readFileSync as ve,existsSync as Oe}from"fs";import{join as ne,dirname as Pe}from"path";import{fileURLToPath as be}from"url";import*as oe from"yaml";var Me=be(import.meta.url),Ne=Pe(Me),K=null;function Re(){let e=Ne;for(let t=0;t<5;t++){let n=ne(e,"specs.yaml");if(Oe(n))return n;e=ne(e,"..")}throw new Error("Could not find specs.yaml")}function De(){if(!K){let e=Re(),t=ve(e,"utf8");K=oe.parse(t)}return K}function ie(e,t){let o=De().commands.find(i=>i.name===e);return o?t&&o.operations?o.operations.find(i=>i.name===t)||null:o:null}var re={success:"\u2714",failure:"\u2716",hint:"\u2192"};function se(){return process.stdout.isTTY===!0}function z(e){let t=ie(e.command,e.operation);if(t)return t.messages}function F(e,t){let n=e;return n=n.replace(/\\n/g,`
7
+ `),t&&(n=n.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let r=t[i];return r!==void 0?String(r):`{{${i}}}`})),n}function ae(e,t){if(!se())return;let n=z(e);n?.onStart&&console.log(F(n.onStart,t))}function ce(e,t){if(!se())return;let n=z(e);n?.onSuccess&&console.log(`${re.success} ${F(n.onSuccess,t)}`)}function m(e,t,n){let o=z(e);o?.onFailure&&console.error(`${re.failure} ${F(o.onFailure,n)}`),t&&console.error(` ${t}`)}function de(e,t){return{command:e,operation:t}}var g=de("objects","put");async function Le(e){ae(g);let t=f(e,["bucket"]),n=f(e,["key"]),o=f(e,["file"]),i=f(e,["access","a","A"],"private"),r=f(e,["content-type","contentType","t","T"]),s=f(e,["format","f","F"],"table");t||(m(g,"Bucket name is required"),process.exit(1)),n||(m(g,"Object key is required"),process.exit(1));let a=!process.stdin.isTTY;!o&&!a&&(m(g,"File path is required (or pipe data via stdin)"),process.exit(1));let c,d;if(o){try{d=ze(o).size}catch{m(g,`File not found: ${o}`),process.exit(1)}let S=Ke(o);c=pe.toWeb(S)}else c=pe.toWeb(process.stdin);let y=await te(),C=!o||d!==void 0&&d>100*1024*1024,{data:l,error:L}=await Fe(n,c,{access:i==="public"?"public":"private",contentType:r,multipart:C,onUploadProgress:({loaded:S,percentage:$})=>{d!==void 0&&d>0?process.stdout.write(`\rUploading: ${E(S)} / ${E(d)} (${$}%)`):process.stdout.write(`\rUploading: ${E(S)}`)},config:{...y,bucket:t}});process.stdout.write("\r"+" ".repeat(60)+"\r"),L&&(m(g,L.message),process.exit(1));let ue=[{path:l.path,size:E(l.size??d??0),contentType:l.contentType||"-",modified:l.modified}],le=U(ue,s,"objects","object",[{key:"path",header:"Path"},{key:"size",header:"Size"},{key:"contentType",header:"Content-Type"},{key:"modified",header:"Modified"}]);console.log(le),ce(g,{key:n,bucket:t})}function E(e){if(e===0)return"0 B";let t=["B","KB","MB","GB","TB"],n=Math.floor(Math.log(e)/Math.log(1024));return`${(e/Math.pow(1024,n)).toFixed(n>0?1:0)} ${t[n]}`}export{Le as default};
@@ -1,5 +1,5 @@
1
- import{createOrganization as de}from"@tigrisdata/iam";function O(n,e,t){for(let o of e)if(n[o]!==void 0)return n[o];return t}import{S3Client as ve}from"@aws-sdk/client-s3";import{homedir as Y}from"os";import{join as P}from"path";import{readFileSync as B,writeFileSync as J,existsSync as E,mkdirSync as W}from"fs";import{chmod as Q}from"fs/promises";var T=P(Y(),".tigris"),l=P(T,"config.json");function X(){E(T)||W(T,{recursive:!0,mode:448})}function c(){if(E(l))try{let n=B(l,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function u(n){X(),J(l,JSON.stringify(n,null,2),{mode:384});try{await Q(l,384)}catch{}}async function w(n){let e=c();e.tokens=n,await u(e)}async function g(){return c().tokens||null}async function k(){let n=c();delete n.tokens,await u(n)}async function b(n){let e=c();e.organizations=n,await u(e)}function z(){return c().organizations||[]}function S(){return c().selectedOrganization||null}function f(){let n=c();return n.temporaryCredentials||n.credentials||null}async function N(n){let e=c();e.loginMethod=n,await u(e)}function p(){return c().loginMethod||null}import h 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 D=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function R(){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 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 Z(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await w(i),N("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,t){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(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 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 h.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:t.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,r={accessToken:i.access_token,refreshToken:i.refresh_token||t.refreshToken,idToken:i.id_token||t.idToken,expiresAt:Date.now()+(i.expires_in||3600)*1e3};return await w(r),r}catch{throw await k(),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"),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;b(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),z()}async logout(){await k()}async isAuthenticated(){return await g()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},x=null;function L(){return x||(x=new A),x}var K=R(),ee=m();async function te(){return p()}async function $(){if(await te()==="oauth"){let o=await L().getAccessToken();if(!S())throw new Error('No organization selected. Please run "tigris orgs select" first.');let r=K.endpoint,s=K.iamEndpoint,a=ee.domain;return{sessionToken:o,accessKeyId:"",secretAccessKey:"",endpoint:r,organizationId:S()??void 0,iamEndpoint:s,authDomain:a}}let e=f();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{readFileSync as ne,existsSync as oe}from"fs";import{join as F,dirname as ie}from"path";import{fileURLToPath as re}from"url";import*as j from"yaml";var se=re(import.meta.url),ae=ie(se),v=null;function ce(){let n=ae;for(let e=0;e<5;e++){let t=F(n,"specs.yaml");if(oe(t))return t;n=F(n,"..")}throw new Error("Could not find specs.yaml")}function ge(){if(!v){let n=ce(),e=ne(n,"utf8");v=j.parse(e)}return v}function U(n,e){let o=ge().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 I(){return process.stdout.isTTY===!0}function y(n){let e=U(n.command,n.operation);if(e)return e.messages}function C(n,e){let t=n;return t=t.replace(/\\n/g,`
2
- `),e&&(t=t.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let r=e[i];return r!==void 0?String(r):`{{${i}}}`})),t}function G(n,e){if(!I())return;let t=y(n);t?.onStart&&console.log(C(t.onStart,e))}function V(n,e){if(!I())return;let t=y(n);t?.onSuccess&&console.log(`${_.success} ${C(t.onSuccess,e)}`)}function M(n,e,t){let o=y(n);o?.onFailure&&console.error(`${_.failure} ${C(o.onFailure,t)}`),e&&console.error(` ${e}`)}function q(n,e){if(!I())return;let t=y(n);t?.hint&&console.log(`${_.hint} ${C(t.hint,e)}`)}function H(n,e){return{command:n,operation:e}}var d=H("organizations","create");async function le(n){if(G(d),p()!=="oauth"){f()?console.log(`You are using access key credentials, which belong to a single organization.
1
+ import{createOrganization as ye}from"@tigrisdata/iam";function K(n,e,t){for(let o of e)if(n[o]!==void 0)return n[o];return t}import{S3Client as ze}from"@aws-sdk/client-s3";import{fromIni as ae}from"@aws-sdk/credential-providers";import{homedir as b}from"os";import{join as l}from"path";import{readFileSync as ee,writeFileSync as ne,existsSync as f,mkdirSync as te}from"fs";import{loadSharedConfigFiles as oe}from"@smithy/shared-ini-file-loader";import{chmod as ie}from"fs/promises";var d="https://t3.storage.dev",_="https://iam.storageapi.dev";var w=l(b(),".tigris"),u=l(w,"config.json");function re(){f(w)||te(w,{recursive:!0,mode:448})}function c(){if(f(u))try{let n=ee(u,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function m(n){re(),ne(u,JSON.stringify(n,null,2),{mode:384});try{await ie(u,384)}catch{}}async function I(n){let e=c();e.tokens=n,await m(e)}async function g(){return c().tokens||null}async function E(){let n=c();delete n.tokens,await m(n)}async function z(n){let e=c();e.organizations=n,await m(e)}function L(){return c().organizations||[]}function v(){return c().selectedOrganization||null}function x(){if(process.env.TIGRIS_STORAGE_ACCESS_KEY_ID||process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY){let o=process.env.TIGRIS_STORAGE_ACCESS_KEY_ID,i=process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY;if(!o||!i)return null;let r=process.env.TIGRIS_STORAGE_ENDPOINT||d;return{accessKeyId:o,secretAccessKey:i,endpoint:r}}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||d;return{accessKeyId:n,secretAccessKey:e,endpoint:t}}function G(){if(!process.env.AWS_PROFILE)return!1;let n=l(b(),".aws");return f(l(n,"credentials"))||f(l(n,"config"))}async function F(n){try{let{configFile:e}=await oe(),t=e[n];return t?{endpoint:t.endpoint_url_s3||t.endpoint_url,iamEndpoint:t.endpoint_url_iam,region:t.region}:{}}catch{return{}}}function U(){let n=c();return x()||n.temporaryCredentials||n.credentials||null}function k(){let n=c();return n.temporaryCredentials||n.credentials||null}async function $(n){let e=c();e.loginMethod=n,await m(e)}function h(){return c().loginMethod||null}import y from"axios";import se 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 Y=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function j(){return process.env.TIGRIS_STORAGE_ENDPOINT||process.env.TIGRIS_IAM_ENDPOINT?{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||d,iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||_}:{endpoint:process.env.AWS_ENDPOINT_URL_S3||d,iamEndpoint:process.env.AWS_ENDPOINT_URL_IAM||_}}var P=class{config;baseUrl;constructor(){this.config=C(),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 se(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await I(i),$("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,t){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(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 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,r={accessToken:i.access_token,refreshToken:i.refresh_token||t.refreshToken,idToken:i.id_token||t.idToken,expiresAt:Date.now()+(i.expires_in||3600)*1e3};return await I(r),r}catch{throw await E(),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"),r=JSON.parse(o)[Y];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;z(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),L()}async logout(){await E()}async isAuthenticated(){return await g()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},O=null;function W(){return O||(O=new P),O}var T=j(),ce=C();async function de(){return h()}async function V(){if(G()){let o=process.env.AWS_PROFILE||"default",i=await F(o),r=await ae({profile:o})();return{accessKeyId:r.accessKeyId,secretAccessKey:r.secretAccessKey,endpoint:i.endpoint||T.endpoint||d,iamEndpoint:i.iamEndpoint||T.iamEndpoint}}let n=await de();if(n==="oauth"){let i=await W().getAccessToken();if(!v())throw new Error('No organization selected. Please run "tigris orgs select" first.');return{sessionToken:i,accessKeyId:"",secretAccessKey:"",endpoint:T.endpoint,organizationId:v()??void 0,iamEndpoint:T.iamEndpoint,authDomain:ce.domain}}if(n==="credentials"){let o=k();if(o)return{accessKeyId:o.accessKeyId,secretAccessKey:o.secretAccessKey,endpoint:o.endpoint}}let e=x();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};let t=k();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.')}import{readFileSync as le,existsSync as ge}from"fs";import{join as H,dirname as pe}from"path";import{fileURLToPath as fe}from"url";import*as q from"yaml";var ue=fe(import.meta.url),me=pe(ue),N=null;function he(){let n=me;for(let e=0;e<5;e++){let t=H(n,"specs.yaml");if(ge(t))return t;n=H(n,"..")}throw new Error("Could not find specs.yaml")}function Ce(){if(!N){let n=he(),e=le(n,"utf8");N=q.parse(e)}return N}function J(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 M={success:"\u2714",failure:"\u2716",hint:"\u2192"};function D(){return process.stdout.isTTY===!0}function S(n){let e=J(n.command,n.operation);if(e)return e.messages}function A(n,e){let t=n;return t=t.replace(/\\n/g,`
2
+ `),e&&(t=t.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let r=e[i];return r!==void 0?String(r):`{{${i}}}`})),t}function B(n,e){if(!D())return;let t=S(n);t?.onStart&&console.log(A(t.onStart,e))}function Q(n,e){if(!D())return;let t=S(n);t?.onSuccess&&console.log(`${M.success} ${A(t.onSuccess,e)}`)}function R(n,e,t){let o=S(n);o?.onFailure&&console.error(`${M.failure} ${A(o.onFailure,t)}`),e&&console.error(` ${e}`)}function X(n,e){if(!D())return;let t=S(n);t?.hint&&console.log(`${M.hint} ${A(t.hint,e)}`)}function Z(n,e){return{command:n,operation:e}}var p=Z("organizations","create");async function Te(n){if(B(p),h()!=="oauth"){U()?console.log(`You are using access key credentials, which belong to a single organization.
3
3
  Organization creation is only available with OAuth login.
4
4
 
5
- Run "tigris login" to login with your Tigris account.`):console.log('Not authenticated. Please run "tigris login" to login with your Tigris account.');return}let t=O(n,["name","N"]);t||(M(d,"Organization name is required"),process.exit(1));let o=await $(),{data:i,error:r}=await de(t,{config:o});r&&(M(d,r.message),process.exit(1));let s=i.id;V(d,{name:t,id:s}),q(d,{name:t})}export{le as default};
5
+ Run "tigris login" to login with your Tigris account.`):console.log('Not authenticated. Please run "tigris login" to login with your Tigris account.');return}let t=K(n,["name","N"]);t||(R(p,"Organization name is required"),process.exit(1));let o=await V(),{data:i,error:r}=await ye(t,{config:o});r&&(R(p,r.message),process.exit(1));let s=i.id;Q(p,{name:t,id:s}),X(p,{name:t})}export{Te as default};
@@ -1,10 +1,10 @@
1
- import{listOrganizations as ve}from"@tigrisdata/iam";function R(n,e,t){for(let o of e)if(n[o]!==void 0)return n[o];return t}function se(n){return JSON.stringify(n,null,2)}function ae(n,e=" "){return Object.entries(n).map(([t,o])=>`${e}<${t}>${o}</${t}>`).join(`
2
- `)}function ce(n,e,t){let o=[`<${e}>`];return n.forEach(i=>{o.push(` <${t}>`),o.push(ae(i," ")),o.push(` </${t}>`)}),o.push(`</${e}>`),o.join(`
3
- `)}function j(n){if(n==null)return"";if(n instanceof Date)return $(n);if(typeof n=="string"){let e=new Date(n);if(!isNaN(e.getTime())&&n.includes("T"))return $(e)}return String(n)}function $(n){return new Intl.DateTimeFormat(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(n)}function de(n,e){return e.map(t=>{if(t.width)return t.width;let o=t.header.length,i=n.reduce((r,s)=>{let a=j(s[t.key]);return Math.max(r,a.length)},0);return Math.max(o,i)})}function ge(n,e){let t=[],o=de(n,e),i="\u250C"+o.map(c=>"\u2500".repeat(c+2)).join("\u252C")+"\u2510",r="\u251C"+o.map(c=>"\u2500".repeat(c+2)).join("\u253C")+"\u2524",s="\u2514"+o.map(c=>"\u2500".repeat(c+2)).join("\u2534")+"\u2518";t.push(`
4
- `+i);let a="\u2502 "+e.map((c,l)=>c.header.padEnd(o[l])).join(" \u2502 ")+" \u2502";return t.push(a),t.push(r),n.forEach(c=>{let l=e.map((u,A)=>{let _=j(c[u.key]);return u.align==="right"?_.padStart(o[A]):_.padEnd(o[A])});t.push("\u2502 "+l.join(" \u2502 ")+" \u2502")}),t.push(s+`
1
+ import{listOrganizations as Ke}from"@tigrisdata/iam";function j(e,n,t){for(let i of n)if(e[i]!==void 0)return e[i];return t}function pe(e){return JSON.stringify(e,null,2)}function fe(e,n=" "){return Object.entries(e).map(([t,i])=>`${n}<${t}>${i}</${t}>`).join(`
2
+ `)}function me(e,n,t){let i=[`<${n}>`];return e.forEach(o=>{i.push(` <${t}>`),i.push(fe(o," ")),i.push(` </${t}>`)}),i.push(`</${n}>`),i.join(`
3
+ `)}function W(e){if(e==null)return"";if(e instanceof Date)return U(e);if(typeof e=="string"){let n=new Date(e);if(!isNaN(n.getTime())&&e.includes("T"))return U(n)}return String(e)}function U(e){return new Intl.DateTimeFormat(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(e)}function he(e,n){return n.map(t=>{if(t.width)return t.width;let i=t.header.length,o=e.reduce((r,s)=>{let a=W(s[t.key]);return Math.max(r,a.length)},0);return Math.max(i,o)})}function ye(e,n){let t=[],i=he(e,n),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 "+n.map((c,p)=>c.header.padEnd(i[p])).join(" \u2502 ")+" \u2502";return t.push(a),t.push(r),e.forEach(c=>{let p=n.map((l,k)=>{let O=W(c[l.key]);return l.align==="right"?O.padStart(i[k]):O.padEnd(i[k])});t.push("\u2502 "+p.join(" \u2502 ")+" \u2502")}),t.push(s+`
5
5
  `),t.join(`
6
- `)}function L(n,e,t,o,i){switch(e){case"json":return se(n);case"xml":return ce(n,t,o);default:return ge(n,i)}}import{S3Client as qe}from"@aws-sdk/client-s3";import{homedir as ue}from"os";import{join as K}from"path";import{readFileSync as le,writeFileSync as fe,existsSync as F,mkdirSync as pe}from"fs";import{chmod as me}from"fs/promises";var I=K(ue(),".tigris"),y=K(I,"config.json");function he(){F(I)||pe(I,{recursive:!0,mode:448})}function g(){if(F(y))try{let n=le(y,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function f(n){he(),fe(y,JSON.stringify(n,null,2),{mode:384});try{await me(y,384)}catch{}}async function O(n){let e=g();e.tokens=n,await f(e)}async function p(){return g().tokens||null}async function v(){let n=g();delete n.tokens,await f(n)}async function U(n){let e=g();e.organizations=n,await f(e)}function V(){return g().organizations||[]}async function G(n){let e=g();e.selectedOrganization=n,await f(e)}function m(){return g().selectedOrganization||null}function w(){let n=g();return n.temporaryCredentials||n.credentials||null}async function q(n){let e=g();e.loginMethod=n,await f(e)}function T(){return g().loginMethod||null}import k from"axios";import ye from"open";function C(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var B=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function H(){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=C(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await k.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 ye(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await O(i),q("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,t){let i=0;for(;i<60;){i++;try{let s=(await k.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(k.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 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 k.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:t.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,r={accessToken:i.access_token,refreshToken:i.refresh_token||t.refreshToken,idToken:i.id_token||t.idToken,expiresAt:Date.now()+(i.expires_in||3600)*1e3};return await O(r),r}catch{throw await v(),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"),r=JSON.parse(o)[B];if(!r)return;let s=r?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;U(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),V()}async logout(){await v()}async isAuthenticated(){return await p()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},M=null;function J(){return M||(M=new P),M}var W=H(),we=C();async function Te(){return T()}async function Y(){if(await Te()==="oauth"){let o=await J().getAccessToken();if(!m())throw new Error('No organization selected. Please run "tigris orgs select" first.');let r=W.endpoint,s=W.iamEndpoint,a=we.domain;return{sessionToken:o,accessKeyId:"",secretAccessKey:"",endpoint:r,organizationId:m()??void 0,iamEndpoint:s,authDomain:a}}let e=w();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import Me from"enquirer";import{readFileSync as Ce,existsSync as ke}from"fs";import{join as X,dirname as xe}from"path";import{fileURLToPath as Se}from"url";import*as Q from"yaml";var Ae=Se(import.meta.url),_e=xe(Ae),b=null;function Ie(){let n=_e;for(let e=0;e<5;e++){let t=X(n,"specs.yaml");if(ke(t))return t;n=X(n,"..")}throw new Error("Could not find specs.yaml")}function Oe(){if(!b){let n=Ie(),e=Ce(n,"utf8");b=Q.parse(e)}return b}function Z(n,e){let o=Oe().commands.find(i=>i.name===n);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var ee={success:"\u2714",failure:"\u2716",hint:"\u2192"};function z(){return process.stdout.isTTY===!0}function x(n){let e=Z(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,(o,i)=>{let r=e[i];return r!==void 0?String(r):`{{${i}}}`})),t}function ne(n,e){if(!z())return;let t=x(n);t?.onStart&&console.log(S(t.onStart,e))}function E(n,e){if(!z())return;let t=x(n);t?.onSuccess&&console.log(`${ee.success} ${S(t.onSuccess,e)}`)}function te(n,e,t){let o=x(n);o?.onFailure&&console.error(`${ee.failure} ${S(o.onFailure,t)}`),e&&console.error(` ${e}`)}function oe(n,e){if(!z())return;let t=x(n);t?.onEmpty&&console.log(S(t.onEmpty,e))}function ie(n,e){return{command:n,operation:e}}var h=ie("organizations","list");async function Pe(n){if(ne(h),T()!=="oauth"){w()?console.log(`You are using access key credentials, which belong to a single organization.
6
+ `)}function V(e,n,t,i,o){switch(n){case"json":return pe(e);case"xml":return me(e,t,i);default:return ye(e,o)}}import{S3Client as on}from"@aws-sdk/client-s3";import{fromIni as xe}from"@aws-sdk/credential-providers";import{homedir as Y}from"os";import{join as f}from"path";import{readFileSync as Te,writeFileSync as Ce,existsSync as C,mkdirSync as we}from"fs";import{loadSharedConfigFiles as Se}from"@smithy/shared-ini-file-loader";import{chmod as Ae}from"fs/promises";var u="https://t3.storage.dev",v="https://iam.storageapi.dev";var P=f(Y(),".tigris"),w=f(P,"config.json");function _e(){C(P)||we(P,{recursive:!0,mode:448})}function d(){if(C(w))try{let e=Te(w,"utf8");return JSON.parse(e)}catch{return{}}return{}}async function m(e){_e(),Ce(w,JSON.stringify(e,null,2),{mode:384});try{await Ae(w,384)}catch{}}async function N(e){let n=d();n.tokens=e,await m(n)}async function h(){return d().tokens||null}async function M(){let e=d();delete e.tokens,await m(e)}async function J(e){let n=d();n.organizations=e,await m(n)}function q(){return d().organizations||[]}async function B(e){let n=d();n.selectedOrganization=e,await m(n)}function y(){return d().selectedOrganization||null}function D(){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||u;return{accessKeyId:i,secretAccessKey:o,endpoint:r}}let e=process.env.AWS_ACCESS_KEY_ID,n=process.env.AWS_SECRET_ACCESS_KEY;if(!e||!n)return null;let t=process.env.AWS_ENDPOINT_URL_S3||u;return{accessKeyId:e,secretAccessKey:n,endpoint:t}}function H(){if(!process.env.AWS_PROFILE)return!1;let e=f(Y(),".aws");return C(f(e,"credentials"))||C(f(e,"config"))}async function X(e){try{let{configFile:n}=await Se(),t=n[e];return t?{endpoint:t.endpoint_url_s3||t.endpoint_url,iamEndpoint:t.endpoint_url_iam,region:t.region}:{}}catch{return{}}}function Q(){let e=d();return D()||e.temporaryCredentials||e.credentials||null}function R(){let e=d();return e.temporaryCredentials||e.credentials||null}async function Z(e){let n=d();n.loginMethod=e,await m(n)}function S(){return d().loginMethod||null}import _ from"axios";import Ie from"open";function A(){let e=process.env.TIGRIS_ENV==="development",n=process.env.AUTH0_DOMAIN||e?"auth-dev.tigris.dev":"auth.tigris.dev",t=process.env.AUTH0_CLIENT_ID||e?"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF":"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",i=process.env.AUTH0_AUDIENCE||e?"https://tigris-api-dev":"https://tigris-os-api";return{domain:n,clientId:t,audience:i}}var ee=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function ne(){return process.env.TIGRIS_STORAGE_ENDPOINT||process.env.TIGRIS_IAM_ENDPOINT?{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||u,iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||v}:{endpoint:process.env.AWS_ENDPOINT_URL_S3||u,iamEndpoint:process.env.AWS_ENDPOINT_URL_IAM||v}}var K=class{config;baseUrl;constructor(){this.config=A(),this.baseUrl=`https://${this.config.domain}`}async login(n){let i=(await _.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;n?.onDeviceCode?.(i.user_code,i.verification_uri),await this.sleep(2e3);try{await Ie(i.verification_uri_complete)}catch{}n?.onWaiting?.();let o=await this.pollForToken(i.device_code,i.interval||5);await N(o),Z("oauth"),await this.extractAndStoreOrganizations(o.idToken)}async pollForToken(n,t){let o=0;for(;o<60;){o++;try{let s=(await _.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:n,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(_.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 n=await h();if(!n)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let t=300*1e3;return Date.now()+t>=n.expiresAt&&(n=await this.refreshAccessToken(n)),n.accessToken}async refreshAccessToken(n){let t=null;if(n?.refreshToken?t=n:t=await h(),!t)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let o=(await _.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 N(r),r}catch{throw await M(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let n=await h();if(!n||!n.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let t=n.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(n){if(n)try{let t=n.split(".")[1],i=Buffer.from(t,"base64").toString("utf8"),r=JSON.parse(i)[ee];if(!r)return;let s=r?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;J(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),q()}async logout(){await M()}async isAuthenticated(){return await h()!==null}sleep(n){return new Promise(t=>setTimeout(t,n))}},b=null;function te(){return b||(b=new K),b}var I=ne(),Ee=A();async function ke(){return S()}async function ie(){if(H()){let i=process.env.AWS_PROFILE||"default",o=await X(i),r=await xe({profile:i})();return{accessKeyId:r.accessKeyId,secretAccessKey:r.secretAccessKey,endpoint:o.endpoint||I.endpoint||u,iamEndpoint:o.iamEndpoint||I.iamEndpoint}}let e=await ke();if(e==="oauth"){let o=await te().getAccessToken();if(!y())throw new Error('No organization selected. Please run "tigris orgs select" first.');return{sessionToken:o,accessKeyId:"",secretAccessKey:"",endpoint:I.endpoint,organizationId:y()??void 0,iamEndpoint:I.iamEndpoint,authDomain:Ee.domain}}if(e==="credentials"){let i=R();if(i)return{accessKeyId:i.accessKeyId,secretAccessKey:i.secretAccessKey,endpoint:i.endpoint}}let n=D();if(n)return{accessKeyId:n.accessKeyId,secretAccessKey:n.secretAccessKey,endpoint:n.endpoint};let t=R();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.')}import ze from"enquirer";import{readFileSync as Oe,existsSync as ve}from"fs";import{join as oe,dirname as Pe}from"path";import{fileURLToPath as Ne}from"url";import*as re from"yaml";var Me=Ne(import.meta.url),De=Pe(Me),z=null;function Re(){let e=De;for(let n=0;n<5;n++){let t=oe(e,"specs.yaml");if(ve(t))return t;e=oe(e,"..")}throw new Error("Could not find specs.yaml")}function be(){if(!z){let e=Re(),n=Oe(e,"utf8");z=re.parse(n)}return z}function se(e,n){let i=be().commands.find(o=>o.name===e);return i?n&&i.operations?i.operations.find(o=>o.name===n)||null:i:null}var ae={success:"\u2714",failure:"\u2716",hint:"\u2192"};function L(){return process.stdout.isTTY===!0}function x(e){let n=se(e.command,e.operation);if(n)return n.messages}function E(e,n){let t=e;return t=t.replace(/\\n/g,`
7
+ `),n&&(t=t.replace(/\{\{(\w+)\}\}/g,(i,o)=>{let r=n[o];return r!==void 0?String(r):`{{${o}}}`})),t}function ce(e,n){if(!L())return;let t=x(e);t?.onStart&&console.log(E(t.onStart,n))}function F(e,n){if(!L())return;let t=x(e);t?.onSuccess&&console.log(`${ae.success} ${E(t.onSuccess,n)}`)}function de(e,n,t){let i=x(e);i?.onFailure&&console.error(`${ae.failure} ${E(i.onFailure,t)}`),n&&console.error(` ${n}`)}function ge(e,n){if(!L())return;let t=x(e);t?.onEmpty&&console.log(E(t.onEmpty,n))}function le(e,n){return{command:e,operation:n}}var T=le("organizations","list");async function Le(e){if(ce(T),S()!=="oauth"){Q()?console.log(`You are using access key credentials, which belong to a single organization.
8
8
  Organization listing and selection is only available with OAuth login.
9
9
 
10
- Run "tigris login" to login with your Tigris account.`):console.log('Not authenticated. Please run "tigris login" to login with your Tigris account.');return}let t=R(n,["format","f","F"],"select"),o=await Y(),{data:i,error:r}=await ve({config:o});r&&(te(h,r.message),process.exit(1));let s=i?.organizations??[];if(s.length===0){oe(h);return}let a=m();if(t==="select"){let u=s.map(d=>({name:d.id,message:`${d.name} (${d.id})`,hint:d.id===a?"currently selected":void 0})),N=(await Me.prompt({type:"select",name:"organization",message:"Select an organization:",choices:u.map(d=>d.message),initial:a?s.findIndex(d=>d.id===a):0})).organization.match(/\(([^)]+)\)$/),D=N?N[1]:s[0].id;await G(D);let re=s.find(d=>d.id===D);E(h,{name:re?.name});return}let c=s.map(u=>({id:u.id,name:u.name,slug:u.slug,selected:u.id===a?"*":""})),l=L(c,t,"organizations","organization",[{key:"selected",header:" ",width:1},{key:"id",header:"ID"},{key:"name",header:"Name"},{key:"slug",header:"Slug"}]);console.log(l),E(h,{count:c.length})}export{Pe as default};
10
+ Run "tigris login" to login with your Tigris account.`):console.log('Not authenticated. Please run "tigris login" to login with your Tigris account.');return}let t=j(e,["format","f","F"],"select"),i=await ie(),{data:o,error:r}=await Ke({config:i});r&&(de(T,r.message),process.exit(1));let s=o?.organizations??[];if(s.length===0){ge(T);return}let a=y();if(t==="select"){let l=s.map(g=>({name:g.id,message:`${g.name} (${g.id})`,hint:g.id===a?"currently selected":void 0})),G=(await ze.prompt({type:"select",name:"organization",message:"Select an organization:",choices:l.map(g=>g.message),initial:a?s.findIndex(g=>g.id===a):0})).organization.match(/\(([^)]+)\)$/),$=G?G[1]:s[0].id;await B($);let ue=s.find(g=>g.id===$);F(T,{name:ue?.name});return}let c=s.map(l=>({id:l.id,name:l.name,slug:l.slug,selected:l.id===a?"*":""})),p=V(c,t,"organizations","organization",[{key:"selected",header:" ",width:1},{key:"id",header:"ID"},{key:"name",header:"Name"},{key:"slug",header:"Slug"}]);console.log(p),F(T,{count:c.length})}export{Le as default};
@@ -1,9 +1,9 @@
1
- import{listOrganizations as ue}from"@tigrisdata/iam";function O(n,e,t){for(let o of e)if(n[o]!==void 0)return n[o];return t}import{S3Client as Ie}from"@aws-sdk/client-s3";import{homedir as J}from"os";import{join as P}from"path";import{readFileSync as W,writeFileSync as Q,existsSync as b,mkdirSync as X}from"fs";import{chmod as Z}from"fs/promises";var T=P(J(),".tigris"),f=P(T,"config.json");function ee(){b(T)||X(T,{recursive:!0,mode:448})}function c(){if(b(f))try{let n=W(f,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function g(n){ee(),Q(f,JSON.stringify(n,null,2),{mode:384});try{await Z(f,384)}catch{}}async function w(n){let e=c();e.tokens=n,await g(e)}async function d(){return c().tokens||null}async function k(){let n=c();delete n.tokens,await g(n)}async function z(n){let e=c();e.organizations=n,await g(e)}function E(){return c().organizations||[]}async function N(n){let e=c();e.selectedOrganization=n,await g(e)}function S(){return c().selectedOrganization||null}function p(){let n=c();return n.temporaryCredentials||n.credentials||null}async function D(n){let e=c();e.loginMethod=n,await g(e)}function m(){return c().loginMethod||null}import y from"axios";import ne 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 R=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function $(){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=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 w(i),D("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,t){let i=0;for(;i<60;){i++;try{let a=(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,s=Date.now()+(a.expires_in||3600)*1e3;return{accessToken:a.access_token,refreshToken:a.refresh_token,idToken:a.id_token,expiresAt:s}}catch(r){if(y.isAxiosError(r)&&r.response){let a=r.response.data?.error;if(a==="authorization_pending"){await this.sleep(t*1e3);continue}if(a==="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 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 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,r={accessToken:i.access_token,refreshToken:i.refresh_token||t.refreshToken,idToken:i.id_token||t.idToken,expiresAt:Date.now()+(i.expires_in||3600)*1e3};return await w(r),r}catch{throw await k(),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],o=Buffer.from(t,"base64").toString("utf8");return JSON.parse(o)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let t=e.split(".")[1],o=Buffer.from(t,"base64").toString("utf8"),r=JSON.parse(o)[R];if(!r)return;let a=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(a.length===0)return;z(a)}catch{}}async getOrganizations(){return await this.getAccessToken(),E()}async logout(){await k()}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},x=null;function L(){return x||(x=new A),x}var K=$(),te=h();async function oe(){return m()}async function F(){if(await oe()==="oauth"){let o=await L().getAccessToken();if(!S())throw new Error('No organization selected. Please run "tigris orgs select" first.');let r=K.endpoint,a=K.iamEndpoint,s=te.domain;return{sessionToken:o,accessKeyId:"",secretAccessKey:"",endpoint:r,organizationId:S()??void 0,iamEndpoint:a,authDomain:s}}let e=p();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{readFileSync as ie,existsSync as re}from"fs";import{join as j,dirname as se}from"path";import{fileURLToPath as ae}from"url";import*as U from"yaml";var ce=ae(import.meta.url),ge=se(ce),v=null;function de(){let n=ge;for(let e=0;e<5;e++){let t=j(n,"specs.yaml");if(re(t))return t;n=j(n,"..")}throw new Error("Could not find specs.yaml")}function le(){if(!v){let n=de(),e=ie(n,"utf8");v=U.parse(e)}return v}function G(n,e){let o=le().commands.find(i=>i.name===n);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var V={success:"\u2714",failure:"\u2716",hint:"\u2192"};function q(){return process.stdout.isTTY===!0}function _(n){let e=G(n.command,n.operation);if(e)return e.messages}function I(n,e){let t=n;return t=t.replace(/\\n/g,`
2
- `),e&&(t=t.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let r=e[i];return r!==void 0?String(r):`{{${i}}}`})),t}function H(n,e){if(!q())return;let t=_(n);t?.onStart&&console.log(I(t.onStart,e))}function Y(n,e){if(!q())return;let t=_(n);t?.onSuccess&&console.log(`${V.success} ${I(t.onSuccess,e)}`)}function C(n,e,t){let o=_(n);o?.onFailure&&console.error(`${V.failure} ${I(o.onFailure,t)}`),e&&console.error(` ${e}`)}function B(n,e){return{command:n,operation:e}}var l=B("organizations","select");async function fe(n){if(H(l),m()!=="oauth"){p()?console.log(`You are using access key credentials, which belong to a single organization.
1
+ import{listOrganizations as Se}from"@tigrisdata/iam";function K(n,e,t){for(let o of e)if(n[o]!==void 0)return n[o];return t}import{S3Client as Ge}from"@aws-sdk/client-s3";import{fromIni as de}from"@aws-sdk/credential-providers";import{homedir as b}from"os";import{join as l}from"path";import{readFileSync as te,writeFileSync as oe,existsSync as m,mkdirSync as ie}from"fs";import{loadSharedConfigFiles as se}from"@smithy/shared-ini-file-loader";import{chmod as re}from"fs/promises";var d="https://t3.storage.dev",_="https://iam.storageapi.dev";var w=l(b(),".tigris"),h=l(w,"config.json");function ae(){m(w)||ie(w,{recursive:!0,mode:448})}function c(){if(m(h))try{let n=te(h,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function g(n){ae(),oe(h,JSON.stringify(n,null,2),{mode:384});try{await re(h,384)}catch{}}async function I(n){let e=c();e.tokens=n,await g(e)}async function p(){return c().tokens||null}async function E(){let n=c();delete n.tokens,await g(n)}async function z(n){let e=c();e.organizations=n,await g(e)}function L(){return c().organizations||[]}async function G(n){let e=c();e.selectedOrganization=n,await g(e)}function v(){return c().selectedOrganization||null}function x(){if(process.env.TIGRIS_STORAGE_ACCESS_KEY_ID||process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY){let o=process.env.TIGRIS_STORAGE_ACCESS_KEY_ID,i=process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY;if(!o||!i)return null;let s=process.env.TIGRIS_STORAGE_ENDPOINT||d;return{accessKeyId:o,secretAccessKey:i,endpoint:s}}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||d;return{accessKeyId:n,secretAccessKey:e,endpoint:t}}function F(){if(!process.env.AWS_PROFILE)return!1;let n=l(b(),".aws");return m(l(n,"credentials"))||m(l(n,"config"))}async function U(n){try{let{configFile:e}=await se(),t=e[n];return t?{endpoint:t.endpoint_url_s3||t.endpoint_url,iamEndpoint:t.endpoint_url_iam,region:t.region}:{}}catch{return{}}}function $(){let n=c();return x()||n.temporaryCredentials||n.credentials||null}function k(){let n=c();return n.temporaryCredentials||n.credentials||null}async function j(n){let e=c();e.loginMethod=n,await g(e)}function C(){return c().loginMethod||null}import T from"axios";import ce 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",o=process.env.AUTH0_AUDIENCE||n?"https://tigris-api-dev":"https://tigris-os-api";return{domain:e,clientId:t,audience:o}}var Y=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function W(){return process.env.TIGRIS_STORAGE_ENDPOINT||process.env.TIGRIS_IAM_ENDPOINT?{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||d,iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||_}:{endpoint:process.env.AWS_ENDPOINT_URL_S3||d,iamEndpoint:process.env.AWS_ENDPOINT_URL_IAM||_}}var P=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 ce(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await I(i),j("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,t){let i=0;for(;i<60;){i++;try{let a=(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,r=Date.now()+(a.expires_in||3600)*1e3;return{accessToken:a.access_token,refreshToken:a.refresh_token,idToken:a.id_token,expiresAt:r}}catch(s){if(T.isAxiosError(s)&&s.response){let a=s.response.data?.error;if(a==="authorization_pending"){await this.sleep(t*1e3);continue}if(a==="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 T.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 I(s),s}catch{throw await E(),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)[Y];if(!s)return;let a=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(a.length===0)return;z(a)}catch{}}async getOrganizations(){return await this.getAccessToken(),L()}async logout(){await E()}async isAuthenticated(){return await p()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},O=null;function V(){return O||(O=new P),O}var S=W(),le=y();async function ge(){return C()}async function q(){if(F()){let o=process.env.AWS_PROFILE||"default",i=await U(o),s=await de({profile:o})();return{accessKeyId:s.accessKeyId,secretAccessKey:s.secretAccessKey,endpoint:i.endpoint||S.endpoint||d,iamEndpoint:i.iamEndpoint||S.iamEndpoint}}let n=await ge();if(n==="oauth"){let i=await V().getAccessToken();if(!v())throw new Error('No organization selected. Please run "tigris orgs select" first.');return{sessionToken:i,accessKeyId:"",secretAccessKey:"",endpoint:S.endpoint,organizationId:v()??void 0,iamEndpoint:S.iamEndpoint,authDomain:le.domain}}if(n==="credentials"){let o=k();if(o)return{accessKeyId:o.accessKeyId,secretAccessKey:o.secretAccessKey,endpoint:o.endpoint}}let e=x();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};let t=k();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.')}import{readFileSync as pe,existsSync as fe}from"fs";import{join as H,dirname as ue}from"path";import{fileURLToPath as me}from"url";import*as J from"yaml";var he=me(import.meta.url),Ce=ue(he),N=null;function ye(){let n=Ce;for(let e=0;e<5;e++){let t=H(n,"specs.yaml");if(fe(t))return t;n=H(n,"..")}throw new Error("Could not find specs.yaml")}function Te(){if(!N){let n=ye(),e=pe(n,"utf8");N=J.parse(e)}return N}function B(n,e){let o=Te().commands.find(i=>i.name===n);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var Q={success:"\u2714",failure:"\u2716",hint:"\u2192"};function X(){return process.stdout.isTTY===!0}function M(n){let e=B(n.command,n.operation);if(e)return e.messages}function D(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 Z(n,e){if(!X())return;let t=M(n);t?.onStart&&console.log(D(t.onStart,e))}function ee(n,e){if(!X())return;let t=M(n);t?.onSuccess&&console.log(`${Q.success} ${D(t.onSuccess,e)}`)}function A(n,e,t){let o=M(n);o?.onFailure&&console.error(`${Q.failure} ${D(o.onFailure,t)}`),e&&console.error(` ${e}`)}function ne(n,e){return{command:n,operation:e}}var f=ne("organizations","select");async function Ae(n){if(Z(f),C()!=="oauth"){$()?console.log(`You are using access key credentials, which belong to a single organization.
3
3
  Organization selection is only available with OAuth login.
4
4
 
5
- Run "tigris login" to login with your Tigris account.`):console.log('Not authenticated. Please run "tigris login" to login with your Tigris account.');return}let t=O(n,["name","N"]);t||(C(l,"Organization name or ID is required"),process.exit(1));let o=await F(),{data:i,error:r}=await ue({config:o});r&&(C(l,r.message),process.exit(1));let a=i?.organizations??[],s=a.find(u=>u.id===t||u.name===t);if(!s){let u=a.map(M=>` - ${M.name} (${M.id})`).join(`
6
- `);C(l,`Organization "${t}" not found
5
+ Run "tigris login" to login with your Tigris account.`):console.log('Not authenticated. Please run "tigris login" to login with your Tigris account.');return}let t=K(n,["name","N"]);t||(A(f,"Organization name or ID is required"),process.exit(1));let o=await q(),{data:i,error:s}=await Se({config:o});s&&(A(f,s.message),process.exit(1));let a=i?.organizations??[],r=a.find(u=>u.id===t||u.name===t);if(!r){let u=a.map(R=>` - ${R.name} (${R.id})`).join(`
6
+ `);A(f,`Organization "${t}" not found
7
7
 
8
8
  Available organizations:
9
- ${u}`),process.exit(1)}await N(s.id),Y(l,{name:s.name})}export{fe as default};
9
+ ${u}`),process.exit(1)}await G(r.id),ee(f,{name:r.name})}export{Ae as default};
package/dist/lib/rm.js CHANGED
@@ -1 +1 @@
1
- import*as Q from"readline";import{list as M}from"@tigrisdata/storage";function z(n){let e=n.split("/");return{bucket:e[0],path:e.slice(1).join("/")}}async function R(n,e,o){let{data:t}=await M({prefix:`${e}/`,limit:1,config:{...o,bucket:n}});return!!(t?.items&&t.items.length>0)}async function $(n,e,o){let t=[],i;do{let{data:r,error:s}=await M({prefix:e,paginationToken:i,config:{...o,bucket:n}});if(s)return{items:t,error:s};r?.items&&t.push(...r.items),i=r?.hasMore?r.paginationToken:void 0}while(i);return{items:t}}function x(n,e,o){for(let t of e)if(n[t]!==void 0)return n[t];return o}import{S3Client as Ie}from"@aws-sdk/client-s3";import{homedir as X}from"os";import{join as D}from"path";import{readFileSync as Y,writeFileSync as Z,existsSync as L,mkdirSync as ee}from"fs";import{chmod as te}from"fs/promises";var v=D(X(),".tigris"),p=D(v,"config.json");function ne(){L(v)||ee(v,{recursive:!0,mode:448})}function d(){if(L(p))try{let n=Y(p,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function m(n){ne(),Z(p,JSON.stringify(n,null,2),{mode:384});try{await te(p,384)}catch{}}async function I(n){let e=d();e.tokens=n,await m(e)}async function f(){return d().tokens||null}async function A(){let n=d();delete n.tokens,await m(n)}async function F(n){let e=d();e.organizations=n,await m(e)}function K(){return d().organizations||[]}function P(){return d().selectedOrganization||null}function j(){let n=d();return n.temporaryCredentials||n.credentials||null}async function U(n){let e=d();e.loginMethod=n,await m(e)}function q(){return d().loginMethod||null}import w from"axios";import oe from"open";function h(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var G=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function B(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var S=class{config;baseUrl;constructor(){this.config=h(),this.baseUrl=`https://${this.config.domain}`}async login(e){let t=(await w.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(t.user_code,t.verification_uri),await this.sleep(2e3);try{await oe(t.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(t.device_code,t.interval||5);await I(i),U("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,o){let i=0;for(;i<60;){i++;try{let s=(await w.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(r){if(w.isAxiosError(r)&&r.response){let s=r.response.data?.error;if(s==="authorization_pending"){await this.sleep(o*1e3);continue}if(s==="slow_down"){o+=5,await this.sleep(o*1e3);continue}throw new Error(r.response.data?.error_description||"Authentication failed")}throw r}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await f();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let o=300*1e3;return Date.now()+o>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let o=null;if(e?.refreshToken?o=e:o=await f(),!o)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await w.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:o.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,r={accessToken:i.access_token,refreshToken:i.refresh_token||o.refreshToken,idToken:i.id_token||o.idToken,expiresAt:Date.now()+(i.expires_in||3600)*1e3};return await I(r),r}catch{throw await A(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await f();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let o=e.idToken.split(".")[1],t=Buffer.from(o,"base64").toString("utf8");return JSON.parse(t)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let o=e.split(".")[1],t=Buffer.from(o,"base64").toString("utf8"),r=JSON.parse(t)[G];if(!r)return;let s=r?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;F(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),K()}async logout(){await A()}async isAuthenticated(){return await f()!==null}sleep(e){return new Promise(o=>setTimeout(o,e))}},_=null;function H(){return _||(_=new S),_}var W=B(),ie=h();async function re(){return q()}async function J(){if(await re()==="oauth"){let t=await H().getAccessToken();if(!P())throw new Error('No organization selected. Please run "tigris orgs select" first.');let r=W.endpoint,s=W.iamEndpoint,a=ie.domain;return{sessionToken:t,accessKeyId:"",secretAccessKey:"",endpoint:r,organizationId:P()??void 0,iamEndpoint:s,authDomain:a}}let e=j();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{remove as O,removeBucket as se,list as ae}from"@tigrisdata/storage";async function b(n){let e=Q.createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{e.question(`${n} (y/N): `,t=>{e.close(),o(t.toLowerCase()==="y")})})}async function ce(n){let e=x(n,["path"]),o=x(n,["force","f","F"]);e||(console.error("path argument is required"),process.exit(1));let{bucket:t,path:i}=z(e);t||(console.error("Invalid path"),process.exit(1));let r=await J();if(!i){if(!o&&!await b(`Are you sure you want to delete bucket '${t}'?`)){console.log("Aborted");return}let{error:l}=await se(t,{config:r});l&&(console.error(l.message),process.exit(1)),console.log(`Removed bucket '${t}'`);return}let s=e.includes("*"),a=i.endsWith("/");if(!s&&!a&&(a=await R(t,i,r)),s||a){let l=s?i.replace("*",""):i.endsWith("/")?i:`${i}/`,{items:y,error:E}=await $(t,l||void 0,r);E&&(console.error(E.message),process.exit(1));let T=y,g=l,V=T.some(c=>c.name===g),k=!1;if(!V){let{data:c}=await ae({prefix:g,limit:1,config:{...r,bucket:t}});k=c?.items?.some(u=>u.name===g)||!1}let N=T.length+(k?1:0);if(N===0){console.log("No objects to remove");return}if(!o&&!await b(`Are you sure you want to delete ${N} object(s)?`)){console.log("Aborted");return}let C=0;for(let c of T){let{error:u}=await O(c.name,{config:{...r,bucket:t}});u?console.error(`Failed to remove ${c.name}: ${u.message}`):(console.log(`Removed ${t}/${c.name}`),C++)}if(k){let{error:c}=await O(g,{config:{...r,bucket:t}});c?console.error(`Failed to remove ${g}: ${c.message}`):(console.log(`Removed ${t}/${g}`),C++)}console.log(`Removed ${C} object(s)`)}else{if(!o&&!await b(`Are you sure you want to delete '${t}/${i}'?`)){console.log("Aborted");return}let{error:l}=await O(i,{config:{...r,bucket:t}});l&&(console.error(l.message),process.exit(1)),console.log(`Removed ${t}/${i}`)}process.exit(0)}export{ce as default};
1
+ import*as te from"readline";import{list as F}from"@tigrisdata/storage";function G(n){let e=n.split("/");return{bucket:e[0],path:e.slice(1).join("/")}}async function $(n,e,o){let{data:t}=await F({prefix:`${e}/`,limit:1,config:{...o,bucket:n}});return!!(t?.items&&t.items.length>0)}async function U(n,e,o){let t=[],i;do{let{data:r,error:s}=await F({prefix:e,paginationToken:i,config:{...o,bucket:n}});if(s)return{items:t,error:s};r?.items&&t.push(...r.items),i=r?.hasMore?r.paginationToken:void 0}while(i);return{items:t}}function E(n,e,o){for(let t of e)if(n[t]!==void 0)return n[t];return o}import{S3Client as be}from"@aws-sdk/client-s3";import{fromIni as le}from"@aws-sdk/credential-providers";import{homedir as W}from"os";import{join as p}from"path";import{readFileSync as oe,writeFileSync as ie,existsSync as h,mkdirSync as re}from"fs";import{loadSharedConfigFiles as se}from"@smithy/shared-ini-file-loader";import{chmod as ae}from"fs/promises";var f="https://t3.storage.dev",v="https://iam.storageapi.dev";var P=p(W(),".tigris"),T=p(P,"config.json");function ce(){h(P)||re(P,{recursive:!0,mode:448})}function d(){if(h(T))try{let n=oe(T,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function y(n){ce(),ie(T,JSON.stringify(n,null,2),{mode:384});try{await ae(T,384)}catch{}}async function x(n){let e=d();e.tokens=n,await y(e)}async function u(){return d().tokens||null}async function O(){let n=d();delete n.tokens,await y(n)}async function j(n){let e=d();e.organizations=n,await y(e)}function q(){return d().organizations||[]}function N(){return d().selectedOrganization||null}function H(){if(process.env.TIGRIS_STORAGE_ACCESS_KEY_ID||process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY){let t=process.env.TIGRIS_STORAGE_ACCESS_KEY_ID,i=process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY;if(!t||!i)return null;let r=process.env.TIGRIS_STORAGE_ENDPOINT||f;return{accessKeyId:t,secretAccessKey:i,endpoint:r}}let n=process.env.AWS_ACCESS_KEY_ID,e=process.env.AWS_SECRET_ACCESS_KEY;if(!n||!e)return null;let o=process.env.AWS_ENDPOINT_URL_S3||f;return{accessKeyId:n,secretAccessKey:e,endpoint:o}}function J(){if(!process.env.AWS_PROFILE)return!1;let n=p(W(),".aws");return h(p(n,"credentials"))||h(p(n,"config"))}async function Y(n){try{let{configFile:e}=await se(),o=e[n];return o?{endpoint:o.endpoint_url_s3||o.endpoint_url,iamEndpoint:o.endpoint_url_iam,region:o.region}:{}}catch{return{}}}function R(){let n=d();return n.temporaryCredentials||n.credentials||null}async function B(n){let e=d();e.loginMethod=n,await y(e)}function V(){return d().loginMethod||null}import C from"axios";import de from"open";function w(){let n=process.env.TIGRIS_ENV==="development",e=process.env.AUTH0_DOMAIN||n?"auth-dev.tigris.dev":"auth.tigris.dev",o=process.env.AUTH0_CLIENT_ID||n?"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF":"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",t=process.env.AUTH0_AUDIENCE||n?"https://tigris-api-dev":"https://tigris-os-api";return{domain:e,clientId:o,audience:t}}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||f,iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||v}:{endpoint:process.env.AWS_ENDPOINT_URL_S3||f,iamEndpoint:process.env.AWS_ENDPOINT_URL_IAM||v}}var D=class{config;baseUrl;constructor(){this.config=w(),this.baseUrl=`https://${this.config.domain}`}async login(e){let t=(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?.(t.user_code,t.verification_uri),await this.sleep(2e3);try{await de(t.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(t.device_code,t.interval||5);await x(i),B("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,o){let i=0;for(;i<60;){i++;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(o*1e3);continue}if(s==="slow_down"){o+=5,await this.sleep(o*1e3);continue}throw new Error(r.response.data?.error_description||"Authentication failed")}throw r}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await u();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let o=300*1e3;return Date.now()+o>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let o=null;if(e?.refreshToken?o=e:o=await u(),!o)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:o.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,r={accessToken:i.access_token,refreshToken:i.refresh_token||o.refreshToken,idToken:i.id_token||o.idToken,expiresAt:Date.now()+(i.expires_in||3600)*1e3};return await x(r),r}catch{throw await O(),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 o=e.idToken.split(".")[1],t=Buffer.from(o,"base64").toString("utf8");return JSON.parse(t)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let o=e.split(".")[1],t=Buffer.from(o,"base64").toString("utf8"),r=JSON.parse(t)[Q];if(!r)return;let s=r?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;j(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),q()}async logout(){await O()}async isAuthenticated(){return await u()!==null}sleep(e){return new Promise(o=>setTimeout(o,e))}},K=null;function Z(){return K||(K=new D),K}var I=X(),fe=w();async function ge(){return V()}async function ee(){if(J()){let t=process.env.AWS_PROFILE||"default",i=await Y(t),r=await le({profile:t})();return{accessKeyId:r.accessKeyId,secretAccessKey:r.secretAccessKey,endpoint:i.endpoint||I.endpoint||f,iamEndpoint:i.iamEndpoint||I.iamEndpoint}}let n=await ge();if(n==="oauth"){let i=await Z().getAccessToken();if(!N())throw new Error('No organization selected. Please run "tigris orgs select" first.');return{sessionToken:i,accessKeyId:"",secretAccessKey:"",endpoint:I.endpoint,organizationId:N()??void 0,iamEndpoint:I.iamEndpoint,authDomain:fe.domain}}if(n==="credentials"){let t=R();if(t)return{accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey,endpoint:t.endpoint}}let e=H();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};let o=R();if(o)return{accessKeyId:o.accessKeyId,secretAccessKey:o.secretAccessKey,endpoint:o.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{remove as b,removeBucket as pe,list as ue}from"@tigrisdata/storage";async function M(n){let e=te.createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{e.question(`${n} (y/N): `,t=>{e.close(),o(t.toLowerCase()==="y")})})}async function me(n){let e=E(n,["path"]),o=E(n,["force","f","F"]);e||(console.error("path argument is required"),process.exit(1));let{bucket:t,path:i}=G(e);t||(console.error("Invalid path"),process.exit(1));let r=await ee();if(!i){if(!o&&!await M(`Are you sure you want to delete bucket '${t}'?`)){console.log("Aborted");return}let{error:l}=await pe(t,{config:r});l&&(console.error(l.message),process.exit(1)),console.log(`Removed bucket '${t}'`);return}let s=e.includes("*"),a=i.endsWith("/");if(!s&&!a&&(a=await $(t,i,r)),s||a){let l=s?i.replace("*",""):i.endsWith("/")?i:`${i}/`,{items:A,error:L}=await U(t,l||void 0,r);L&&(console.error(L.message),process.exit(1));let _=A,g=l,ne=_.some(c=>c.name===g),S=!1;if(!ne){let{data:c}=await ue({prefix:g,limit:1,config:{...r,bucket:t}});S=c?.items?.some(m=>m.name===g)||!1}let z=_.length+(S?1:0);if(z===0){console.log("No objects to remove");return}if(!o&&!await M(`Are you sure you want to delete ${z} object(s)?`)){console.log("Aborted");return}let k=0;for(let c of _){let{error:m}=await b(c.name,{config:{...r,bucket:t}});m?console.error(`Failed to remove ${c.name}: ${m.message}`):(console.log(`Removed ${t}/${c.name}`),k++)}if(S){let{error:c}=await b(g,{config:{...r,bucket:t}});c?console.error(`Failed to remove ${g}: ${c.message}`):(console.log(`Removed ${t}/${g}`),k++)}console.log(`Removed ${k} object(s)`)}else{if(!o&&!await M(`Are you sure you want to delete '${t}/${i}'?`)){console.log("Aborted");return}let{error:l}=await b(i,{config:{...r,bucket:t}});l&&(console.error(l.message),process.exit(1)),console.log(`Removed ${t}/${i}`)}process.exit(0)}export{me as default};
@@ -1,7 +1,7 @@
1
- function T(n,e,t){for(let o of e)if(n[o]!==void 0)return n[o];return t}function ne(n){return JSON.stringify(n,null,2)}function te(n,e=" "){return Object.entries(n).map(([t,o])=>`${e}<${t}>${o}</${t}>`).join(`
2
- `)}function oe(n,e,t){let o=[`<${e}>`];return n.forEach(i=>{o.push(` <${t}>`),o.push(te(i," ")),o.push(` </${t}>`)}),o.push(`</${e}>`),o.join(`
3
- `)}function N(n){if(n==null)return"";if(n instanceof Date)return E(n);if(typeof n=="string"){let e=new Date(n);if(!isNaN(e.getTime())&&n.includes("T"))return E(e)}return String(n)}function E(n){return new Intl.DateTimeFormat(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(n)}function ie(n,e){return e.map(t=>{if(t.width)return t.width;let o=t.header.length,i=n.reduce((r,s)=>{let a=N(s[t.key]);return Math.max(r,a.length)},0);return Math.max(o,i)})}function re(n,e){let t=[],o=ie(n,e),i="\u250C"+o.map(c=>"\u2500".repeat(c+2)).join("\u252C")+"\u2510",r="\u251C"+o.map(c=>"\u2500".repeat(c+2)).join("\u253C")+"\u2524",s="\u2514"+o.map(c=>"\u2500".repeat(c+2)).join("\u2534")+"\u2518";t.push(`
4
- `+i);let a="\u2502 "+e.map((c,C)=>c.header.padEnd(o[C])).join(" \u2502 ")+" \u2502";return t.push(a),t.push(r),n.forEach(c=>{let C=e.map((O,P)=>{let b=N(c[O.key]);return O.align==="right"?b.padStart(o[P]):b.padEnd(o[P])});t.push("\u2502 "+C.join(" \u2502 ")+" \u2502")}),t.push(s+`
1
+ function _(e,n,t){for(let o of n)if(e[o]!==void 0)return e[o];return t}function ae(e){return JSON.stringify(e,null,2)}function ce(e,n=" "){return Object.entries(e).map(([t,o])=>`${n}<${t}>${o}</${t}>`).join(`
2
+ `)}function de(e,n,t){let o=[`<${n}>`];return e.forEach(i=>{o.push(` <${t}>`),o.push(ce(i," ")),o.push(` </${t}>`)}),o.push(`</${n}>`),o.join(`
3
+ `)}function F(e){if(e==null)return"";if(e instanceof Date)return z(e);if(typeof e=="string"){let n=new Date(e);if(!isNaN(n.getTime())&&e.includes("T"))return z(n)}return String(e)}function z(e){return new Intl.DateTimeFormat(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(e)}function pe(e,n){return n.map(t=>{if(t.width)return t.width;let o=t.header.length,i=e.reduce((r,s)=>{let a=F(s[t.key]);return Math.max(r,a.length)},0);return Math.max(o,i)})}function ue(e,n){let t=[],o=pe(e,n),i="\u250C"+o.map(c=>"\u2500".repeat(c+2)).join("\u252C")+"\u2510",r="\u251C"+o.map(c=>"\u2500".repeat(c+2)).join("\u253C")+"\u2524",s="\u2514"+o.map(c=>"\u2500".repeat(c+2)).join("\u2534")+"\u2518";t.push(`
4
+ `+i);let a="\u2502 "+n.map((c,A)=>c.header.padEnd(o[A])).join(" \u2502 ")+" \u2502";return t.push(a),t.push(r),e.forEach(c=>{let A=n.map((K,b)=>{let L=F(c[K.key]);return K.align==="right"?L.padStart(o[b]):L.padEnd(o[b])});t.push("\u2502 "+A.join(" \u2502 ")+" \u2502")}),t.push(s+`
5
5
  `),t.join(`
6
- `)}function D(n,e,t,o,i){switch(e){case"json":return ne(n);case"xml":return oe(n,t,o);default:return re(n,i)}}import{S3Client as Ke}from"@aws-sdk/client-s3";import{homedir as se}from"os";import{join as z}from"path";import{readFileSync as ae,writeFileSync as ce,existsSync as R,mkdirSync as de}from"fs";import{chmod as ue}from"fs/promises";var w=z(se(),".tigris"),l=z(w,"config.json");function ge(){R(w)||de(w,{recursive:!0,mode:448})}function d(){if(R(l))try{let n=ae(l,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function f(n){ge(),ce(l,JSON.stringify(n,null,2),{mode:384});try{await ue(l,384)}catch{}}async function k(n){let e=d();e.tokens=n,await f(e)}async function u(){return d().tokens||null}async function x(){let n=d();delete n.tokens,await f(n)}async function j(n){let e=d();e.organizations=n,await f(e)}function $(){return d().organizations||[]}function S(){return d().selectedOrganization||null}function K(){let n=d();return n.temporaryCredentials||n.credentials||null}async function L(n){let e=d();e.loginMethod=n,await f(e)}function F(){return d().loginMethod||null}import m from"axios";import le from"open";function p(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var U=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function V(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var _=class{config;baseUrl;constructor(){this.config=p(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await m.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(o.user_code,o.verification_uri),await this.sleep(2e3);try{await le(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await k(i),L("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,t){let i=0;for(;i<60;){i++;try{let s=(await m.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(r){if(m.isAxiosError(r)&&r.response){let s=r.response.data?.error;if(s==="authorization_pending"){await this.sleep(t*1e3);continue}if(s==="slow_down"){t+=5,await this.sleep(t*1e3);continue}throw new Error(r.response.data?.error_description||"Authentication failed")}throw r}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await u();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let t=300*1e3;return Date.now()+t>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let t=null;if(e?.refreshToken?t=e:t=await u(),!t)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await m.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:t.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,r={accessToken:i.access_token,refreshToken:i.refresh_token||t.refreshToken,idToken:i.id_token||t.idToken,expiresAt:Date.now()+(i.expires_in||3600)*1e3};return await k(r),r}catch{throw await x(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await u();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let t=e.idToken.split(".")[1],o=Buffer.from(t,"base64").toString("utf8");return JSON.parse(o)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let t=e.split(".")[1],o=Buffer.from(t,"base64").toString("utf8"),r=JSON.parse(o)[U];if(!r)return;let s=r?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;j(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),$()}async logout(){await x()}async isAuthenticated(){return await u()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},A=null;function B(){return A||(A=new _),A}var G=V(),fe=p();async function pe(){return F()}async function q(){if(await pe()==="oauth"){let o=await B().getAccessToken();if(!S())throw new Error('No organization selected. Please run "tigris orgs select" first.');let r=G.endpoint,s=G.iamEndpoint,a=fe.domain;return{sessionToken:o,accessKeyId:"",secretAccessKey:"",endpoint:r,organizationId:S()??void 0,iamEndpoint:s,authDomain:a}}let e=K();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{listBucketSnapshots as Se}from"@tigrisdata/storage";import{readFileSync as me,existsSync as he}from"fs";import{join as H,dirname as ye}from"path";import{fileURLToPath as Ce}from"url";import*as J from"yaml";var Te=Ce(import.meta.url),we=ye(Te),v=null;function ke(){let n=we;for(let e=0;e<5;e++){let t=H(n,"specs.yaml");if(he(t))return t;n=H(n,"..")}throw new Error("Could not find specs.yaml")}function xe(){if(!v){let n=ke(),e=me(n,"utf8");v=J.parse(e)}return v}function W(n,e){let o=xe().commands.find(i=>i.name===n);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var Y={success:"\u2714",failure:"\u2716",hint:"\u2192"};function I(){return process.stdout.isTTY===!0}function h(n){let e=W(n.command,n.operation);if(e)return e.messages}function y(n,e){let t=n;return t=t.replace(/\\n/g,`
7
- `),e&&(t=t.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let r=e[i];return r!==void 0?String(r):`{{${i}}}`})),t}function X(n,e){if(!I())return;let t=h(n);t?.onStart&&console.log(y(t.onStart,e))}function Q(n,e){if(!I())return;let t=h(n);t?.onSuccess&&console.log(`${Y.success} ${y(t.onSuccess,e)}`)}function M(n,e,t){let o=h(n);o?.onFailure&&console.error(`${Y.failure} ${y(o.onFailure,t)}`),e&&console.error(` ${e}`)}function Z(n,e){if(!I())return;let t=h(n);t?.onEmpty&&console.log(y(t.onEmpty,e))}function ee(n,e){return{command:n,operation:e}}var g=ee("snapshots","list");async function Ae(n){X(g);let e=T(n,["name"]),t=T(n,["format","f","F"],"table");e||(M(g,"Bucket name is required"),process.exit(1));let o=await q(),{data:i,error:r}=await Se(e,{config:o});if(r&&(M(g,r.message),process.exit(1)),!i||i.length===0){Z(g);return}let s=i.map(c=>({name:c.name||"",version:c.version||"",created:c.creationDate})),a=D(s,t,"snapshots","snapshot",[{key:"name",header:"Name"},{key:"version",header:"Version"},{key:"created",header:"Created"}]);console.log(a),Q(g,{count:s.length})}export{Ae as default};
6
+ `)}function G(e,n,t,o,i){switch(n){case"json":return ae(e);case"xml":return de(e,t,o);default:return ue(e,i)}}import{S3Client as He}from"@aws-sdk/client-s3";import{fromIni as ye}from"@aws-sdk/credential-providers";import{homedir as j}from"os";import{join as u}from"path";import{readFileSync as ge,writeFileSync as le,existsSync as f,mkdirSync as fe}from"fs";import{loadSharedConfigFiles as me}from"@smithy/shared-ini-file-loader";import{chmod as he}from"fs/promises";var p="https://t3.storage.dev",I="https://iam.storageapi.dev";var x=u(j(),".tigris"),m=u(x,"config.json");function Te(){f(x)||fe(x,{recursive:!0,mode:448})}function d(){if(f(m))try{let e=ge(m,"utf8");return JSON.parse(e)}catch{return{}}return{}}async function h(e){Te(),le(m,JSON.stringify(e,null,2),{mode:384});try{await he(m,384)}catch{}}async function E(e){let n=d();n.tokens=e,await h(n)}async function g(){return d().tokens||null}async function k(){let e=d();delete e.tokens,await h(e)}async function $(e){let n=d();n.organizations=e,await h(n)}function U(){return d().organizations||[]}function v(){return d().selectedOrganization||null}function W(){if(process.env.TIGRIS_STORAGE_ACCESS_KEY_ID||process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY){let o=process.env.TIGRIS_STORAGE_ACCESS_KEY_ID,i=process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY;if(!o||!i)return null;let r=process.env.TIGRIS_STORAGE_ENDPOINT||p;return{accessKeyId:o,secretAccessKey:i,endpoint:r}}let e=process.env.AWS_ACCESS_KEY_ID,n=process.env.AWS_SECRET_ACCESS_KEY;if(!e||!n)return null;let t=process.env.AWS_ENDPOINT_URL_S3||p;return{accessKeyId:e,secretAccessKey:n,endpoint:t}}function V(){if(!process.env.AWS_PROFILE)return!1;let e=u(j(),".aws");return f(u(e,"credentials"))||f(u(e,"config"))}async function Y(e){try{let{configFile:n}=await me(),t=n[e];return t?{endpoint:t.endpoint_url_s3||t.endpoint_url,iamEndpoint:t.endpoint_url_iam,region:t.region}:{}}catch{return{}}}function O(){let e=d();return e.temporaryCredentials||e.credentials||null}async function B(e){let n=d();n.loginMethod=e,await h(n)}function J(){return d().loginMethod||null}import C from"axios";import Ce from"open";function T(){let e=process.env.TIGRIS_ENV==="development",n=process.env.AUTH0_DOMAIN||e?"auth-dev.tigris.dev":"auth.tigris.dev",t=process.env.AUTH0_CLIENT_ID||e?"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF":"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",o=process.env.AUTH0_AUDIENCE||e?"https://tigris-api-dev":"https://tigris-os-api";return{domain:n,clientId:t,audience:o}}var q=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||p,iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||I}:{endpoint:process.env.AWS_ENDPOINT_URL_S3||p,iamEndpoint:process.env.AWS_ENDPOINT_URL_IAM||I}}var N=class{config;baseUrl;constructor(){this.config=T(),this.baseUrl=`https://${this.config.domain}`}async login(n){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;n?.onDeviceCode?.(o.user_code,o.verification_uri),await this.sleep(2e3);try{await Ce(o.verification_uri_complete)}catch{}n?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await E(i),B("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(n,t){let i=0;for(;i<60;){i++;try{let s=(await C.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:n,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 n=await g();if(!n)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let t=300*1e3;return Date.now()+t>=n.expiresAt&&(n=await this.refreshAccessToken(n)),n.accessToken}async refreshAccessToken(n){let t=null;if(n?.refreshToken?t=n:t=await g(),!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,r={accessToken:i.access_token,refreshToken:i.refresh_token||t.refreshToken,idToken:i.id_token||t.idToken,expiresAt:Date.now()+(i.expires_in||3600)*1e3};return await E(r),r}catch{throw await k(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let n=await g();if(!n||!n.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let t=n.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(n){if(n)try{let t=n.split(".")[1],o=Buffer.from(t,"base64").toString("utf8"),r=JSON.parse(o)[q];if(!r)return;let s=r?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;$(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),U()}async logout(){await k()}async isAuthenticated(){return await g()!==null}sleep(n){return new Promise(t=>setTimeout(t,n))}},P=null;function X(){return P||(P=new N),P}var y=H(),Se=T();async function we(){return J()}async function Q(){if(V()){let o=process.env.AWS_PROFILE||"default",i=await Y(o),r=await ye({profile:o})();return{accessKeyId:r.accessKeyId,secretAccessKey:r.secretAccessKey,endpoint:i.endpoint||y.endpoint||p,iamEndpoint:i.iamEndpoint||y.iamEndpoint}}let e=await we();if(e==="oauth"){let i=await X().getAccessToken();if(!v())throw new Error('No organization selected. Please run "tigris orgs select" first.');return{sessionToken:i,accessKeyId:"",secretAccessKey:"",endpoint:y.endpoint,organizationId:v()??void 0,iamEndpoint:y.iamEndpoint,authDomain:Se.domain}}if(e==="credentials"){let o=O();if(o)return{accessKeyId:o.accessKeyId,secretAccessKey:o.secretAccessKey,endpoint:o.endpoint}}let n=W();if(n)return{accessKeyId:n.accessKeyId,secretAccessKey:n.secretAccessKey,endpoint:n.endpoint};let t=O();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.')}import{listBucketSnapshots as Pe}from"@tigrisdata/storage";import{readFileSync as Ae,existsSync as _e}from"fs";import{join as Z,dirname as Ie}from"path";import{fileURLToPath as xe}from"url";import*as ee from"yaml";var Ee=xe(import.meta.url),ke=Ie(Ee),D=null;function ve(){let e=ke;for(let n=0;n<5;n++){let t=Z(e,"specs.yaml");if(_e(t))return t;e=Z(e,"..")}throw new Error("Could not find specs.yaml")}function Oe(){if(!D){let e=ve(),n=Ae(e,"utf8");D=ee.parse(n)}return D}function ne(e,n){let o=Oe().commands.find(i=>i.name===e);return o?n&&o.operations?o.operations.find(i=>i.name===n)||null:o:null}var te={success:"\u2714",failure:"\u2716",hint:"\u2192"};function M(){return process.stdout.isTTY===!0}function S(e){let n=ne(e.command,e.operation);if(n)return n.messages}function w(e,n){let t=e;return t=t.replace(/\\n/g,`
7
+ `),n&&(t=t.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let r=n[i];return r!==void 0?String(r):`{{${i}}}`})),t}function oe(e,n){if(!M())return;let t=S(e);t?.onStart&&console.log(w(t.onStart,n))}function ie(e,n){if(!M())return;let t=S(e);t?.onSuccess&&console.log(`${te.success} ${w(t.onSuccess,n)}`)}function R(e,n,t){let o=S(e);o?.onFailure&&console.error(`${te.failure} ${w(o.onFailure,t)}`),n&&console.error(` ${n}`)}function re(e,n){if(!M())return;let t=S(e);t?.onEmpty&&console.log(w(t.onEmpty,n))}function se(e,n){return{command:e,operation:n}}var l=se("snapshots","list");async function Ne(e){oe(l);let n=_(e,["name"]),t=_(e,["format","f","F"],"table");n||(R(l,"Bucket name is required"),process.exit(1));let o=await Q(),{data:i,error:r}=await Pe(n,{config:o});if(r&&(R(l,r.message),process.exit(1)),!i||i.length===0){re(l);return}let s=i.map(c=>({name:c.name||"",version:c.version||"",created:c.creationDate})),a=G(s,t,"snapshots","snapshot",[{key:"name",header:"Name"},{key:"version",header:"Version"},{key:"created",header:"Created"}]);console.log(a),ie(l,{count:s.length})}export{Ne as default};
@@ -1,2 +1,2 @@
1
- function m(t,e,n){for(let o of e)if(t[o]!==void 0)return t[o];return n}import{S3Client as Ae}from"@aws-sdk/client-s3";import{homedir as B}from"os";import{join as _}from"path";import{readFileSync as H,writeFileSync as J,existsSync as I,mkdirSync as Y}from"fs";import{chmod as W}from"fs/promises";var h=_(B(),".tigris"),g=_(h,"config.json");function Q(){I(h)||Y(h,{recursive:!0,mode:448})}function c(){if(I(g))try{let t=H(g,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function l(t){Q(),J(g,JSON.stringify(t,null,2),{mode:384});try{await W(g,384)}catch{}}async function y(t){let e=c();e.tokens=t,await l(e)}async function d(){return c().tokens||null}async function C(){let t=c();delete t.tokens,await l(t)}async function M(t){let e=c();e.organizations=t,await l(e)}function P(){return c().organizations||[]}function T(){return c().selectedOrganization||null}function O(){let t=c();return t.temporaryCredentials||t.credentials||null}async function E(t){let e=c();e.loginMethod=t,await l(e)}function b(){return c().loginMethod||null}import u from"axios";import X from"open";function p(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var N=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function z(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var k=class{config;baseUrl;constructor(){this.config=p(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await u.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(o.user_code,o.verification_uri),await this.sleep(2e3);try{await X(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await y(i),E("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,n){let i=0;for(;i<60;){i++;try{let s=(await u.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(r){if(u.isAxiosError(r)&&r.response){let s=r.response.data?.error;if(s==="authorization_pending"){await this.sleep(n*1e3);continue}if(s==="slow_down"){n+=5,await this.sleep(n*1e3);continue}throw new Error(r.response.data?.error_description||"Authentication failed")}throw r}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await d();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let n=300*1e3;return Date.now()+n>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let n=null;if(e?.refreshToken?n=e:n=await d(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await u.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:n.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,r={accessToken:i.access_token,refreshToken:i.refresh_token||n.refreshToken,idToken:i.id_token||n.idToken,expiresAt:Date.now()+(i.expires_in||3600)*1e3};return await y(r),r}catch{throw await C(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await d();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let n=e.idToken.split(".")[1],o=Buffer.from(n,"base64").toString("utf8");return JSON.parse(o)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let n=e.split(".")[1],o=Buffer.from(n,"base64").toString("utf8"),r=JSON.parse(o)[N];if(!r)return;let s=r?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;M(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),P()}async logout(){await C()}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},w=null;function D(){return w||(w=new k),w}var R=z(),Z=p();async function ee(){return b()}async function K(){if(await ee()==="oauth"){let o=await D().getAccessToken();if(!T())throw new Error('No organization selected. Please run "tigris orgs select" first.');let r=R.endpoint,s=R.iamEndpoint,a=Z.domain;return{sessionToken:o,accessKeyId:"",secretAccessKey:"",endpoint:r,organizationId:T()??void 0,iamEndpoint:s,authDomain:a}}let e=O();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{createBucketSnapshot as de}from"@tigrisdata/storage";import{readFileSync as te,existsSync as ne}from"fs";import{join as L,dirname as oe}from"path";import{fileURLToPath as ie}from"url";import*as $ from"yaml";var re=ie(import.meta.url),se=oe(re),S=null;function ae(){let t=se;for(let e=0;e<5;e++){let n=L(t,"specs.yaml");if(ne(n))return n;t=L(t,"..")}throw new Error("Could not find specs.yaml")}function ce(){if(!S){let t=ae(),e=te(t,"utf8");S=$.parse(e)}return S}function F(t,e){let o=ce().commands.find(i=>i.name===t);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var j={success:"\u2714",failure:"\u2716",hint:"\u2192"};function U(){return process.stdout.isTTY===!0}function x(t){let e=F(t.command,t.operation);if(e)return e.messages}function A(t,e){let n=t;return n=n.replace(/\\n/g,`
2
- `),e&&(n=n.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let r=e[i];return r!==void 0?String(r):`{{${i}}}`})),n}function V(t,e){if(!U())return;let n=x(t);n?.onStart&&console.log(A(n.onStart,e))}function G(t,e){if(!U())return;let n=x(t);n?.onSuccess&&console.log(`${j.success} ${A(n.onSuccess,e)}`)}function v(t,e,n){let o=x(t);o?.onFailure&&console.error(`${j.failure} ${A(o.onFailure,n)}`),e&&console.error(` ${e}`)}function q(t,e){return{command:t,operation:e}}var f=q("snapshots","take");async function ge(t){V(f);let e=m(t,["name"]),n=m(t,["snapshot-name","snapshotName"]);e||(v(f,"Bucket name is required"),process.exit(1));let o=await K(),{data:i,error:r}=await de(e,{name:n,config:o});r&&(v(f,r.message),process.exit(1)),G(f,{name:e,snapshotName:n||i?.snapshotVersion,version:i?.snapshotVersion})}export{ge as default};
1
+ function T(n,e,t){for(let o of e)if(n[o]!==void 0)return n[o];return t}import{S3Client as Re}from"@aws-sdk/client-s3";import{fromIni as se}from"@aws-sdk/credential-providers";import{homedir as M}from"os";import{join as p}from"path";import{readFileSync as X,writeFileSync as Z,existsSync as g,mkdirSync as ee}from"fs";import{loadSharedConfigFiles as ne}from"@smithy/shared-ini-file-loader";import{chmod as te}from"fs/promises";var d="https://t3.storage.dev",S="https://iam.storageapi.dev";var A=p(M(),".tigris"),f=p(A,"config.json");function oe(){g(A)||ee(A,{recursive:!0,mode:448})}function c(){if(g(f))try{let n=X(f,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function u(n){oe(),Z(f,JSON.stringify(n,null,2),{mode:384});try{await te(f,384)}catch{}}async function _(n){let e=c();e.tokens=n,await u(e)}async function l(){return c().tokens||null}async function w(){let n=c();delete n.tokens,await u(n)}async function D(n){let e=c();e.organizations=n,await u(e)}function K(){return c().organizations||[]}function I(){return c().selectedOrganization||null}function R(){if(process.env.TIGRIS_STORAGE_ACCESS_KEY_ID||process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY){let o=process.env.TIGRIS_STORAGE_ACCESS_KEY_ID,i=process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY;if(!o||!i)return null;let s=process.env.TIGRIS_STORAGE_ENDPOINT||d;return{accessKeyId:o,secretAccessKey:i,endpoint:s}}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||d;return{accessKeyId:n,secretAccessKey:e,endpoint:t}}function b(){if(!process.env.AWS_PROFILE)return!1;let n=p(M(),".aws");return g(p(n,"credentials"))||g(p(n,"config"))}async function L(n){try{let{configFile:e}=await ne(),t=e[n];return t?{endpoint:t.endpoint_url_s3||t.endpoint_url,iamEndpoint:t.endpoint_url_iam,region:t.region}:{}}catch{return{}}}function E(){let n=c();return n.temporaryCredentials||n.credentials||null}async function z(n){let e=c();e.loginMethod=n,await u(e)}function G(){return c().loginMethod||null}import h from"axios";import ie 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 F=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function U(){return process.env.TIGRIS_STORAGE_ENDPOINT||process.env.TIGRIS_IAM_ENDPOINT?{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||d,iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||S}:{endpoint:process.env.AWS_ENDPOINT_URL_S3||d,iamEndpoint:process.env.AWS_ENDPOINT_URL_IAM||S}}var v=class{config;baseUrl;constructor(){this.config=m(),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 ie(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await _(i),z("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,t){let i=0;for(;i<60;){i++;try{let r=(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()+(r.expires_in||3600)*1e3;return{accessToken:r.access_token,refreshToken:r.refresh_token,idToken:r.id_token,expiresAt:a}}catch(s){if(h.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 h.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}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 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)[F];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(),K()}async logout(){await w()}async isAuthenticated(){return await l()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},k=null;function $(){return k||(k=new v),k}var C=U(),re=m();async function ae(){return G()}async function V(){if(b()){let o=process.env.AWS_PROFILE||"default",i=await L(o),s=await se({profile:o})();return{accessKeyId:s.accessKeyId,secretAccessKey:s.secretAccessKey,endpoint:i.endpoint||C.endpoint||d,iamEndpoint:i.iamEndpoint||C.iamEndpoint}}let n=await ae();if(n==="oauth"){let i=await $().getAccessToken();if(!I())throw new Error('No organization selected. Please run "tigris orgs select" first.');return{sessionToken:i,accessKeyId:"",secretAccessKey:"",endpoint:C.endpoint,organizationId:I()??void 0,iamEndpoint:C.iamEndpoint,authDomain:re.domain}}if(n==="credentials"){let o=E();if(o)return{accessKeyId:o.accessKeyId,secretAccessKey:o.secretAccessKey,endpoint:o.endpoint}}let e=R();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};let t=E();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.')}import{createBucketSnapshot as he}from"@tigrisdata/storage";import{readFileSync as ce,existsSync as de}from"fs";import{join as j,dirname as pe}from"path";import{fileURLToPath as le}from"url";import*as W from"yaml";var ge=le(import.meta.url),fe=pe(ge),x=null;function ue(){let n=fe;for(let e=0;e<5;e++){let t=j(n,"specs.yaml");if(de(t))return t;n=j(n,"..")}throw new Error("Could not find specs.yaml")}function me(){if(!x){let n=ue(),e=ce(n,"utf8");x=W.parse(e)}return x}function Y(n,e){let o=me().commands.find(i=>i.name===n);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var q={success:"\u2714",failure:"\u2716",hint:"\u2192"};function H(){return process.stdout.isTTY===!0}function O(n){let e=Y(n.command,n.operation);if(e)return e.messages}function P(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(!H())return;let t=O(n);t?.onStart&&console.log(P(t.onStart,e))}function J(n,e){if(!H())return;let t=O(n);t?.onSuccess&&console.log(`${q.success} ${P(t.onSuccess,e)}`)}function N(n,e,t){let o=O(n);o?.onFailure&&console.error(`${q.failure} ${P(o.onFailure,t)}`),e&&console.error(` ${e}`)}function Q(n,e){return{command:n,operation:e}}var y=Q("snapshots","take");async function Ce(n){B(y);let e=T(n,["name"]),t=T(n,["snapshot-name","snapshotName"]);e||(N(y,"Bucket name is required"),process.exit(1));let o=await V(),{data:i,error:s}=await he(e,{name:t,config:o});s&&(N(y,s.message),process.exit(1)),J(y,{name:e,snapshotName:t||i?.snapshotVersion,version:i?.snapshotVersion})}export{Ce as default};
package/dist/lib/touch.js CHANGED
@@ -1 +1 @@
1
- import{list as B}from"@tigrisdata/storage";function k(t){let e=t.split("/");return{bucket:e[0],path:e.slice(1).join("/")}}function C(t,e,n){for(let i of e)if(t[i]!==void 0)return t[i];return n}import{S3Client as ae}from"@aws-sdk/client-s3";import{homedir as b}from"os";import{join as x}from"path";import{readFileSync as D,writeFileSync as R,existsSync as I,mkdirSync as K}from"fs";import{chmod as L}from"fs/promises";var p=x(b(),".tigris"),g=x(p,"config.json");function j(){I(p)||K(p,{recursive:!0,mode:448})}function c(){if(I(g))try{let t=D(g,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function f(t){j(),R(g,JSON.stringify(t,null,2),{mode:384});try{await L(g,384)}catch{}}async function m(t){let e=c();e.tokens=t,await f(e)}async function d(){return c().tokens||null}async function h(){let t=c();delete t.tokens,await f(t)}async function P(t){let e=c();e.organizations=t,await f(e)}function A(){return c().organizations||[]}function T(){return c().selectedOrganization||null}function _(){let t=c();return t.temporaryCredentials||t.credentials||null}async function S(t){let e=c();e.loginMethod=t,await f(e)}function v(){return c().loginMethod||null}import u from"axios";import F from"open";function l(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var O=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function E(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var w=class{config;baseUrl;constructor(){this.config=l(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(await u.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(i.user_code,i.verification_uri),await this.sleep(2e3);try{await F(i.verification_uri_complete)}catch{}e?.onWaiting?.();let r=await this.pollForToken(i.device_code,i.interval||5);await m(r),S("oauth"),await this.extractAndStoreOrganizations(r.idToken)}async pollForToken(e,n){let r=0;for(;r<60;){r++;try{let s=(await u.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(o){if(u.isAxiosError(o)&&o.response){let s=o.response.data?.error;if(s==="authorization_pending"){await this.sleep(n*1e3);continue}if(s==="slow_down"){n+=5,await this.sleep(n*1e3);continue}throw new Error(o.response.data?.error_description||"Authentication failed")}throw o}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await d();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let n=300*1e3;return Date.now()+n>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let n=null;if(e?.refreshToken?n=e:n=await d(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let r=(await u.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:n.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,o={accessToken:r.access_token,refreshToken:r.refresh_token||n.refreshToken,idToken:r.id_token||n.idToken,expiresAt:Date.now()+(r.expires_in||3600)*1e3};return await m(o),o}catch{throw await h(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await d();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let n=e.idToken.split(".")[1],i=Buffer.from(n,"base64").toString("utf8");return JSON.parse(i)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let n=e.split(".")[1],i=Buffer.from(n,"base64").toString("utf8"),o=JSON.parse(i)[O];if(!o)return;let s=o?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;P(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),A()}async logout(){await h()}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},y=null;function N(){return y||(y=new w),y}var z=E(),U=l();async function q(){return v()}async function M(){if(await q()==="oauth"){let i=await N().getAccessToken();if(!T())throw new Error('No organization selected. Please run "tigris orgs select" first.');let o=z.endpoint,s=z.iamEndpoint,a=U.domain;return{sessionToken:i,accessKeyId:"",secretAccessKey:"",endpoint:o,organizationId:T()??void 0,iamEndpoint:s,authDomain:a}}let e=_();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{put as G}from"@tigrisdata/storage";async function $(t){let e=C(t,["path"]);e||(console.error("path argument is required"),process.exit(1));let{bucket:n,path:i}=k(e);n||(console.error("Invalid path"),process.exit(1)),i||(console.error("Object key is required (use mk to create buckets)"),process.exit(1));let r=await M(),{error:o}=await G(i,"",{config:{...r,bucket:n}});o&&(console.error(o.message),process.exit(1)),console.log(`Created '${n}/${i}'`),process.exit(0)}export{$ as default};
1
+ import{list as Z}from"@tigrisdata/storage";function k(t){let e=t.split("/");return{bucket:e[0],path:e.slice(1).join("/")}}function P(t,e,n){for(let i of e)if(t[i]!==void 0)return t[i];return n}import{S3Client as ye}from"@aws-sdk/client-s3";import{fromIni as Y}from"@aws-sdk/credential-providers";import{homedir as v}from"os";import{join as g}from"path";import{readFileSync as F,writeFileSync as U,existsSync as f,mkdirSync as j}from"fs";import{loadSharedConfigFiles as W}from"@smithy/shared-ini-file-loader";import{chmod as q}from"fs/promises";var d="https://t3.storage.dev",y="https://iam.storageapi.dev";var C=g(v(),".tigris"),p=g(C,"config.json");function H(){f(C)||j(C,{recursive:!0,mode:448})}function c(){if(f(p))try{let t=F(p,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function u(t){H(),U(p,JSON.stringify(t,null,2),{mode:384});try{await q(p,384)}catch{}}async function _(t){let e=c();e.tokens=t,await u(e)}async function l(){return c().tokens||null}async function I(){let t=c();delete t.tokens,await u(t)}async function x(t){let e=c();e.organizations=t,await u(e)}function O(){return c().organizations||[]}function w(){return c().selectedOrganization||null}function N(){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||d;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||d;return{accessKeyId:t,secretAccessKey:e,endpoint:n}}function K(){if(!process.env.AWS_PROFILE)return!1;let t=g(v(),".aws");return f(g(t,"credentials"))||f(g(t,"config"))}async function D(t){try{let{configFile:e}=await W(),n=e[t];return n?{endpoint:n.endpoint_url_s3||n.endpoint_url,iamEndpoint:n.endpoint_url_iam,region:n.region}:{}}catch{return{}}}function A(){let t=c();return t.temporaryCredentials||t.credentials||null}async function R(t){let e=c();e.loginMethod=t,await u(e)}function M(){return c().loginMethod||null}import h from"axios";import J from"open";function m(){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 z=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function L(){return process.env.TIGRIS_STORAGE_ENDPOINT||process.env.TIGRIS_IAM_ENDPOINT?{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||d,iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||y}:{endpoint:process.env.AWS_ENDPOINT_URL_S3||d,iamEndpoint:process.env.AWS_ENDPOINT_URL_IAM||y}}var E=class{config;baseUrl;constructor(){this.config=m(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(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?.(i.user_code,i.verification_uri),await this.sleep(2e3);try{await J(i.verification_uri_complete)}catch{}e?.onWaiting?.();let o=await this.pollForToken(i.device_code,i.interval||5);await _(o),R("oauth"),await this.extractAndStoreOrganizations(o.idToken)}async pollForToken(e,n){let o=0;for(;o<60;){o++;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 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 o=(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: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 _(r),r}catch{throw await I(),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],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)[z];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;x(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),O()}async logout(){await I()}async isAuthenticated(){return await l()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},S=null;function b(){return S||(S=new E),S}var T=L(),$=m();async function B(){return M()}async function G(){if(K()){let i=process.env.AWS_PROFILE||"default",o=await D(i),r=await Y({profile:i})();return{accessKeyId:r.accessKeyId,secretAccessKey:r.secretAccessKey,endpoint:o.endpoint||T.endpoint||d,iamEndpoint:o.iamEndpoint||T.iamEndpoint}}let t=await B();if(t==="oauth"){let o=await b().getAccessToken();if(!w())throw new Error('No organization selected. Please run "tigris orgs select" first.');return{sessionToken:o,accessKeyId:"",secretAccessKey:"",endpoint:T.endpoint,organizationId:w()??void 0,iamEndpoint:T.iamEndpoint,authDomain:$.domain}}if(t==="credentials"){let i=A();if(i)return{accessKeyId:i.accessKeyId,secretAccessKey:i.secretAccessKey,endpoint:i.endpoint}}let e=N();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};let n=A();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.')}import{put as V}from"@tigrisdata/storage";async function Q(t){let e=P(t,["path"]);e||(console.error("path argument is required"),process.exit(1));let{bucket:n,path:i}=k(e);n||(console.error("Invalid path"),process.exit(1)),i||(console.error("Object key is required (use mk to create buckets)"),process.exit(1));let o=await G(),{error:r}=await V(i,"",{config:{...o,bucket:n}});r&&(console.error(r.message),process.exit(1)),console.log(`Created '${n}/${i}'`),process.exit(0)}export{Q as default};