@tigrisdata/cli 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +381 -1
- package/dist/auth/client.js +1 -1
- package/dist/auth/config.js +1 -1
- package/dist/auth/s3-client.js +1 -1
- package/dist/auth/storage.js +1 -1
- package/dist/cli.js +11 -8
- package/dist/index.js +11 -8
- package/dist/lib/buckets/create.js +2 -2
- package/dist/lib/buckets/delete.js +2 -0
- package/dist/lib/buckets/get.js +7 -0
- package/dist/lib/buckets/list.js +6 -6
- package/dist/lib/configure/index.js +2 -2
- package/dist/lib/cp.js +1 -1
- package/dist/lib/forks/create.js +2 -0
- package/dist/lib/forks/list.js +7 -0
- package/dist/lib/login/credentials.js +2 -2
- package/dist/lib/login/oauth.js +5 -0
- package/dist/lib/login/select.js +5 -5
- package/dist/lib/logout.js +2 -2
- package/dist/lib/ls.js +6 -1
- package/dist/lib/mk.js +1 -1
- package/dist/lib/mv.js +1 -1
- package/dist/lib/objects/delete.js +2 -0
- package/dist/lib/objects/get.js +2 -0
- package/dist/lib/objects/list.js +7 -0
- package/dist/lib/objects/put.js +7 -0
- package/dist/lib/organizations/create.js +5 -0
- package/dist/lib/organizations/list.js +10 -0
- package/dist/lib/organizations/select.js +9 -0
- package/dist/lib/rm.js +1 -1
- package/dist/lib/snapshots/list.js +7 -0
- package/dist/lib/snapshots/take.js +2 -0
- package/dist/lib/touch.js +1 -0
- package/dist/lib/whoami.js +3 -3
- package/dist/specs.yaml +260 -259
- package/dist/utils/messages.js +2 -2
- package/dist/utils/path.js +1 -1
- package/package.json +13 -4
- package/dist/lib/login/ui.js +0 -5
- package/dist/lib/orgs/create.js +0 -2
- package/dist/lib/orgs/list.js +0 -7
- package/dist/lib/orgs/select.js +0 -6
- /package/dist/lib/{stat.js → _stat.js} +0 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
function z(n,e,t){for(let i of e)if(n[i]!==void 0)return n[i];return t}function ne(n){return JSON.stringify(n,null,2)}function te(n,e=" "){return Object.entries(n).map(([t,i])=>`${e}<${t}>${i}</${t}>`).join(`
|
|
2
|
+
`)}function ie(n,e,t){let i=[`<${e}>`];return n.forEach(o=>{i.push(` <${t}>`),i.push(te(o," ")),i.push(` </${t}>`)}),i.push(`</${e}>`),i.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 oe(n,e){return e.map(t=>{if(t.width)return t.width;let i=t.header.length,o=n.reduce((r,s)=>{let c=N(s[t.key]);return Math.max(r,c.length)},0);return Math.max(i,o)})}function re(n,e){let t=[],i=oe(n,e),o="\u250C"+i.map(a=>"\u2500".repeat(a+2)).join("\u252C")+"\u2510",r="\u251C"+i.map(a=>"\u2500".repeat(a+2)).join("\u253C")+"\u2524",s="\u2514"+i.map(a=>"\u2500".repeat(a+2)).join("\u2534")+"\u2518";t.push(`
|
|
4
|
+
`+o);let c="\u2502 "+e.map((a,h)=>a.header.padEnd(i[h])).join(" \u2502 ")+" \u2502";return t.push(c),t.push(r),n.forEach(a=>{let h=e.map((k,u)=>{let p=N(a[k.key]);return k.align==="right"?p.padStart(i[u]):p.padEnd(i[u])});t.push("\u2502 "+h.join(" \u2502 ")+" \u2502")}),t.push(s+`
|
|
5
|
+
`),t.join(`
|
|
6
|
+
`)}function D(n,e,t,i,o){switch(e){case"json":return ne(n);case"xml":return ie(n,t,i);default:return re(n,o)}}import T from"axios";import ue from"open";function R(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var $=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";import{homedir as se}from"os";import{join as j}from"path";import{readFileSync as ae,writeFileSync as ce,existsSync as F,mkdirSync as de}from"fs";import{chmod as le}from"fs/promises";var x=j(se(),".tigris"),y=j(x,"config.json");function ge(){F(x)||de(x,{recursive:!0,mode:448})}function l(){if(F(y))try{let n=ae(y,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function f(n){ge(),ce(y,JSON.stringify(n,null,2),{mode:384});try{await le(y,384)}catch{}}async function S(n){let e=l();e.tokens=n,await f(e)}async function m(){return l().tokens||null}async function A(){let n=l();delete n.tokens,await f(n)}async function L(n){let e=l();e.organizations=n,await f(e)}function U(){return l().organizations||[]}async function V(n){let e=l();e.selectedOrganization=n,await f(e)}function G(){return l().selectedOrganization||null}function B(){let n=l();return n.temporaryCredentials||n.credentials||null}async function J(n){let e=l();e.loginMethod=n,await f(e)}function W(){return l().loginMethod||null}var v=class{config;baseUrl;constructor(){this.config=R(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(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?.(i.user_code,i.verification_uri),await this.sleep(2e3);try{await ue(i.verification_uri_complete)}catch{}e?.onWaiting?.();let o=await this.pollForToken(i.device_code,i.interval||5);await S(o),J("oauth"),await this.extractAndStoreOrganizations(o.idToken)}async pollForToken(e,t){let o=0;for(;o<60;){o++;try{let s=(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,c=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:c}}catch(r){if(T.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 m();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 m(),!t)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let o=(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,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 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 t=e.idToken.split(".")[1],i=Buffer.from(t,"base64").toString("utf8");return JSON.parse(i)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let t=e.split(".")[1],i=Buffer.from(t,"base64").toString("utf8"),r=JSON.parse(i)[$];if(!r)return;let s=r?.ns?.map(c=>typeof c=="object"&&c!==null?{id:c.id,name:c.name,displayName:c.name}:{id:c,name:c,displayName:c})||[];if(s.length===0)return;L(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),U()}async logout(){await A()}async isAuthenticated(){return await m()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},_=null;function Y(){return _||(_=new v),_}import ke from"enquirer";import{readFileSync as pe,existsSync as fe}from"fs";import{join as H,dirname as me}from"path";import{fileURLToPath as he}from"url";import*as q from"yaml";var ye=he(import.meta.url),Te=me(ye),O=null;function Ce(){let n=Te;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 we(){if(!O){let n=Ce(),e=pe(n,"utf8");O=q.parse(e)}return O}function K(n,e){let i=we().commands.find(o=>o.name===n);return i?e&&i.operations?i.operations.find(o=>o.name===e)||null:i:null}var X={success:"\u2714",failure:"\u2716",hint:"\u2192"};function I(){return process.stdout.isTTY===!0}function C(n){let e=K(n.command,n.operation);if(e)return e.messages}function w(n,e){let t=n;return t=t.replace(/\\n/g,`
|
|
7
|
+
`),e&&(t=t.replace(/\{\{(\w+)\}\}/g,(i,o)=>{let r=e[o];return r!==void 0?String(r):`{{${o}}}`})),t}function Q(n,e){if(!I())return;let t=C(n);t?.onStart&&console.log(w(t.onStart,e))}function M(n,e){if(!I())return;let t=C(n);t?.onSuccess&&console.log(`${X.success} ${w(t.onSuccess,e)}`)}function b(n,e,t){let i=C(n);i?.onFailure&&console.error(`${X.failure} ${w(i.onFailure,t)}`),e&&console.error(` ${e}`)}function Z(n,e){if(!I())return;let t=C(n);t?.onEmpty&&console.log(w(t.onEmpty,e))}function ee(n,e){return{command:n,operation:e}}var g=ee("orgs","list");async function xe(n){if(Q(g),W()!=="oauth"){B()?console.log(`You are using access key credentials, which belong to a single organization.
|
|
8
|
+
Organization listing and selection is only available with OAuth login.
|
|
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=z(n,["format","f","F"],"select");try{let i=Y();await i.getAccessToken();let o=await i.getOrganizations();if(o.length===0){Z(g);return}let r=G();if(t==="select"){let a=o.map(d=>({name:d.id,message:`${d.displayName||d.name} (${d.id})`,hint:d.id===r?"currently selected":void 0})),u=(await ke.prompt({type:"select",name:"organization",message:"Select an organization:",choices:a.map(d=>d.message),initial:r?o.findIndex(d=>d.id===r):0})).organization.match(/\(([^)]+)\)$/),p=u?u[1]:o[0].id;await V(p);let P=o.find(d=>d.id===p);M(g,{name:P?.displayName||P?.name});return}let s=o.map(a=>({id:a.id,name:a.name,displayName:a.displayName||a.name,selected:a.id===r?"*":""})),c=D(s,t,"organizations","organization",[{key:"selected",header:" ",width:1},{key:"id",header:"ID"},{key:"name",header:"Name"},{key:"displayName",header:"Display Name"}]);console.log(c),M(g,{count:s.length})}catch(i){i instanceof Error?b(g,i.message):b(g),process.exit(1)}}export{xe as default};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
function x(n,e,t){for(let o of e)if(n[o]!==void 0)return n[o];return t}import u from"axios";import K from"open";function v(){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 A=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";import{homedir as V}from"os";import{join as _}from"path";import{readFileSync as Y,writeFileSync as H,existsSync as O,mkdirSync as J}from"fs";import{chmod as q}from"fs/promises";var m=_(V(),".tigris"),p=_(m,"config.json");function B(){O(m)||J(m,{recursive:!0,mode:448})}function c(){if(O(p))try{let n=Y(p,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function l(n){B(),H(p,JSON.stringify(n,null,2),{mode:384});try{await q(p,384)}catch{}}async function h(n){let e=c();e.tokens=n,await l(e)}async function d(){return c().tokens||null}async function C(){let n=c();delete n.tokens,await l(n)}async function I(n){let e=c();e.organizations=n,await l(e)}function M(){return c().organizations||[]}async function P(n){let e=c();e.selectedOrganization=n,await l(e)}function b(){let n=c();return n.temporaryCredentials||n.credentials||null}async function E(n){let e=c();e.loginMethod=n,await l(e)}function z(){return c().loginMethod||null}var T=class{config;baseUrl;constructor(){this.config=v(),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 K(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await h(i),E("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,t){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(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 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 u.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 h(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 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)[A];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;I(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),M()}async logout(){await C()}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},y=null;function N(){return y||(y=new T),y}import{readFileSync as W,existsSync as Q}from"fs";import{join as D,dirname as X}from"path";import{fileURLToPath as Z}from"url";import*as R from"yaml";var ee=Z(import.meta.url),ne=X(ee),w=null;function te(){let n=ne;for(let e=0;e<5;e++){let t=D(n,"specs.yaml");if(Q(t))return t;n=D(n,"..")}throw new Error("Could not find specs.yaml")}function oe(){if(!w){let n=te(),e=W(n,"utf8");w=R.parse(e)}return w}function $(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 F={success:"\u2714",failure:"\u2716",hint:"\u2192"};function j(){return process.stdout.isTTY===!0}function k(n){let e=$(n.command,n.operation);if(e)return e.messages}function S(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 L(n,e){if(!j())return;let t=k(n);t?.onStart&&console.log(S(t.onStart,e))}function U(n,e){if(!j())return;let t=k(n);t?.onSuccess&&console.log(`${F.success} ${S(t.onSuccess,e)}`)}function f(n,e,t){let o=k(n);o?.onFailure&&console.error(`${F.failure} ${S(o.onFailure,t)}`),e&&console.error(` ${e}`)}function G(n,e){return{command:n,operation:e}}var g=G("orgs","select");async function ie(n){if(L(g),z()!=="oauth"){b()?console.log(`You are using access key credentials, which belong to a single organization.
|
|
3
|
+
Organization selection is only available with OAuth login.
|
|
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=x(n,["name","N"]);t||(f(g,"Organization name or ID is required"),process.exit(1));try{let o=N();await o.getAccessToken();let i=await o.getOrganizations(),r=i.find(s=>s.id===t||s.name===t);if(!r){let s=i.map(a=>` - ${a.name} (${a.id})`).join(`
|
|
6
|
+
`);f(g,`Organization "${t}" not found
|
|
7
|
+
|
|
8
|
+
Available organizations:
|
|
9
|
+
${s}`),process.exit(1)}await P(r.id),U(g,{name:r.name})}catch(o){o instanceof Error?f(g,o.message):f(g),process.exit(1)}}export{ie as default};
|
package/dist/lib/rm.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
async function e(t){t.path||t.
|
|
1
|
+
import*as Q from"readline";import{list as M}from"@tigrisdata/storage";function z(n){let e=n.split("/");return{bucket:e[0],path:e.slice(1).join("/")}}async function R(n,e,o){let{data:t}=await M({prefix:`${e}/`,limit:1,config:{...o,bucket:n}});return!!(t?.items&&t.items.length>0)}async function $(n,e,o){let t=[],i;do{let{data:r,error:s}=await M({prefix:e,paginationToken:i,config:{...o,bucket:n}});if(s)return{items:t,error:s};r?.items&&t.push(...r.items),i=r?.hasMore?r.paginationToken:void 0}while(i);return{items:t}}function v(n,e,o){for(let t of e)if(n[t]!==void 0)return n[t];return o}import{S3Client as Ae}from"@aws-sdk/client-s3";import{homedir as X}from"os";import{join as D}from"path";import{readFileSync as Y,writeFileSync as Z,existsSync as L,mkdirSync as ee}from"fs";import{chmod as te}from"fs/promises";var x=D(X(),".tigris"),p=D(x,"config.json");function ne(){L(x)||ee(x,{recursive:!0,mode:448})}function d(){if(L(p))try{let n=Y(p,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function m(n){ne(),Z(p,JSON.stringify(n,null,2),{mode:384});try{await te(p,384)}catch{}}async function A(n){let e=d();e.tokens=n,await m(e)}async function f(){return d().tokens||null}async function I(){let n=d();delete n.tokens,await m(n)}async function F(n){let e=d();e.organizations=n,await m(e)}function K(){return d().organizations||[]}function P(){return d().selectedOrganization||null}function j(){let n=d();return n.temporaryCredentials||n.credentials||null}async function G(n){let e=d();e.loginMethod=n,await m(e)}function U(){return d().loginMethod||null}import w from"axios";import oe from"open";function h(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var q=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function H(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_STORAGE_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var S=class{config;baseUrl;constructor(){this.config=h(),this.baseUrl=`https://${this.config.domain}`}async login(e){let t=(await w.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(t.user_code,t.verification_uri),await this.sleep(2e3);try{await oe(t.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(t.device_code,t.interval||5);await A(i),G("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,o){let i=0;for(;i<60;){i++;try{let s=(await w.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(r){if(w.isAxiosError(r)&&r.response){let s=r.response.data?.error;if(s==="authorization_pending"){await this.sleep(o*1e3);continue}if(s==="slow_down"){o+=5,await this.sleep(o*1e3);continue}throw new Error(r.response.data?.error_description||"Authentication failed")}throw r}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await f();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let o=300*1e3;return Date.now()+o>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let o=null;if(e?.refreshToken?o=e:o=await f(),!o)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await w.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:o.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,r={accessToken:i.access_token,refreshToken:i.refresh_token||o.refreshToken,idToken:i.id_token||o.idToken,expiresAt:Date.now()+(i.expires_in||3600)*1e3};return await A(r),r}catch{throw await I(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await f();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let o=e.idToken.split(".")[1],t=Buffer.from(o,"base64").toString("utf8");return JSON.parse(t)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let o=e.split(".")[1],t=Buffer.from(o,"base64").toString("utf8"),r=JSON.parse(t)[q];if(!r)return;let s=r?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;F(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),K()}async logout(){await I()}async isAuthenticated(){return await f()!==null}sleep(e){return new Promise(o=>setTimeout(o,e))}},_=null;function W(){return _||(_=new S),_}var B=H(),ie=h();async function re(){return U()}async function J(){if(await re()==="oauth"){let t=await W().getAccessToken();if(!P())throw new Error('No organization selected. Please run "tigris orgs select" first.');let r=B.endpoint,s=B.iamEndpoint,a=ie.domain;return{sessionToken:t,accessKeyId:"",secretAccessKey:"",endpoint:r,organizationId:P()??void 0,iamEndpoint:s,authDomain:a}}let e=j();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{remove as O,removeBucket as se,list as ae}from"@tigrisdata/storage";async function E(n){let e=Q.createInterface({input:process.stdin,output:process.stdout});return new Promise(o=>{e.question(`${n} (y/N): `,t=>{e.close(),o(t.toLowerCase()==="y")})})}async function ce(n){let e=v(n,["path"]),o=v(n,["force","f","F"]);e||(console.error("path argument is required"),process.exit(1));let{bucket:t,path:i}=z(e);t||(console.error("Invalid path"),process.exit(1));let r=await J();if(!i){if(!o&&!await E(`Are you sure you want to delete bucket '${t}'?`)){console.log("Aborted");return}let{error:l}=await se(t,{config:r});l&&(console.error(l.message),process.exit(1)),console.log(`Removed bucket '${t}'`);return}let s=e.includes("*"),a=i.endsWith("/");if(!s&&!a&&(a=await R(t,i,r)),s||a){let l=s?i.replace("*",""):i.endsWith("/")?i:`${i}/`,{items:y,error:b}=await $(t,l||void 0,r);b&&(console.error(b.message),process.exit(1));let T=y,g=l,V=T.some(c=>c.name===g),k=!1;if(!V){let{data:c}=await ae({prefix:g,limit:1,config:{...r,bucket:t}});k=c?.items?.some(u=>u.name===g)||!1}let N=T.length+(k?1:0);if(N===0){console.log("No objects to remove");return}if(!o&&!await E(`Are you sure you want to delete ${N} object(s)?`)){console.log("Aborted");return}let C=0;for(let c of T){let{error:u}=await O(c.name,{config:{...r,bucket:t}});u?console.error(`Failed to remove ${c.name}: ${u.message}`):(console.log(`Removed ${t}/${c.name}`),C++)}if(k){let{error:c}=await O(g,{config:{...r,bucket:t}});c?console.error(`Failed to remove ${g}: ${c.message}`):(console.log(`Removed ${t}/${g}`),C++)}console.log(`Removed ${C} object(s)`)}else{if(!o&&!await E(`Are you sure you want to delete '${t}/${i}'?`)){console.log("Aborted");return}let{error:l}=await O(i,{config:{...r,bucket:t}});l&&(console.error(l.message),process.exit(1)),console.log(`Removed ${t}/${i}`)}}export{ce as default};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
function C(t,e,n){for(let o of e)if(t[o]!==void 0)return t[o];return n}function te(t){return JSON.stringify(t,null,2)}function ne(t,e=" "){return Object.entries(t).map(([n,o])=>`${e}<${n}>${o}</${n}>`).join(`
|
|
2
|
+
`)}function oe(t,e,n){let o=[`<${e}>`];return t.forEach(i=>{o.push(` <${n}>`),o.push(ne(i," ")),o.push(` </${n}>`)}),o.push(`</${e}>`),o.join(`
|
|
3
|
+
`)}function N(t){if(t==null)return"";if(t instanceof Date)return E(t);if(typeof t=="string"){let e=new Date(t);if(!isNaN(e.getTime())&&t.includes("T"))return E(e)}return String(t)}function E(t){return new Intl.DateTimeFormat(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(t)}function ie(t,e){return e.map(n=>{if(n.width)return n.width;let o=n.header.length,i=t.reduce((r,s)=>{let a=N(s[n.key]);return Math.max(r,a.length)},0);return Math.max(o,i)})}function re(t,e){let n=[],o=ie(t,e),i="\u250C"+o.map(c=>"\u2500".repeat(c+2)).join("\u252C")+"\u2510",r="\u251C"+o.map(c=>"\u2500".repeat(c+2)).join("\u253C")+"\u2524",s="\u2514"+o.map(c=>"\u2500".repeat(c+2)).join("\u2534")+"\u2518";n.push(`
|
|
4
|
+
`+i);let a="\u2502 "+e.map((c,T)=>c.header.padEnd(o[T])).join(" \u2502 ")+" \u2502";return n.push(a),n.push(r),t.forEach(c=>{let T=e.map((O,P)=>{let b=N(c[O.key]);return O.align==="right"?b.padStart(o[P]):b.padEnd(o[P])});n.push("\u2502 "+T.join(" \u2502 ")+" \u2502")}),n.push(s+`
|
|
5
|
+
`),n.join(`
|
|
6
|
+
`)}function D(t,e,n,o,i){switch(e){case"json":return te(t);case"xml":return oe(t,n,o);default:return re(t,i)}}import{S3Client as Ke}from"@aws-sdk/client-s3";import{homedir as se}from"os";import{join as z}from"path";import{readFileSync as ae,writeFileSync as ce,existsSync as R,mkdirSync as de}from"fs";import{chmod as ge}from"fs/promises";var w=z(se(),".tigris"),l=z(w,"config.json");function ue(){R(w)||de(w,{recursive:!0,mode:448})}function d(){if(R(l))try{let t=ae(l,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function p(t){ue(),ce(l,JSON.stringify(t,null,2),{mode:384});try{await ge(l,384)}catch{}}async function k(t){let e=d();e.tokens=t,await p(e)}async function g(){return d().tokens||null}async function x(){let t=d();delete t.tokens,await p(t)}async function j(t){let e=d();e.organizations=t,await p(e)}function $(){return d().organizations||[]}function S(){return d().selectedOrganization||null}function K(){let t=d();return t.temporaryCredentials||t.credentials||null}async function L(t){let e=d();e.loginMethod=t,await p(e)}function F(){return d().loginMethod||null}import m from"axios";import le from"open";function f(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var U=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function V(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_STORAGE_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var v=class{config;baseUrl;constructor(){this.config=f(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await m.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(o.user_code,o.verification_uri),await this.sleep(2e3);try{await le(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await k(i),L("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,n){let i=0;for(;i<60;){i++;try{let s=(await m.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(r){if(m.isAxiosError(r)&&r.response){let s=r.response.data?.error;if(s==="authorization_pending"){await this.sleep(n*1e3);continue}if(s==="slow_down"){n+=5,await this.sleep(n*1e3);continue}throw new Error(r.response.data?.error_description||"Authentication failed")}throw r}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await g();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let n=300*1e3;return Date.now()+n>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let n=null;if(e?.refreshToken?n=e:n=await g(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await m.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:n.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,r={accessToken:i.access_token,refreshToken:i.refresh_token||n.refreshToken,idToken:i.id_token||n.idToken,expiresAt:Date.now()+(i.expires_in||3600)*1e3};return await k(r),r}catch{throw await x(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await g();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let n=e.idToken.split(".")[1],o=Buffer.from(n,"base64").toString("utf8");return JSON.parse(o)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let n=e.split(".")[1],o=Buffer.from(n,"base64").toString("utf8"),r=JSON.parse(o)[U];if(!r)return;let s=r?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;j(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),$()}async logout(){await x()}async isAuthenticated(){return await g()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},A=null;function G(){return A||(A=new v),A}var B=V(),pe=f();async function fe(){return F()}async function q(){if(await fe()==="oauth"){let o=await G().getAccessToken();if(!S())throw new Error('No organization selected. Please run "tigris orgs select" first.');let r=B.endpoint,s=B.iamEndpoint,a=pe.domain;return{sessionToken:o,accessKeyId:"",secretAccessKey:"",endpoint:r,organizationId:S()??void 0,iamEndpoint:s,authDomain:a}}let e=K();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{listBucketSnapshots as Se}from"@tigrisdata/storage";import{readFileSync as me,existsSync as he}from"fs";import{join as H,dirname as ye}from"path";import{fileURLToPath as Te}from"url";import*as J from"yaml";var Ce=Te(import.meta.url),we=ye(Ce),_=null;function ke(){let t=we;for(let e=0;e<5;e++){let n=H(t,"specs.yaml");if(he(n))return n;t=H(t,"..")}throw new Error("Could not find specs.yaml")}function xe(){if(!_){let t=ke(),e=me(t,"utf8");_=J.parse(e)}return _}function W(t,e){let o=xe().commands.find(i=>i.name===t);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var Y={success:"\u2714",failure:"\u2716",hint:"\u2192"};function I(){return process.stdout.isTTY===!0}function h(t){let e=W(t.command,t.operation);if(e)return e.messages}function y(t,e){let n=t;return n=n.replace(/\\n/g,`
|
|
7
|
+
`),e&&(n=n.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let r=e[i];return r!==void 0?String(r):`{{${i}}}`})),n}function X(t,e){if(!I())return;let n=h(t);n?.onStart&&console.log(y(n.onStart,e))}function Q(t,e){if(!I())return;let n=h(t);n?.onSuccess&&console.log(`${Y.success} ${y(n.onSuccess,e)}`)}function M(t,e,n){let o=h(t);o?.onFailure&&console.error(`${Y.failure} ${y(o.onFailure,n)}`),e&&console.error(` ${e}`)}function Z(t,e){if(!I())return;let n=h(t);n?.onEmpty&&console.log(y(n.onEmpty,e))}function ee(t,e){return{command:t,operation:e}}var u=ee("snapshots","list");async function Ae(t){X(u);let e=C(t,["name"]),n=C(t,["format","f","F"],"table");e||(M(u,"Bucket name is required"),process.exit(1));let o=await q(),{data:i,error:r}=await Se(e,{config:o});if(r&&(M(u,r.message),process.exit(1)),!i||i.length===0){Z(u);return}let s=i.map(c=>({name:c.name||"",version:c.version||"",created:c.creationDate})),a=D(s,n,"snapshots","snapshot",[{key:"name",header:"Name"},{key:"version",header:"Version"},{key:"created",header:"Created"}]);console.log(a),Q(u,{count:s.length})}export{Ae as default};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function m(t,e,n){for(let o of e)if(t[o]!==void 0)return t[o];return n}import{S3Client as Ae}from"@aws-sdk/client-s3";import{homedir as H}from"os";import{join as _}from"path";import{readFileSync as B,writeFileSync as J,existsSync as I,mkdirSync as Y}from"fs";import{chmod as W}from"fs/promises";var h=_(H(),".tigris"),d=_(h,"config.json");function Q(){I(h)||Y(h,{recursive:!0,mode:448})}function c(){if(I(d))try{let t=B(d,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function l(t){Q(),J(d,JSON.stringify(t,null,2),{mode:384});try{await W(d,384)}catch{}}async function y(t){let e=c();e.tokens=t,await l(e)}async function g(){return c().tokens||null}async function C(){let t=c();delete t.tokens,await l(t)}async function M(t){let e=c();e.organizations=t,await l(e)}function P(){return c().organizations||[]}function T(){return c().selectedOrganization||null}function O(){let t=c();return t.temporaryCredentials||t.credentials||null}async function E(t){let e=c();e.loginMethod=t,await l(e)}function N(){return c().loginMethod||null}import u from"axios";import X from"open";function p(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var b=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function z(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_STORAGE_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var k=class{config;baseUrl;constructor(){this.config=p(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await u.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(o.user_code,o.verification_uri),await this.sleep(2e3);try{await X(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await y(i),E("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,n){let i=0;for(;i<60;){i++;try{let s=(await u.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(r){if(u.isAxiosError(r)&&r.response){let s=r.response.data?.error;if(s==="authorization_pending"){await this.sleep(n*1e3);continue}if(s==="slow_down"){n+=5,await this.sleep(n*1e3);continue}throw new Error(r.response.data?.error_description||"Authentication failed")}throw r}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await g();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let n=300*1e3;return Date.now()+n>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let n=null;if(e?.refreshToken?n=e:n=await g(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await u.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:n.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,r={accessToken:i.access_token,refreshToken:i.refresh_token||n.refreshToken,idToken:i.id_token||n.idToken,expiresAt:Date.now()+(i.expires_in||3600)*1e3};return await y(r),r}catch{throw await C(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await g();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let n=e.idToken.split(".")[1],o=Buffer.from(n,"base64").toString("utf8");return JSON.parse(o)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let n=e.split(".")[1],o=Buffer.from(n,"base64").toString("utf8"),r=JSON.parse(o)[b];if(!r)return;let s=r?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;M(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),P()}async logout(){await C()}async isAuthenticated(){return await g()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},w=null;function D(){return w||(w=new k),w}var R=z(),Z=p();async function ee(){return N()}async function K(){if(await ee()==="oauth"){let o=await D().getAccessToken();if(!T())throw new Error('No organization selected. Please run "tigris orgs select" first.');let r=R.endpoint,s=R.iamEndpoint,a=Z.domain;return{sessionToken:o,accessKeyId:"",secretAccessKey:"",endpoint:r,organizationId:T()??void 0,iamEndpoint:s,authDomain:a}}let e=O();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{createBucketSnapshot as ge}from"@tigrisdata/storage";import{readFileSync as te,existsSync as ne}from"fs";import{join as L,dirname as oe}from"path";import{fileURLToPath as ie}from"url";import*as $ from"yaml";var re=ie(import.meta.url),se=oe(re),S=null;function ae(){let t=se;for(let e=0;e<5;e++){let n=L(t,"specs.yaml");if(ne(n))return n;t=L(t,"..")}throw new Error("Could not find specs.yaml")}function ce(){if(!S){let t=ae(),e=te(t,"utf8");S=$.parse(e)}return S}function F(t,e){let o=ce().commands.find(i=>i.name===t);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var j={success:"\u2714",failure:"\u2716",hint:"\u2192"};function U(){return process.stdout.isTTY===!0}function x(t){let e=F(t.command,t.operation);if(e)return e.messages}function A(t,e){let n=t;return n=n.replace(/\\n/g,`
|
|
2
|
+
`),e&&(n=n.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let r=e[i];return r!==void 0?String(r):`{{${i}}}`})),n}function V(t,e){if(!U())return;let n=x(t);n?.onStart&&console.log(A(n.onStart,e))}function G(t,e){if(!U())return;let n=x(t);n?.onSuccess&&console.log(`${j.success} ${A(n.onSuccess,e)}`)}function v(t,e,n){let o=x(t);o?.onFailure&&console.error(`${j.failure} ${A(o.onFailure,n)}`),e&&console.error(` ${e}`)}function q(t,e){return{command:t,operation:e}}var f=q("snapshots","take");async function de(t){V(f);let e=m(t,["name"]),n=m(t,["snapshot-name","snapshotName"]);e||(v(f,"Bucket name is required"),process.exit(1));let o=await K(),{data:i,error:r}=await ge(e,{name:n,config:o});r&&(v(f,r.message),process.exit(1)),G(f,{name:e,snapshotName:n||i?.snapshotVersion,version:i?.snapshotVersion})}export{de as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{list as J}from"@tigrisdata/storage";function k(t){let e=t.split("/");return{bucket:e[0],path:e.slice(1).join("/")}}function C(t,e,n){for(let i of e)if(t[i]!==void 0)return t[i];return n}import{S3Client as ae}from"@aws-sdk/client-s3";import{homedir as b}from"os";import{join as x}from"path";import{readFileSync as D,writeFileSync as R,existsSync as I,mkdirSync as K}from"fs";import{chmod as L}from"fs/promises";var p=x(b(),".tigris"),g=x(p,"config.json");function j(){I(p)||K(p,{recursive:!0,mode:448})}function c(){if(I(g))try{let t=D(g,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function l(t){j(),R(g,JSON.stringify(t,null,2),{mode:384});try{await L(g,384)}catch{}}async function m(t){let e=c();e.tokens=t,await l(e)}async function d(){return c().tokens||null}async function h(){let t=c();delete t.tokens,await l(t)}async function A(t){let e=c();e.organizations=t,await l(e)}function P(){return c().organizations||[]}function T(){return c().selectedOrganization||null}function _(){let t=c();return t.temporaryCredentials||t.credentials||null}async function S(t){let e=c();e.loginMethod=t,await l(e)}function v(){return c().loginMethod||null}import u from"axios";import F from"open";function f(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var O=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function E(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_STORAGE_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var w=class{config;baseUrl;constructor(){this.config=f(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(await u.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(i.user_code,i.verification_uri),await this.sleep(2e3);try{await F(i.verification_uri_complete)}catch{}e?.onWaiting?.();let r=await this.pollForToken(i.device_code,i.interval||5);await m(r),S("oauth"),await this.extractAndStoreOrganizations(r.idToken)}async pollForToken(e,n){let r=0;for(;r<60;){r++;try{let s=(await u.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(o){if(u.isAxiosError(o)&&o.response){let s=o.response.data?.error;if(s==="authorization_pending"){await this.sleep(n*1e3);continue}if(s==="slow_down"){n+=5,await this.sleep(n*1e3);continue}throw new Error(o.response.data?.error_description||"Authentication failed")}throw o}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await d();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let n=300*1e3;return Date.now()+n>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let n=null;if(e?.refreshToken?n=e:n=await d(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let r=(await u.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:n.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,o={accessToken:r.access_token,refreshToken:r.refresh_token||n.refreshToken,idToken:r.id_token||n.idToken,expiresAt:Date.now()+(r.expires_in||3600)*1e3};return await m(o),o}catch{throw await h(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await d();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let n=e.idToken.split(".")[1],i=Buffer.from(n,"base64").toString("utf8");return JSON.parse(i)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let n=e.split(".")[1],i=Buffer.from(n,"base64").toString("utf8"),o=JSON.parse(i)[O];if(!o)return;let s=o?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;A(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),P()}async logout(){await h()}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},y=null;function N(){return y||(y=new w),y}var z=E(),G=f();async function U(){return v()}async function M(){if(await U()==="oauth"){let i=await N().getAccessToken();if(!T())throw new Error('No organization selected. Please run "tigris orgs select" first.');let o=z.endpoint,s=z.iamEndpoint,a=G.domain;return{sessionToken:i,accessKeyId:"",secretAccessKey:"",endpoint:o,organizationId:T()??void 0,iamEndpoint:s,authDomain:a}}let e=_();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{put as q}from"@tigrisdata/storage";async function $(t){let e=C(t,["path"]);e||(console.error("path argument is required"),process.exit(1));let{bucket:n,path:i}=k(e);n||(console.error("Invalid path"),process.exit(1)),i||(console.error("Object key is required (use mk to create buckets)"),process.exit(1));let r=await M(),{error:o}=await q(i,"",{config:{...r,bucket:n}});o&&(console.error(o.message),process.exit(1)),console.log(`Created '${n}/${i}'`)}export{$ as default};
|
package/dist/lib/whoami.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import g from"axios";import H from"open";function
|
|
2
|
-
`),e&&(t=t.replace(/\{\{(\w+)\}\}/g,(
|
|
3
|
-
`))}catch(n){n instanceof Error?w
|
|
1
|
+
import g from"axios";import H from"open";function k(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var S=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";import{homedir as F}from"os";import{join as x}from"path";import{readFileSync as U,writeFileSync as j,existsSync as A,mkdirSync as L}from"fs";import{chmod as G}from"fs/promises";var f=x(F(),".tigris"),p=x(f,"config.json");function V(){A(f)||L(f,{recursive:!0,mode:448})}function c(){if(A(p))try{let n=U(p,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function d(n){V(),j(p,JSON.stringify(n,null,2),{mode:384});try{await G(p,384)}catch{}}async function u(n){let e=c();e.tokens=n,await d(e)}async function l(){return c().tokens||null}async function m(){let n=c();delete n.tokens,await d(n)}async function v(n){let e=c();e.organizations=n,await d(e)}function _(){return c().organizations||[]}function I(){return c().selectedOrganization||null}async function O(n){let e=c();e.loginMethod=n,await d(e)}var C=class{config;baseUrl;constructor(){this.config=k(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await g.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(o.user_code,o.verification_uri),await this.sleep(2e3);try{await H(o.verification_uri_complete)}catch{}e?.onWaiting?.();let r=await this.pollForToken(o.device_code,o.interval||5);await u(r),O("oauth"),await this.extractAndStoreOrganizations(r.idToken)}async pollForToken(e,t){let r=0;for(;r<60;){r++;try{let s=(await g.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(i){if(g.isAxiosError(i)&&i.response){let s=i.response.data?.error;if(s==="authorization_pending"){await this.sleep(t*1e3);continue}if(s==="slow_down"){t+=5,await this.sleep(t*1e3);continue}throw new Error(i.response.data?.error_description||"Authentication failed")}throw i}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await l();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let t=300*1e3;return Date.now()+t>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let t=null;if(e?.refreshToken?t=e:t=await l(),!t)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let r=(await g.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:t.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,i={accessToken:r.access_token,refreshToken:r.refresh_token||t.refreshToken,idToken:r.id_token||t.idToken,expiresAt:Date.now()+(r.expires_in||3600)*1e3};return await u(i),i}catch{throw await m(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await l();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let t=e.idToken.split(".")[1],o=Buffer.from(t,"base64").toString("utf8");return JSON.parse(o)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let t=e.split(".")[1],o=Buffer.from(t,"base64").toString("utf8"),i=JSON.parse(o)[S];if(!i)return;let s=i?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;v(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),_()}async logout(){await m()}async isAuthenticated(){return await l()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},h=null;function P(){return h||(h=new C),h}import{readFileSync as J,existsSync as Y}from"fs";import{join as M,dirname as B}from"path";import{fileURLToPath as q}from"url";import*as E from"yaml";var K=q(import.meta.url),W=B(K),y=null;function Q(){let n=W;for(let e=0;e<5;e++){let t=M(n,"specs.yaml");if(Y(t))return t;n=M(n,"..")}throw new Error("Could not find specs.yaml")}function X(){if(!y){let n=Q(),e=J(n,"utf8");y=E.parse(e)}return y}function b(n,e){let o=X().commands.find(r=>r.name===n);return o?e&&o.operations?o.operations.find(r=>r.name===e)||null:o:null}var Z={success:"\u2714",failure:"\u2716",hint:"\u2192"};function ee(){return process.stdout.isTTY===!0}function z(n){let e=b(n.command,n.operation);if(e)return e.messages}function N(n,e){let t=n;return t=t.replace(/\\n/g,`
|
|
2
|
+
`),e&&(t=t.replace(/\{\{(\w+)\}\}/g,(o,r)=>{let i=e[r];return i!==void 0?String(i):`{{${r}}}`})),t}function T(n,e,t){let o=z(n);o?.onFailure&&console.error(`${Z.failure} ${N(o.onFailure,t)}`),e&&console.error(` ${e}`)}function D(n,e){if(!ee())return;let t=z(n);t?.onAlreadyDone&&console.log(N(t.onAlreadyDone,e))}function $(n,e){return{command:n,operation:e}}var w=$("whoami");async function ne(){try{let n=P();if(!await n.isAuthenticated()){D(w);return}let t=await n.getIdTokenClaims(),o=await n.getOrganizations(),r=I(),i=[];if(i.push(""),i.push("User Information:"),i.push(` Email: ${t.email||"N/A"}`),i.push(` User ID: ${t.sub}`),o.length>0){if(i.push(""),i.push(`Organizations (${o.length}):`),o.forEach(s=>{let R=s.id===r?">":" ";i.push(` ${R} ${s.name} (${s.id})`)}),r){let s=o.find(a=>a.id===r);s&&(i.push(""),i.push(`Active: ${s.name}`))}}else i.push(""),i.push("Organizations: None");i.push(""),console.log(i.join(`
|
|
3
|
+
`))}catch(n){n instanceof Error?T(w,n.message):T(w),process.exit(1)}}export{ne as default};
|