@tigrisdata/cli 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/client.js +1 -5
- package/dist/auth/s3-client.js +1 -5
- package/dist/cli.js +8 -9
- package/dist/index.js +8 -9
- package/dist/lib/buckets/create.js +2 -0
- package/dist/lib/buckets/list.js +7 -14
- package/dist/lib/configure/index.js +2 -6
- package/dist/lib/cp.js +1 -1
- package/dist/lib/login/credentials.js +2 -9
- package/dist/lib/login/select.js +5 -18
- package/dist/lib/login/ui.js +5 -8
- package/dist/lib/logout.js +2 -4
- package/dist/lib/ls.js +1 -1
- package/dist/lib/mk.js +1 -1
- package/dist/lib/mv.js +1 -1
- package/dist/lib/orgs/create.js +2 -2
- package/dist/lib/orgs/list.js +7 -21
- package/dist/lib/orgs/select.js +6 -12
- package/dist/lib/rm.js +1 -1
- package/dist/lib/stat.js +1 -1
- package/dist/lib/whoami.js +3 -14
- package/dist/specs.yaml +149 -99
- package/dist/utils/format.js +6 -6
- package/dist/utils/messages.js +2 -0
- package/dist/utils/specs.js +1 -0
- package/package.json +7 -10
package/dist/auth/client.js
CHANGED
|
@@ -1,5 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
`);try{let n=(await f.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;console.log("\u{1F4F1} Please authenticate in your browser:");try{await N(n.verification_uri_complete)}catch{console.log(`Visit: ${n.verification_uri} and Enter code: ${n.user_code}
|
|
3
|
-
`)}console.log(`\u23F3 Waiting for authentication...
|
|
4
|
-
`);let o=await this.pollForToken(n.device_code,n.interval||5);await p(o),x("oauth"),await this.extractAndStoreOrganizations(o.idToken),console.log(`\u2705 Authentication successful!
|
|
5
|
-
`)}catch(e){throw e instanceof Error?console.error(`\u274C Authentication failed: ${e.message}`):console.error("\u274C Authentication failed"),e}}async pollForToken(e,n){let a=0;for(;a<60;){a++;try{let i=(await f.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,r=Date.now()+(i.expires_in||3600)*1e3;return{accessToken:i.access_token,refreshToken:i.refresh_token,idToken:i.id_token,expiresAt:r}}catch(s){if(f.isAxiosError(s)&&s.response){let i=s.response.data?.error;if(i==="authorization_pending"){await this.sleep(n*1e3);continue}if(i==="slow_down"){n+=5,await this.sleep(n*1e3);continue}throw new Error(s.response.data?.error_description||"Authentication failed")}throw s}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await g();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let n=300*1e3;return Date.now()+n>=e.expiresAt&&(console.log("\u{1F504} Refreshing access token..."),e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){if(!e.refreshToken)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let o=(await f.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:e.refreshToken},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a={accessToken:o.access_token,refreshToken:o.refresh_token||e.refreshToken,idToken:o.id_token||e.idToken,expiresAt:Date.now()+(o.expires_in||3600)*1e3};return await p(a),a}catch{throw await h(),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){console.warn("\u26A0\uFE0F No ID token available, skipping organization extraction");return}try{let n=e.split(".")[1],o=Buffer.from(n,"base64").toString("utf8"),s=JSON.parse(o)[y];if(!s){console.warn("\u26A0\uFE0F No Tigris claims found in token");return}let i=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(i.length===0){console.warn("\u26A0\uFE0F No organizations found in claims");return}_(i),console.log(`\u{1F4C2} Found ${i.length} organization(s)`)}catch{console.error("Failed to extract organizations from token")}}async getOrganizations(){return await this.getAccessToken(),v()}async logout(){await h(),console.log("\u2705 Logged out successfully")}async isAuthenticated(){return await g()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},m=null;function j(){return m||(m=new k),m}export{k as TigrisAuthClient,j as getAuthClient};
|
|
1
|
+
import g from"axios";import N from"open";function w(){return{domain:process.env.AUTH0_DOMAIN||"auth-dev.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF",audience:process.env.AUTH0_AUDIENCE||"https://tigris-api-dev"}}var T="https://tigris";import{homedir as A}from"os";import{join as y}from"path";import{readFileSync as I,writeFileSync as O,existsSync as C,mkdirSync as S}from"fs";import{chmod as P}from"fs/promises";var p=y(A(),".tigris"),l=y(p,"config.json");function z(){C(p)||S(p,{recursive:!0,mode:448})}function c(){if(C(l))try{let n=I(l,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function f(n){z(),O(l,JSON.stringify(n,null,2),{mode:384});try{await P(l,384)}catch{}}async function u(n){let e=c();e.tokens=n,await f(e)}async function d(){return c().tokens||null}async function m(){let n=c();delete n.tokens,await f(n)}async function _(n){let e=c();e.organizations=n,await f(e)}function v(){return c().organizations||[]}async function x(n){let e=c();e.loginMethod=n,await f(e)}var k=class{config;baseUrl;constructor(){this.config=w(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(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?.(i.user_code,i.verification_uri),await this.sleep(2e3);try{await N(i.verification_uri_complete)}catch{}e?.onWaiting?.();let r=await this.pollForToken(i.device_code,i.interval||5);await u(r),x("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(o){if(g.isAxiosError(o)&&o.response){let s=o.response.data?.error;if(s==="authorization_pending"){await this.sleep(t*1e3);continue}if(s==="slow_down"){t+=5,await this.sleep(t*1e3);continue}throw new Error(o.response.data?.error_description||"Authentication failed")}throw o}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await d();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let t=300*1e3;return Date.now()+t>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let t=null;if(e?.refreshToken?t=e:t=await d(),!t)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let r=(await 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,o={accessToken:r.access_token,refreshToken:r.refresh_token||t.refreshToken,idToken:r.id_token||t.idToken,expiresAt:Date.now()+(r.expires_in||3600)*1e3};return await u(o),o}catch{throw await m(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await d();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let t=e.idToken.split(".")[1],i=Buffer.from(t,"base64").toString("utf8");return JSON.parse(i)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let t=e.split(".")[1],i=Buffer.from(t,"base64").toString("utf8"),o=JSON.parse(i)[T];if(!o)return;let s=o?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;_(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),v()}async logout(){await m()}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},h=null;function H(){return h||(h=new k),h}export{k as TigrisAuthClient,H as getAuthClient};
|
package/dist/auth/s3-client.js
CHANGED
|
@@ -1,5 +1 @@
|
|
|
1
|
-
import{S3Client as
|
|
2
|
-
`);try{let n=(await f.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;console.log("\u{1F4F1} Please authenticate in your browser:");try{await F(n.verification_uri_complete)}catch{console.log(`Visit: ${n.verification_uri} and Enter code: ${n.user_code}
|
|
3
|
-
`)}console.log(`\u23F3 Waiting for authentication...
|
|
4
|
-
`);let o=await this.pollForToken(n.device_code,n.interval||5);await p(o),x("oauth"),await this.extractAndStoreOrganizations(o.idToken),console.log(`\u2705 Authentication successful!
|
|
5
|
-
`)}catch(e){throw e instanceof Error?console.error(`\u274C Authentication failed: ${e.message}`):console.error("\u274C Authentication failed"),e}}async pollForToken(e,n){let c=0;for(;c<60;){c++;try{let i=(await f.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,r=Date.now()+(i.expires_in||3600)*1e3;return{accessToken:i.access_token,refreshToken:i.refresh_token,idToken:i.id_token,expiresAt:r}}catch(s){if(f.isAxiosError(s)&&s.response){let i=s.response.data?.error;if(i==="authorization_pending"){await this.sleep(n*1e3);continue}if(i==="slow_down"){n+=5,await this.sleep(n*1e3);continue}throw new Error(s.response.data?.error_description||"Authentication failed")}throw s}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await g();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let n=300*1e3;return Date.now()+n>=e.expiresAt&&(console.log("\u{1F504} Refreshing access token..."),e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){if(!e.refreshToken)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let o=(await f.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:e.refreshToken},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,c={accessToken:o.access_token,refreshToken:o.refresh_token||e.refreshToken,idToken:o.id_token||e.idToken,expiresAt:Date.now()+(o.expires_in||3600)*1e3};return await p(c),c}catch{throw await h(),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){console.warn("\u26A0\uFE0F No ID token available, skipping organization extraction");return}try{let n=e.split(".")[1],o=Buffer.from(n,"base64").toString("utf8"),s=JSON.parse(o)[P];if(!s){console.warn("\u26A0\uFE0F No Tigris claims found in token");return}let i=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(i.length===0){console.warn("\u26A0\uFE0F No organizations found in claims");return}T(i),console.log(`\u{1F4C2} Found ${i.length} organization(s)`)}catch{console.error("Failed to extract organizations from token")}}async getOrganizations(){return await this.getAccessToken(),C()}async logout(){await h(),console.log("\u2705 Logged out successfully")}async isAuthenticated(){return await g()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},m=null;function S(){return m||(m=new w),m}async function z(){return A()}async function ee(){let t=await z();if(!t)throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.');if(t==="oauth"){let n=await S().getAccessToken(),o=v();if(!o)throw new Error('No organization selected. Please run "tigris orgs select" first.');let c=process.env.TIGRIS_ENDPOINT??"https://t3.storage.dev",s=new O({region:"auto",endpoint:c,credentials:{sessionToken:n,accessKeyId:"",secretAccessKey:""}});return s.middlewareStack.add(i=>async r=>{let N=r.request;return N.headers["x-Tigris-Namespace"]=o,await i(r)},{name:"x-Tigris-Namespace-Middleware",step:"build",override:!0}),s}else{let e=_();if(!e)throw new Error('No credentials found. Please run "tigris configure" first.');return new O({region:"auto",endpoint:e.endpoint,credentials:{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey}})}}async function te(){return await z()!==null}export{z as getLoginMethod,ee as getS3Client,te as isAuthenticated};
|
|
1
|
+
import{S3Client as N}from"@aws-sdk/client-s3";import{homedir as E}from"os";import{join as v}from"path";import{readFileSync as M,writeFileSync as D,existsSync as _,mkdirSync as b}from"fs";import{chmod as K}from"fs/promises";var p=v(E(),".tigris"),g=v(p,"config.json");function R(){_(p)||b(p,{recursive:!0,mode:448})}function c(){if(_(g))try{let t=M(g,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function l(t){R(),D(g,JSON.stringify(t,null,2),{mode:384});try{await K(g,384)}catch{}}async function h(t){let e=c();e.tokens=t,await l(e)}async function d(){return c().tokens||null}async function m(){let t=c();delete t.tokens,await l(t)}async function I(t){let e=c();e.organizations=t,await l(e)}function A(){return c().organizations||[]}function f(){return c().selectedOrganization||null}function w(){let t=c();return t.temporaryCredentials||t.credentials||null}async function x(t){let e=c();e.loginMethod=t,await l(e)}function S(){return c().loginMethod||null}import u from"axios";import L from"open";function P(){return{domain:process.env.AUTH0_DOMAIN||"auth-dev.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF",audience:process.env.AUTH0_AUDIENCE||"https://tigris-api-dev"}}var O="https://tigris";var T=class{config;baseUrl;constructor(){this.config=P(),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 L(i.verification_uri_complete)}catch{}e?.onWaiting?.();let s=await this.pollForToken(i.device_code,i.interval||5);await h(s),x("oauth"),await this.extractAndStoreOrganizations(s.idToken)}async pollForToken(e,n){let s=0;for(;s<60;){s++;try{let a=(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,r=Date.now()+(a.expires_in||3600)*1e3;return{accessToken:a.access_token,refreshToken:a.refresh_token,idToken:a.id_token,expiresAt:r}}catch(o){if(u.isAxiosError(o)&&o.response){let a=o.response.data?.error;if(a==="authorization_pending"){await this.sleep(n*1e3);continue}if(a==="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 s=(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:s.access_token,refreshToken:s.refresh_token||n.refreshToken,idToken:s.id_token||n.idToken,expiresAt:Date.now()+(s.expires_in||3600)*1e3};return await h(o),o}catch{throw await m(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await d();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let n=e.idToken.split(".")[1],i=Buffer.from(n,"base64").toString("utf8");return JSON.parse(i)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let n=e.split(".")[1],i=Buffer.from(n,"base64").toString("utf8"),o=JSON.parse(i)[O];if(!o)return;let a=o?.ns?.map(r=>typeof r=="object"&&r!==null?{id:r.id,name:r.name,displayName:r.name}:{id:r,name:r,displayName:r})||[];if(a.length===0)return;I(a)}catch{}}async getOrganizations(){return await this.getAccessToken(),A()}async logout(){await m()}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},y=null;function k(){return y||(y=new T),y}async function C(){return S()}async function ee(){let t=await C();if(!t)throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.');if(t==="oauth"){let i=await k().getAccessToken();if(!f())throw new Error('No organization selected. Please run "tigris orgs select" first.');let o=process.env.TIGRIS_ENDPOINT??"https://t3.storage.dev",a=process.env.TIGRIS_STORAGE_IAM_ENDPOINT??"https://iam.storageapi.dev",r=process.env.AUTH0_DOMAIN??"https://auth.tigris.dev";return{sessionToken:i,accessKeyId:"",secretAccessKey:"",endpoint:o,organizationId:f()??void 0,iamEndpoint:a,authDomain:r}}let e=w();if(!e)throw new Error('No credentials found. Please run "tigris configure" first.');return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint}}async function te(){let t=await C();if(!t)throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.');if(t==="oauth"){let n=await k().getAccessToken(),i=f();if(!i)throw new Error('No organization selected. Please run "tigris orgs select" first.');let s=process.env.TIGRIS_ENDPOINT??"https://t3.storage.dev",o=new N({region:"auto",endpoint:s,credentials:{sessionToken:n,accessKeyId:"",secretAccessKey:""}});return o.middlewareStack.add(a=>async r=>{let z=r.request;return z.headers["x-Tigris-Namespace"]=i,await a(r)},{name:"x-Tigris-Namespace-Middleware",step:"build",override:!0}),o}else{let e=w();if(!e)throw new Error('No credentials found. Please run "tigris configure" first.');return new N({region:"auto",endpoint:e.endpoint,credentials:{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey}})}}async function ne(){return await C()!==null}export{C as getLoginMethod,te as getS3Client,ee as getStorageConfig,ne as isAuthenticated};
|
package/dist/cli.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{Command as
|
|
3
|
-
${
|
|
4
|
-
`),e.operations&&e.operations.length>0&&(console.log("Operations:"),e.operations.forEach(t=>{let n=` ${t.name}`;if(t.alias){let
|
|
5
|
-
${
|
|
6
|
-
`),t.arguments&&t.arguments.length>0&&(console.log("Arguments:"),t.arguments.forEach(n=>{console.log(
|
|
7
|
-
${l.name} - ${l.description}
|
|
2
|
+
import{Command as v}from"commander";import{readFileSync as x}from"fs";import{join as E,dirname as k}from"path";import{fileURLToPath as j}from"url";import*as y from"yaml";var h="2.1.0";var q=j(import.meta.url),R=k(q),P=E(R,"specs.yaml"),D=x(P,"utf8"),a=y.parse(D);function w(e){let t;e.type==="noun"?t=` ${e.name}`:(t=` --${e.name}`,e.alias&&(t+=`, -${e.alias}`));let n=26,s=t.length>=n?t+" ":t.padEnd(n),i=e.description;return e.options&&(Array.isArray(e.options)&&typeof e.options[0]=="string"?i+=` (options: ${e.options.join(", ")})`:i+=` (options: ${e.options.map(o=>o.value).join(", ")})`),e.default&&(i+=` [default: ${e.default}]`),e.required&&(i+=" [required]"),e["required-when"]&&(i+=` [required when: ${e["required-when"]}]`),e.multiple&&(i+=" [multiple values: comma-separated]"),e.type==="noun"&&(i+=" [positional argument]"),e.examples&&e.examples.length>0&&(i+=` (examples: ${e.examples.join(", ")})`),`${s}${i}`}function $(e){console.log(`
|
|
3
|
+
${a.name} ${e.name} - ${e.description}
|
|
4
|
+
`),e.operations&&e.operations.length>0&&(console.log("Operations:"),e.operations.forEach(t=>{let n=` ${t.name}`;if(t.alias){let i=Array.isArray(t.alias)?t.alias:[t.alias];n+=` (${i.join(", ")})`}let s=n.padEnd(24);console.log(`${s}${t.description}`)}),console.log()),e.arguments&&e.arguments.length>0&&(console.log("Arguments:"),e.arguments.forEach(t=>{console.log(w(t))}),console.log()),console.log(`Use "${a.name} ${e.name} <operation> help" for more information about an operation.`)}function M(e,t){console.log(`
|
|
5
|
+
${a.name} ${e.name} ${t.name} - ${t.description}
|
|
6
|
+
`),t.arguments&&t.arguments.length>0&&(console.log("Arguments:"),t.arguments.forEach(n=>{console.log(w(n))}),console.log())}function A(){console.log(`Tigris CLI Version: ${h}
|
|
8
7
|
`),console.log(`Usage: tigris [command] [options]
|
|
9
|
-
`),console.log("Commands:"),
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
`),console.log("Commands:"),a.commands.forEach(e=>{let t=` ${e.name}`;e.alias&&(t+=` (${e.alias})`);let n=t.padEnd(24);console.log(`${n}${e.description}`)}),console.log(`
|
|
9
|
+
Use "${a.name} <command> help" for more information about a command.`)}function m(e,t=[]){t.forEach(n=>{if(n.type==="noun"){let s=n.required?`<${n.name}>`:`[${n.name}]`;e.argument(s,n.description)}else{let s=`--${n.name}`;n.alias&&(s+=`, -${n.alias}`),n.options?s+=" <value>":s+=n.required||n["required-when"]?" <value>":" [value]",e.option(s,n.description,n.default)}})}function f(e,t){for(let n of e){if(n["required-when"]){let[s,i]=n["required-when"].split("="),o=d(t,s,e),r=d(t,n.name,e);if(o===i&&!r)return console.error(`--${n.name} is required when --${s} is ${i}`),!1}if(n.required&&!d(t,n.name,e))return console.error(`--${n.name} is required`),!1}return!0}function d(e,t,n){if(n){let i=n.find(o=>o.name===t);if(i&&i.alias){let o=i.alias.charAt(0).toUpperCase()+i.alias.slice(1);if(e[o]!==void 0)return e[o]}}let s=[t,t.replace(/-/g,""),t.replace(/-/g,"").toLowerCase(),t.charAt(0).toUpperCase(),U(t)];for(let i of s)if(e[i]!==void 0)return e[i]}function U(e){return e.replace(/-([a-z])/g,(t,n)=>n.toUpperCase())}async function T(e,t){let n=t?[`./lib/${e}/${t}.js`,`./lib/${e}/${t}/index.js`]:[`./lib/${e}.js`,`./lib/${e}/index.js`];for(let i of n){let o=await import(i).catch(()=>null);if(o)return{module:o,error:null}}return{module:null,error:`Command not found: ${t?`${e} ${t}`:e}`}}async function g(e,t,n=[],s={},i){if(i){let C=i.replace(/\\n/g,`
|
|
10
|
+
`);console.log(C)}let{module:o,error:r}=await T(e,t);(r||!o)&&(console.error(r),process.exit(1));let l=t||e,p=o.default||o[l];typeof p!="function"&&(console.error(`Command not implemented: ${l}`),process.exit(1)),await p({...s,_positional:n})}var u=new v;u.name(a.name).description(a.description).version(a.version);function c(e,t,n){let s;"opts"in n&&typeof n.opts=="function"?s=n.opts():s=n;let i={...s};return e.filter(r=>r.type==="noun").forEach((r,l)=>{t[l]!==void 0&&(r.multiple?i[r.name]=t[l].split(",").map(p=>p.trim()):i[r.name]=t[l])}),e.forEach(r=>{r.multiple&&r.type!=="noun"&&i[r.name]&&typeof i[r.name]=="string"&&(i[r.name]=i[r.name].split(",").map(l=>l.trim()))}),i}a.commands.forEach(e=>{let t=u.command(e.name).description(e.description);if(e.alias&&t.alias(e.alias),e.operations&&e.operations.length>0)if(e.operations.forEach(n=>{let s=t.command(n.name).description(n.description);n.alias&&(Array.isArray(n.alias)?n.alias:[n.alias]).forEach(o=>s.alias(o)),m(s,n.arguments),s.action(async(...i)=>{let o=i.pop(),r=i;n.arguments&&!f(n.arguments,c(n.arguments,r,o))||await g(e.name,n.name,r,c(n.arguments||[],r,o),n.message)}),s.command("help").description("Show help for this operation").action(()=>{M(e,n)})}),e.default){let n=e.operations?.find(s=>s.name===e.default);n&&(m(t,n.arguments),t.action(async(...s)=>{let i=s.pop(),o=s;n.arguments&&!f(n.arguments,c(n.arguments,o,i))||await g(e.name,n.name,o,c(n.arguments||[],o,i),e.message||n.message)}))}else t.action(()=>{$(e)});else m(t,e.arguments),t.action(async(...n)=>{let s=n.pop(),i=n;e.arguments&&!f(e.arguments,c(e.arguments,i,s))||await g(e.name,void 0,i,c(e.arguments||[],i,s),e.message)});t.command("help").description("Show help for this command").action(()=>{$(e)})});u.command("help").description("Show general help").action(()=>{A()});u.action(()=>{A()});u.parse();
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import{Command as
|
|
2
|
-
${
|
|
3
|
-
`),e.operations&&e.operations.length>0&&(console.log("Operations:"),e.operations.forEach(t=>{let n=` ${t.name}`;if(t.alias){let
|
|
4
|
-
${
|
|
5
|
-
`),t.arguments&&t.arguments.length>0&&(console.log("Arguments:"),t.arguments.forEach(n=>{console.log(
|
|
6
|
-
${l.name} - ${l.description}
|
|
1
|
+
import{Command as x}from"commander";import{readFileSync as v}from"fs";import{join as E,dirname as k}from"path";import{fileURLToPath as j}from"url";import*as y from"yaml";var h="2.1.0";var q=j(import.meta.url),R=k(q),P=E(R,"specs.yaml"),D=v(P,"utf8"),a=y.parse(D);function w(e){let t;e.type==="noun"?t=` ${e.name}`:(t=` --${e.name}`,e.alias&&(t+=`, -${e.alias}`));let n=26,s=t.length>=n?t+" ":t.padEnd(n),i=e.description;return e.options&&(Array.isArray(e.options)&&typeof e.options[0]=="string"?i+=` (options: ${e.options.join(", ")})`:i+=` (options: ${e.options.map(o=>o.value).join(", ")})`),e.default&&(i+=` [default: ${e.default}]`),e.required&&(i+=" [required]"),e["required-when"]&&(i+=` [required when: ${e["required-when"]}]`),e.multiple&&(i+=" [multiple values: comma-separated]"),e.type==="noun"&&(i+=" [positional argument]"),e.examples&&e.examples.length>0&&(i+=` (examples: ${e.examples.join(", ")})`),`${s}${i}`}function $(e){console.log(`
|
|
2
|
+
${a.name} ${e.name} - ${e.description}
|
|
3
|
+
`),e.operations&&e.operations.length>0&&(console.log("Operations:"),e.operations.forEach(t=>{let n=` ${t.name}`;if(t.alias){let i=Array.isArray(t.alias)?t.alias:[t.alias];n+=` (${i.join(", ")})`}let s=n.padEnd(24);console.log(`${s}${t.description}`)}),console.log()),e.arguments&&e.arguments.length>0&&(console.log("Arguments:"),e.arguments.forEach(t=>{console.log(w(t))}),console.log()),console.log(`Use "${a.name} ${e.name} <operation> help" for more information about an operation.`)}function M(e,t){console.log(`
|
|
4
|
+
${a.name} ${e.name} ${t.name} - ${t.description}
|
|
5
|
+
`),t.arguments&&t.arguments.length>0&&(console.log("Arguments:"),t.arguments.forEach(n=>{console.log(w(n))}),console.log())}function A(){console.log(`Tigris CLI Version: ${h}
|
|
7
6
|
`),console.log(`Usage: tigris [command] [options]
|
|
8
|
-
`),console.log("Commands:"),
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
`),console.log("Commands:"),a.commands.forEach(e=>{let t=` ${e.name}`;e.alias&&(t+=` (${e.alias})`);let n=t.padEnd(24);console.log(`${n}${e.description}`)}),console.log(`
|
|
8
|
+
Use "${a.name} <command> help" for more information about a command.`)}function m(e,t=[]){t.forEach(n=>{if(n.type==="noun"){let s=n.required?`<${n.name}>`:`[${n.name}]`;e.argument(s,n.description)}else{let s=`--${n.name}`;n.alias&&(s+=`, -${n.alias}`),n.options?s+=" <value>":s+=n.required||n["required-when"]?" <value>":" [value]",e.option(s,n.description,n.default)}})}function f(e,t){for(let n of e){if(n["required-when"]){let[s,i]=n["required-when"].split("="),o=d(t,s,e),r=d(t,n.name,e);if(o===i&&!r)return console.error(`--${n.name} is required when --${s} is ${i}`),!1}if(n.required&&!d(t,n.name,e))return console.error(`--${n.name} is required`),!1}return!0}function d(e,t,n){if(n){let i=n.find(o=>o.name===t);if(i&&i.alias){let o=i.alias.charAt(0).toUpperCase()+i.alias.slice(1);if(e[o]!==void 0)return e[o]}}let s=[t,t.replace(/-/g,""),t.replace(/-/g,"").toLowerCase(),t.charAt(0).toUpperCase(),U(t)];for(let i of s)if(e[i]!==void 0)return e[i]}function U(e){return e.replace(/-([a-z])/g,(t,n)=>n.toUpperCase())}async function T(e,t){let n=t?[`./lib/${e}/${t}.js`,`./lib/${e}/${t}/index.js`]:[`./lib/${e}.js`,`./lib/${e}/index.js`];for(let i of n){let o=await import(i).catch(()=>null);if(o)return{module:o,error:null}}return{module:null,error:`Command not found: ${t?`${e} ${t}`:e}`}}async function g(e,t,n=[],s={},i){if(i){let C=i.replace(/\\n/g,`
|
|
9
|
+
`);console.log(C)}let{module:o,error:r}=await T(e,t);(r||!o)&&(console.error(r),process.exit(1));let l=t||e,p=o.default||o[l];typeof p!="function"&&(console.error(`Command not implemented: ${l}`),process.exit(1)),await p({...s,_positional:n})}var u=new x;u.name(a.name).description(a.description).version(a.version);function c(e,t,n){let s;"opts"in n&&typeof n.opts=="function"?s=n.opts():s=n;let i={...s};return e.filter(r=>r.type==="noun").forEach((r,l)=>{t[l]!==void 0&&(r.multiple?i[r.name]=t[l].split(",").map(p=>p.trim()):i[r.name]=t[l])}),e.forEach(r=>{r.multiple&&r.type!=="noun"&&i[r.name]&&typeof i[r.name]=="string"&&(i[r.name]=i[r.name].split(",").map(l=>l.trim()))}),i}a.commands.forEach(e=>{let t=u.command(e.name).description(e.description);if(e.alias&&t.alias(e.alias),e.operations&&e.operations.length>0)if(e.operations.forEach(n=>{let s=t.command(n.name).description(n.description);n.alias&&(Array.isArray(n.alias)?n.alias:[n.alias]).forEach(o=>s.alias(o)),m(s,n.arguments),s.action(async(...i)=>{let o=i.pop(),r=i;n.arguments&&!f(n.arguments,c(n.arguments,r,o))||await g(e.name,n.name,r,c(n.arguments||[],r,o),n.message)}),s.command("help").description("Show help for this operation").action(()=>{M(e,n)})}),e.default){let n=e.operations?.find(s=>s.name===e.default);n&&(m(t,n.arguments),t.action(async(...s)=>{let i=s.pop(),o=s;n.arguments&&!f(n.arguments,c(n.arguments,o,i))||await g(e.name,n.name,o,c(n.arguments||[],o,i),e.message||n.message)}))}else t.action(()=>{$(e)});else m(t,e.arguments),t.action(async(...n)=>{let s=n.pop(),i=n;e.arguments&&!f(e.arguments,c(e.arguments,i,s))||await g(e.name,void 0,i,c(e.arguments||[],i,s),e.message)});t.command("help").description("Show help for this command").action(()=>{$(e)})});u.command("help").description("Show general help").action(()=>{A()});u.action(()=>{A()});u.parse();
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function f(t,e,n){for(let i of e)if(t[i]!==void 0)return t[i];return n}import fe from"enquirer";import{readFileSync as Q,existsSync as X}from"fs";import{join as z,dirname as Z}from"path";import{fileURLToPath as ee}from"url";import*as D from"yaml";var te=ee(import.meta.url),ne=Z(te),x=null;function ie(){let t=ne;for(let e=0;e<5;e++){let n=z(t,"specs.yaml");if(X(n))return n;t=z(t,"..")}throw new Error("Could not find specs.yaml")}function se(){if(!x){let t=ie(),e=Q(t,"utf8");x=D.parse(e)}return x}function A(t,e){let i=se().commands.find(s=>s.name===t);return i?e&&i.operations?i.operations.find(s=>s.name===e)||null:i:null}function m(t,e,n){let i=A(t,n);return!i||!i.arguments?null:i.arguments.find(s=>s.name===e)||null}function h(t){return t.options?Array.isArray(t.options)&&typeof t.options[0]=="string"?t.options.map(e=>({name:e,message:e.charAt(0).toUpperCase()+e.slice(1),value:e})):Array.isArray(t.options)&&typeof t.options[0]=="object"?t.options.map(e=>({name:e.value,message:e.description?`${e.name} - ${e.description}`:e.name,value:e.value})):null:null}import{createBucket as pe}from"@tigrisdata/storage";import{S3Client as ze}from"@aws-sdk/client-s3";import{homedir as oe}from"os";import{join as R}from"path";import{readFileSync as re,writeFileSync as ae,existsSync as K,mkdirSync as ce}from"fs";import{chmod as de}from"fs/promises";var v=R(oe(),".tigris"),C=R(v,"config.json");function le(){K(v)||ce(v,{recursive:!0,mode:448})}function g(){if(K(C))try{let t=re(C,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function T(t){le(),ae(C,JSON.stringify(t,null,2),{mode:384});try{await de(C,384)}catch{}}async function I(t){let e=g();e.tokens=t,await T(e)}async function y(){return g().tokens||null}async function _(){let t=g();delete t.tokens,await T(t)}async function L(t){let e=g();e.organizations=t,await T(e)}function F(){return g().organizations||[]}function O(){return g().selectedOrganization||null}function $(){let t=g();return t.temporaryCredentials||t.credentials||null}async function U(t){let e=g();e.loginMethod=t,await T(e)}function q(){return g().loginMethod||null}import k from"axios";import ge from"open";function j(){return{domain:process.env.AUTH0_DOMAIN||"auth-dev.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF",audience:process.env.AUTH0_AUDIENCE||"https://tigris-api-dev"}}var H="https://tigris";var b=class{config;baseUrl;constructor(){this.config=j(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(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?.(i.user_code,i.verification_uri),await this.sleep(2e3);try{await ge(i.verification_uri_complete)}catch{}e?.onWaiting?.();let s=await this.pollForToken(i.device_code,i.interval||5);await I(s),U("oauth"),await this.extractAndStoreOrganizations(s.idToken)}async pollForToken(e,n){let s=0;for(;s<60;){s++;try{let c=(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,r=Date.now()+(c.expires_in||3600)*1e3;return{accessToken:c.access_token,refreshToken:c.refresh_token,idToken:c.id_token,expiresAt:r}}catch(o){if(k.isAxiosError(o)&&o.response){let c=o.response.data?.error;if(c==="authorization_pending"){await this.sleep(n*1e3);continue}if(c==="slow_down"){n+=5,await this.sleep(n*1e3);continue}throw new Error(o.response.data?.error_description||"Authentication failed")}throw o}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await y();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let 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 y(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let s=(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,o={accessToken:s.access_token,refreshToken:s.refresh_token||n.refreshToken,idToken:s.id_token||n.idToken,expiresAt:Date.now()+(s.expires_in||3600)*1e3};return await I(o),o}catch{throw await _(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await y();if(!e||!e.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let 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)[H];if(!o)return;let c=o?.ns?.map(r=>typeof r=="object"&&r!==null?{id:r.id,name:r.name,displayName:r.name}:{id:r,name:r,displayName:r})||[];if(c.length===0)return;L(c)}catch{}}async getOrganizations(){return await this.getAccessToken(),F()}async logout(){await _()}async isAuthenticated(){return await y()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},P=null;function V(){return P||(P=new b),P}async function ue(){return q()}async function G(){let t=await ue();if(!t)throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.');if(t==="oauth"){let i=await V().getAccessToken();if(!O())throw new Error('No organization selected. Please run "tigris orgs select" first.');let o=process.env.TIGRIS_ENDPOINT??"https://t3.storage.dev",c=process.env.TIGRIS_STORAGE_IAM_ENDPOINT??"https://iam.storageapi.dev",r=process.env.AUTH0_DOMAIN??"https://auth.tigris.dev";return{sessionToken:i,accessKeyId:"",secretAccessKey:"",endpoint:o,organizationId:O()??void 0,iamEndpoint:c,authDomain:r}}let e=$();if(!e)throw new Error('No credentials found. Please run "tigris configure" first.');return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint}}var B={success:"\u2714",failure:"\u2716",hint:"\u2192"};function M(t){let e=A(t.command,t.operation);if(e)return e.messages}function N(t,e){let n=t;return n=n.replace(/\\n/g,`
|
|
2
|
+
`),e&&(n=n.replace(/\{\{(\w+)\}\}/g,(i,s)=>{let o=e[s];return o!==void 0?String(o):`{{${s}}}`})),n}function J(t,e){let n=M(t);n?.onStart&&console.log(N(n.onStart,e))}function W(t,e){let n=M(t);n?.onSuccess&&console.log(`${B.success} ${N(n.onSuccess,e)}`)}function S(t,e,n){let i=M(t);i?.onFailure&&console.error(`${B.failure} ${N(i.onFailure,n)}`),e&&console.error(` ${e}`)}function Y(t,e){return{command:t,operation:e}}var{prompt:me}=fe,w=Y("buckets","create");async function he(t){J(w);let e=!f(t,["name"]),n=f(t,["name"]),i=e?void 0:f(t,["access","a","A"]),s=e?void 0:f(t,["enable-snapshots","s","S"]),o=e?void 0:f(t,["default-tier","t","T"]),c=e?void 0:f(t,["consistency","c","C"]),r=e?void 0:f(t,["region","r","R"]),u=[];if((!n||e)&&u.push({type:"input",name:"name",message:"Bucket name:",required:!0}),!i||e){let a=m("buckets","access","create"),l=h(a),d=l?.findIndex(p=>p.value===a?.default);u.push({type:"select",name:"access",message:"Access level:",choices:l||[],initial:d!==void 0&&d>=0?d:0})}if(!o||e){let a=m("buckets","default-tier","create"),l=h(a),d=l?.findIndex(p=>p.value===a?.default);u.push({type:"select",name:"defaultTier",message:"Default storage tier:",choices:l||[],initial:d!==void 0&&d>=0?d:0})}if(!c||e){let a=m("buckets","consistency","create"),l=h(a),d=l?.findIndex(p=>p.value===a?.default);u.push({type:"select",name:"consistency",message:"Consistency level:",choices:l||[],initial:d!==void 0&&d>=0?d:0})}if(!r||e){let a=m("buckets","region","create"),l=h(a),d=l?.findIndex(p=>p.value===a?.default);u.push({type:"select",name:"region",message:"Region:",choices:l||[],initial:d!==void 0&&d>=0?d:0})}if((s===void 0||e)&&u.push({type:"confirm",name:"enableSnapshots",message:"Enable snapshots?",initial:!0}),u.length>0)try{let a=await me(u);n=n||a.name,i=i||a.access,s=s!==void 0?s:a.enableSnapshots,o=o||a.defaultTier,c=c||a.consistency,r=r!==void 0?r:a.region}catch{S(w,"Operation cancelled"),process.exit(1)}n||(S(w,"Bucket name is required"),process.exit(1));let{error:E}=await pe(n,{defaultTier:o??"STANDARD",consistency:c==="strict"?"strict":"default",enableSnapshot:s===!0,region:r!=="global"&&r!==void 0?r.split(","):void 0,config:await G()});E&&(S(w,E.message),process.exit(1)),W(w,{name:n})}export{he as default};
|
package/dist/lib/buckets/list.js
CHANGED
|
@@ -1,14 +1,7 @@
|
|
|
1
|
-
function
|
|
2
|
-
`)}function
|
|
3
|
-
`)}function
|
|
4
|
-
`+
|
|
5
|
-
`),
|
|
6
|
-
`)}function
|
|
7
|
-
`);
|
|
8
|
-
`)}console.log(`\u23F3 Waiting for authentication...
|
|
9
|
-
`);let o=await this.pollForToken(t.device_code,t.interval||5);await m(o),P("oauth"),await this.extractAndStoreOrganizations(o.idToken),console.log(`\u2705 Authentication successful!
|
|
10
|
-
`)}catch(e){throw e instanceof Error?console.error(`\u274C Authentication failed: ${e.message}`):console.error("\u274C Authentication failed"),e}}async pollForToken(e,t){let r=0;for(;r<60;){r++;try{let a=(await f.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,i=Date.now()+(a.expires_in||3600)*1e3;return{accessToken:a.access_token,refreshToken:a.refresh_token,idToken:a.id_token,expiresAt:i}}catch(s){if(f.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 u();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let t=300*1e3;return Date.now()+t>=e.expiresAt&&(console.log("\u{1F504} Refreshing access token..."),e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){if(!e.refreshToken)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let o=(await f.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:e.refreshToken},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,r={accessToken:o.access_token,refreshToken:o.refresh_token||e.refreshToken,idToken:o.id_token||e.idToken,expiresAt:Date.now()+(o.expires_in||3600)*1e3};return await m(r),r}catch{throw await w(),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){console.warn("\u26A0\uFE0F No ID token available, skipping organization extraction");return}try{let t=e.split(".")[1],o=Buffer.from(t,"base64").toString("utf8"),s=JSON.parse(o)[z];if(!s){console.warn("\u26A0\uFE0F No Tigris claims found in token");return}let a=s?.ns?.map(i=>typeof i=="object"&&i!==null?{id:i.id,name:i.name,displayName:i.name}:{id:i,name:i,displayName:i})||[];if(a.length===0){console.warn("\u26A0\uFE0F No organizations found in claims");return}A(a),console.log(`\u{1F4C2} Found ${a.length} organization(s)`)}catch{console.error("Failed to extract organizations from token")}}async getOrganizations(){return await this.getAccessToken(),I()}async logout(){await w(),console.log("\u2705 Logged out successfully")}async isAuthenticated(){return await u()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},k=null;function E(){return k||(k=new T),k}async function G(){return N()}async function M(){let n=await G();if(!n)throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.');if(n==="oauth"){let t=await E().getAccessToken(),o=O();if(!o)throw new Error('No organization selected. Please run "tigris orgs select" first.');let r=process.env.TIGRIS_ENDPOINT??"https://t3.storage.dev",s=new R({region:"auto",endpoint:r,credentials:{sessionToken:t,accessKeyId:"",secretAccessKey:""}});return s.middlewareStack.add(a=>async i=>{let p=i.request;return p.headers["x-Tigris-Namespace"]=o,await a(i)},{name:"x-Tigris-Namespace-Middleware",step:"build",override:!0}),s}else{let e=S();if(!e)throw new Error('No credentials found. Please run "tigris configure" first.');return new R({region:"auto",endpoint:e.endpoint,credentials:{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey}})}}import{ListBucketsCommand as V}from"@aws-sdk/client-s3";async function W(n){console.log("\u{1FAA3} Listing Buckets");try{let e=C(n,["format","F"],"table"),t=await M(),o=new V({}),r=await t.send(o);if(!r.Buckets||r.Buckets.length===0){console.log("No buckets found");return}let s=r.Buckets.map(i=>({name:i.Name||"",created:i.CreationDate?i.CreationDate.toISOString().split("T")[0]:"N/A"})),a=x(s,e,"buckets","bucket",[{key:"name",header:"Name",width:50},{key:"created",header:"Created",width:50}]);console.log(a),console.log(`Found ${s.length} bucket(s)`)}catch(e){e instanceof Error?(console.error(`
|
|
11
|
-
\u274C Failed to list buckets: ${e.message}`),e.message.includes("Not authenticated")?console.log(`\u{1F4A1} Run "tigris login" or "tigris configure" to authenticate
|
|
12
|
-
`):e.message.includes("No organization selected")&&console.log(`\u{1F4A1} Run "tigris orgs select" to choose an organization
|
|
13
|
-
`)):console.error(`
|
|
14
|
-
\u274C An unknown error occurred`),process.exit(1)}}export{W as default};
|
|
1
|
+
function P(t,e,n){for(let o of e)if(t[o]!==void 0)return t[o];return n}function Q(t){return JSON.stringify(t,null,2)}function Z(t,e=" "){return Object.entries(t).map(([n,o])=>`${e}<${n}>${o}</${n}>`).join(`
|
|
2
|
+
`)}function ee(t,e,n){let o=[`<${e}>`];return t.forEach(r=>{o.push(` <${n}>`),o.push(Z(r," ")),o.push(` </${n}>`)}),o.push(`</${e}>`),o.join(`
|
|
3
|
+
`)}function M(t){if(t==null)return"";if(t instanceof Date)return b(t);if(typeof t=="string"){let e=new Date(t);if(!isNaN(e.getTime())&&t.includes("T"))return b(e)}return String(t)}function b(t){return new Intl.DateTimeFormat(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(t)}function te(t,e){return e.map(n=>{if(n.width)return n.width;let o=n.header.length,r=t.reduce((i,s)=>{let a=M(s[n.key]);return Math.max(i,a.length)},0);return Math.max(o,r)})}function ne(t,e){let n=[],o=te(t,e),r="\u250C"+o.map(c=>"\u2500".repeat(c+2)).join("\u252C")+"\u2510",i="\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
|
+
`+r);let a="\u2502 "+e.map((c,w)=>c.header.padEnd(o[w])).join(" \u2502 ")+" \u2502";return n.push(a),n.push(i),t.forEach(c=>{let w=e.map((_,I)=>{let O=M(c[_.key]);return _.align==="right"?O.padStart(o[I]):O.padEnd(o[I])});n.push("\u2502 "+w.join(" \u2502 ")+" \u2502")}),n.push(s+`
|
|
5
|
+
`),n.join(`
|
|
6
|
+
`)}function N(t,e,n,o,r){switch(e){case"json":return Q(t);case"xml":return ee(t,n,o);default:return ne(t,r)}}import{S3Client as ze}from"@aws-sdk/client-s3";import{homedir as oe}from"os";import{join as E}from"path";import{readFileSync as re,writeFileSync as ie,existsSync as D,mkdirSync as se}from"fs";import{chmod as ae}from"fs/promises";var T=E(oe(),".tigris"),l=E(T,"config.json");function ce(){D(T)||se(T,{recursive:!0,mode:448})}function d(){if(D(l))try{let t=re(l,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function p(t){ce(),ie(l,JSON.stringify(t,null,2),{mode:384});try{await ae(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 C(){let t=d();delete t.tokens,await p(t)}async function z(t){let e=d();e.organizations=t,await p(e)}function R(){return d().organizations||[]}function x(){return d().selectedOrganization||null}function $(){let t=d();return t.temporaryCredentials||t.credentials||null}async function j(t){let e=d();e.loginMethod=t,await p(e)}function F(){return d().loginMethod||null}import f from"axios";import de from"open";function K(){return{domain:process.env.AUTH0_DOMAIN||"auth-dev.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF",audience:process.env.AUTH0_AUDIENCE||"https://tigris-api-dev"}}var L="https://tigris";var A=class{config;baseUrl;constructor(){this.config=K(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await f.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(o.user_code,o.verification_uri),await this.sleep(2e3);try{await de(o.verification_uri_complete)}catch{}e?.onWaiting?.();let r=await this.pollForToken(o.device_code,o.interval||5);await k(r),j("oauth"),await this.extractAndStoreOrganizations(r.idToken)}async pollForToken(e,n){let r=0;for(;r<60;){r++;try{let s=(await f.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(i){if(f.isAxiosError(i)&&i.response){let s=i.response.data?.error;if(s==="authorization_pending"){await this.sleep(n*1e3);continue}if(s==="slow_down"){n+=5,await this.sleep(n*1e3);continue}throw new Error(i.response.data?.error_description||"Authentication failed")}throw i}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await 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 r=(await f.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:n.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,i={accessToken:r.access_token,refreshToken:r.refresh_token||n.refreshToken,idToken:r.id_token||n.idToken,expiresAt:Date.now()+(r.expires_in||3600)*1e3};return await k(i),i}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"),i=JSON.parse(o)[L];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;z(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),R()}async logout(){await C()}async isAuthenticated(){return await g()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},S=null;function U(){return S||(S=new A),S}async function ue(){return F()}async function V(){let t=await ue();if(!t)throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.');if(t==="oauth"){let o=await U().getAccessToken();if(!x())throw new Error('No organization selected. Please run "tigris orgs select" first.');let i=process.env.TIGRIS_ENDPOINT??"https://t3.storage.dev",s=process.env.TIGRIS_STORAGE_IAM_ENDPOINT??"https://iam.storageapi.dev",a=process.env.AUTH0_DOMAIN??"https://auth.tigris.dev";return{sessionToken:o,accessKeyId:"",secretAccessKey:"",endpoint:i,organizationId:x()??void 0,iamEndpoint:s,authDomain:a}}let e=$();if(!e)throw new Error('No credentials found. Please run "tigris configure" first.');return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint}}import{listBuckets as Te}from"@tigrisdata/storage";import{readFileSync as ge,existsSync as le}from"fs";import{join as H,dirname as pe}from"path";import{fileURLToPath as fe}from"url";import*as J from"yaml";var me=fe(import.meta.url),he=pe(me),v=null;function ye(){let t=he;for(let e=0;e<5;e++){let n=H(t,"specs.yaml");if(le(n))return n;t=H(t,"..")}throw new Error("Could not find specs.yaml")}function we(){if(!v){let t=ye(),e=ge(t,"utf8");v=J.parse(e)}return v}function B(t,e){let o=we().commands.find(r=>r.name===t);return o?e&&o.operations?o.operations.find(r=>r.name===e)||null:o:null}var G={success:"\u2714",failure:"\u2716",hint:"\u2192"};function m(t){let e=B(t.command,t.operation);if(e)return e.messages}function h(t,e){let n=t;return n=n.replace(/\\n/g,`
|
|
7
|
+
`),e&&(n=n.replace(/\{\{(\w+)\}\}/g,(o,r)=>{let i=e[r];return i!==void 0?String(i):`{{${r}}}`})),n}function W(t,e){let n=m(t);n?.onStart&&console.log(h(n.onStart,e))}function q(t,e){let n=m(t);n?.onSuccess&&console.log(`${G.success} ${h(n.onSuccess,e)}`)}function y(t,e,n){let o=m(t);o?.onFailure&&console.error(`${G.failure} ${h(o.onFailure,n)}`),e&&console.error(` ${e}`)}function Y(t,e){let n=m(t);n?.onEmpty&&console.log(h(n.onEmpty,e))}function X(t,e){return{command:t,operation:e}}var u=X("buckets","list");async function ke(t){W(u);try{let e=P(t,["format","F"],"table"),{data:n,error:o}=await Te({config:await V()});if(o&&(y(u,o.message),process.exit(1)),!n.buckets||n.buckets.length===0){Y(u);return}let r=n.buckets.map(s=>({name:s.name,created:s.creationDate})),i=N(r,e,"buckets","bucket",[{key:"name",header:"Name"},{key:"created",header:"Created"}]);console.log(i),q(u,{count:r.length})}catch(e){e instanceof Error?y(u,e.message):y(u,"An unknown error occurred"),process.exit(1)}}export{ke as default};
|
|
@@ -1,6 +1,2 @@
|
|
|
1
|
-
import
|
|
2
|
-
`);let n=e["access-key"]||e.accessKey||e.key||e.Key||e.accesskey,
|
|
3
|
-
`);try{let t=[];n||t.push({type:"input",name:"accessKey",message:"Tigris Access Key ID:",required:!0}),i||t.push({type:"password",name:"accessSecret",message:"Tigris Secret Access Key:",required:!0}),o||t.push({type:"input",name:"endpoint",message:"Tigris Endpoint:",required:!0,initial:process.env.TIGRIS_ENDPOINT??"https://t3.storage.dev"});let s=await w(t);n=n||s.accessKey,i=i||s.accessSecret,o=o||s.endpoint}catch{console.error(`
|
|
4
|
-
\u274C Configuration cancelled`),process.exit(1)}}(!n||!i||!o)&&(console.error("\u274C All credentials are required"),process.exit(1));try{await f({accessKeyId:n,secretAccessKey:i,endpoint:o}),await u("credentials"),console.log(`
|
|
5
|
-
\u2705 Credentials saved successfully!`),console.log(`
|
|
6
|
-
\u{1F4A1} You can now use Tigris CLI commands with these credentials.`)}catch(t){console.error("\u274C Failed to save credentials:",t),process.exit(1)}}export{S as default};
|
|
1
|
+
import L from"enquirer";import{homedir as P}from"os";import{join as p}from"path";import{readFileSync as T,writeFileSync as k,existsSync as u,mkdirSync as I}from"fs";import{chmod as z}from"fs/promises";var g=p(P(),".tigris"),a=p(g,"config.json");function K(){u(g)||I(g,{recursive:!0,mode:448})}function m(){if(u(a))try{let e=T(a,"utf8");return JSON.parse(e)}catch{return{}}return{}}async function y(e){K(),k(a,JSON.stringify(e,null,2),{mode:384});try{await z(a,384)}catch{}}async function C(e){let n=m();n.credentials=e,await y(n)}async function S(e){let n=m();n.loginMethod=e,await y(n)}import{readFileSync as b,existsSync as F}from"fs";import{join as x,dirname as $}from"path";import{fileURLToPath as D}from"url";import*as h from"yaml";var E=D(import.meta.url),V=$(E),l=null;function _(){let e=V;for(let n=0;n<5;n++){let t=x(e,"specs.yaml");if(F(t))return t;e=x(e,"..")}throw new Error("Could not find specs.yaml")}function j(){if(!l){let e=_(),n=b(e,"utf8");l=h.parse(n)}return l}function v(e,n){let s=j().commands.find(r=>r.name===e);return s?n&&s.operations?s.operations.find(r=>r.name===n)||null:s:null}var M={success:"\u2714",failure:"\u2716",hint:"\u2192"};function f(e){let n=v(e.command,e.operation);if(n)return n.messages}function d(e,n){let t=e;return t=t.replace(/\\n/g,`
|
|
2
|
+
`),n&&(t=t.replace(/\{\{(\w+)\}\}/g,(s,r)=>{let o=n[r];return o!==void 0?String(o):`{{${r}}}`})),t}function A(e,n){let t=f(e);t?.onStart&&console.log(d(t.onStart,n))}function O(e,n){let t=f(e);t?.onSuccess&&console.log(`${M.success} ${d(t.onSuccess,n)}`)}function c(e,n,t){let s=f(e);s?.onFailure&&console.error(`${M.failure} ${d(s.onFailure,t)}`),n&&console.error(` ${n}`)}function w(e,n){return{command:e,operation:n}}var{prompt:q}=L,i=w("configure");async function N(e){A(i);let n=e["access-key"]||e.accessKey||e.key||e.Key||e.accesskey,t=e["access-secret"]||e.accessSecret||e.secret||e.Secret||e.accesssecret,s=e.endpoint||e.e||e.E||e.Endpoint;if(!n||!t||!s)try{let r=[];n||r.push({type:"input",name:"accessKey",message:"Tigris Access Key ID:",required:!0}),t||r.push({type:"password",name:"accessSecret",message:"Tigris Secret Access Key:",required:!0}),s||r.push({type:"input",name:"endpoint",message:"Tigris Endpoint:",required:!0,initial:process.env.TIGRIS_ENDPOINT??"https://t3.storage.dev"});let o=await q(r);n=n||o.accessKey,t=t||o.accessSecret,s=s||o.endpoint}catch{c(i,"Configuration cancelled"),process.exit(1)}(!n||!t||!s)&&(c(i,"All credentials are required"),process.exit(1));try{await C({accessKeyId:n,secretAccessKey:t,endpoint:s}),await S("credentials"),O(i)}catch{c(i,"Failed to save credentials"),process.exit(1)}}export{N as default};
|
package/dist/lib/cp.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
async function t(e){let s=e.src||e._positional?.[0],r=e.dest||e._positional?.[1];(!s||!r)&&(console.error("both src and dest arguments are required"),process.exit(1)),console.error("cp command not yet implemented"),process.exit(1)}export{t as default};
|
|
@@ -1,9 +1,2 @@
|
|
|
1
|
-
import
|
|
2
|
-
`);let s=e["access-key"]||e.accessKey||e.key||e.Key||e.accesskey,
|
|
3
|
-
`),s=o.accessKeyId,n=o.secretAccessKey;else try{if((await d({type:"confirm",name:"useSaved",message:"Saved credentials found. Use them?",initial:!0})).useSaved)console.log(`\u{1F4C1} Using saved credentials...
|
|
4
|
-
`),s=o.accessKeyId,n=o.secretAccessKey;else{console.log(`Please provide your access credentials.
|
|
5
|
-
`);let r=[];s||r.push({type:"input",name:"accessKey",message:"Tigris Access Key ID:",required:!0}),n||r.push({type:"password",name:"accessSecret",message:"Tigris Secret Access Key:",required:!0});let f=await d(r);s=s||f.accessKey,n=n||f.accessSecret}}catch{console.error(`
|
|
6
|
-
\u274C Login cancelled`),process.exit(1)}else{g&&(console.error(`\u274C No saved credentials found. Please run "tigris configure" first.
|
|
7
|
-
`),process.exit(1)),console.log(`No saved credentials found. Please provide your access credentials.
|
|
8
|
-
`);try{let t=[];s||t.push({type:"input",name:"accessKey",message:"Tigris Access Key ID:",required:!0}),n||t.push({type:"password",name:"accessSecret",message:"Tigris Secret Access Key:",required:!0});let r=await d(t);s=s||r.accessKey,n=n||r.accessSecret}catch{console.error(`
|
|
9
|
-
\u274C Login cancelled`),process.exit(1)}}}(!s||!n)&&(console.error("\u274C Access key and secret are required"),process.exit(1)),console.log("\u{1F511} Authenticating with credentials..."),console.log(`Access Key: ${s}`),console.log(`Access Secret: ${"*".repeat(String(n).length)}`);let S=l()?.endpoint||"https://t3.storage.dev";await m({accessKeyId:s,secretAccessKey:n,endpoint:S}),await C("credentials"),console.log("\u2705 Successfully authenticated with credentials")}export{k as default};
|
|
1
|
+
import J from"enquirer";import{homedir as b}from"os";import{join as v}from"path";import{readFileSync as F,writeFileSync as $,existsSync as h,mkdirSync as D}from"fs";import{chmod as L}from"fs/promises";var f=v(b(),".tigris"),d=v(f,"config.json");function V(){h(f)||D(f,{recursive:!0,mode:448})}function u(){if(h(d))try{let e=F(d,"utf8");return JSON.parse(e)}catch{return{}}return{}}async function M(e){V(),$(d,JSON.stringify(e,null,2),{mode:384});try{await L(d,384)}catch{}}function p(){let e=u();return e.temporaryCredentials||e.credentials||null}async function A(e){let n=u();n.temporaryCredentials=e,await M(n)}async function w(e){let n=u();n.loginMethod=e,await M(n)}import{readFileSync as j,existsSync as q}from"fs";import{join as P,dirname as _}from"path";import{fileURLToPath as E}from"url";import*as K from"yaml";var N=E(import.meta.url),R=_(N),m=null;function U(){let e=R;for(let n=0;n<5;n++){let s=P(e,"specs.yaml");if(q(s))return s;e=P(e,"..")}throw new Error("Could not find specs.yaml")}function G(){if(!m){let e=U(),n=j(e,"utf8");m=K.parse(n)}return m}function O(e,n){let t=G().commands.find(r=>r.name===e);return t?n&&t.operations?t.operations.find(r=>r.name===n)||null:t:null}var T={success:"\u2714",failure:"\u2716",hint:"\u2192"};function y(e){let n=O(e.command,e.operation);if(n)return n.messages}function C(e,n){let s=e;return s=s.replace(/\\n/g,`
|
|
2
|
+
`),n&&(s=s.replace(/\{\{(\w+)\}\}/g,(t,r)=>{let g=n[r];return g!==void 0?String(g):`{{${r}}}`})),s}function k(e,n){let s=y(e);s?.onStart&&console.log(C(s.onStart,n))}function I(e,n){let s=y(e);s?.onSuccess&&console.log(`${T.success} ${C(s.onSuccess,n)}`)}function l(e,n,s){let t=y(e);t?.onFailure&&console.error(`${T.failure} ${C(t.onFailure,s)}`),n&&console.error(` ${n}`)}function z(e,n){return{command:e,operation:n}}var{prompt:S}=J,c=z("login","credentials");async function Y(e){k(c);let n=e["access-key"]||e.accessKey||e.key||e.Key||e.accesskey,s=e["access-secret"]||e.accessSecret||e.secret||e.Secret||e.accesssecret,t=e.profile||e.Profile||e.p||e.P;if(!n||!s){let a=p();if(a)if(t)n=a.accessKeyId,s=a.secretAccessKey;else try{if((await S({type:"confirm",name:"useSaved",message:"Saved credentials found. Use them?",initial:!0})).useSaved)n=a.accessKeyId,s=a.secretAccessKey;else{let i=[];n||i.push({type:"input",name:"accessKey",message:"Tigris Access Key ID:",required:!0}),s||i.push({type:"password",name:"accessSecret",message:"Tigris Secret Access Key:",required:!0});let x=await S(i);n=n||x.accessKey,s=s||x.accessSecret}}catch{l(c,"Login cancelled"),process.exit(1)}else{t&&(l(c,'No saved credentials found. Please run "tigris configure" first.'),process.exit(1));try{let o=[];n||o.push({type:"input",name:"accessKey",message:"Tigris Access Key ID:",required:!0}),s||o.push({type:"password",name:"accessSecret",message:"Tigris Secret Access Key:",required:!0});let i=await S(o);n=n||i.accessKey,s=s||i.accessSecret}catch{l(c,"Login cancelled"),process.exit(1)}}}(!n||!s)&&(l(c,"Access key and secret are required"),process.exit(1));let g=p()?.endpoint||"https://t3.storage.dev";await A({accessKeyId:n,secretAccessKey:s,endpoint:g}),await w("credentials"),I(c)}export{Y as default};
|
package/dist/lib/login/select.js
CHANGED
|
@@ -1,18 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
`)
|
|
3
|
-
|
|
4
|
-
`)
|
|
5
|
-
|
|
6
|
-
`);return}await e.login();let n=await e.getOrganizations();if(n.length>0){let o=n[0];K(o.id),console.log("\u{1F3AF} Auto-selected organization:"),console.log(` ${o.displayName||o.name} (${o.id})
|
|
7
|
-
`),n.length>1&&(console.log(`\u{1F4A1} You have ${n.length} organizations available.`),console.log(` Run "tigris orgs list" to see all and switch if needed.
|
|
8
|
-
`))}}catch{process.exit(1)}}import F from"enquirer";var{prompt:A}=F;async function g(e){console.log(`\u{1F510} Tigris Machine Login
|
|
9
|
-
`);let t=e["access-key"]||e.accessKey||e.key||e.Key||e.accesskey,n=e["access-secret"]||e.accessSecret||e.secret||e.Secret||e.accesssecret,o=e.profile||e.Profile||e.p||e.P;if(!t||!n){let s=k();if(s)if(o)console.log(`\u{1F4C1} Using saved credentials from profile...
|
|
10
|
-
`),t=s.accessKeyId,n=s.secretAccessKey;else try{if((await A({type:"confirm",name:"useSaved",message:"Saved credentials found. Use them?",initial:!0})).useSaved)console.log(`\u{1F4C1} Using saved credentials...
|
|
11
|
-
`),t=s.accessKeyId,n=s.secretAccessKey;else{console.log(`Please provide your access credentials.
|
|
12
|
-
`);let l=[];t||l.push({type:"input",name:"accessKey",message:"Tigris Access Key ID:",required:!0}),n||l.push({type:"password",name:"accessSecret",message:"Tigris Secret Access Key:",required:!0});let S=await A(l);t=t||S.accessKey,n=n||S.accessSecret}}catch{console.error(`
|
|
13
|
-
\u274C Login cancelled`),process.exit(1)}else{o&&(console.error(`\u274C No saved credentials found. Please run "tigris configure" first.
|
|
14
|
-
`),process.exit(1)),console.log(`No saved credentials found. Please provide your access credentials.
|
|
15
|
-
`);try{let r=[];t||r.push({type:"input",name:"accessKey",message:"Tigris Access Key ID:",required:!0}),n||r.push({type:"password",name:"accessSecret",message:"Tigris Secret Access Key:",required:!0});let l=await A(r);t=t||l.accessKey,n=n||l.accessSecret}catch{console.error(`
|
|
16
|
-
\u274C Login cancelled`),process.exit(1)}}}(!t||!n)&&(console.error("\u274C Access key and secret are required"),process.exit(1)),console.log("\u{1F511} Authenticating with credentials..."),console.log(`Access Key: ${t}`),console.log(`Access Secret: ${"*".repeat(String(n).length)}`);let i=k()?.endpoint||"https://t3.storage.dev";await N({accessKeyId:t,secretAccessKey:n,endpoint:i}),await p("credentials"),console.log("\u2705 Successfully authenticated with credentials")}var{prompt:J}=q;async function H(e){let t=e.profile||e.Profile||e.p||e.P,n=e["access-key"]||e.accessKey||e.key||e.Key||e.accesskey,o=e["access-secret"]||e.accessSecret||e.secret||e.Secret||e.accesssecret,a=e.oauth||e.OAuth||e.o||e.O;if(t){await g(e);return}if(n||o){await g(e);return}if(a){await C();return}console.log(`\u{1F510} Tigris Login
|
|
17
|
-
`);try{(await J({type:"select",name:"loginType",message:"How would you like to login?",choices:[{name:"user",message:"As a user (OAuth2 flow)",value:"user"},{name:"machine",message:"As a machine (Access Key & Secret)",value:"machine"}]})).loginType==="user"?await C():await g(e)}catch{console.error(`
|
|
18
|
-
\u274C Login cancelled`),process.exit(1)}}export{H as default};
|
|
1
|
+
import ge from"enquirer";import T from"axios";import te from"open";function N(){return{domain:process.env.AUTH0_DOMAIN||"auth-dev.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF",audience:process.env.AUTH0_AUDIENCE||"https://tigris-api-dev"}}var E="https://tigris";import{homedir as G}from"os";import{join as F}from"path";import{readFileSync as Y,writeFileSync as Q,existsSync as $,mkdirSync as X}from"fs";import{chmod as Z}from"fs/promises";var v=F(G(),".tigris"),S=F(v,"config.json");function ee(){$(v)||X(v,{recursive:!0,mode:448})}function c(){if($(S))try{let e=Y(S,"utf8");return JSON.parse(e)}catch{return{}}return{}}async function g(e){ee(),Q(S,JSON.stringify(e,null,2),{mode:384});try{await Z(S,384)}catch{}}async function A(e){let t=c();t.tokens=e,await g(t)}async function m(){return c().tokens||null}async function _(){let e=c();delete e.tokens,await g(e)}async function L(e){let t=c();t.organizations=e,await g(t)}function R(){return c().organizations||[]}async function U(e){let t=c();t.selectedOrganization=e,await g(t)}function O(){let e=c();return e.temporaryCredentials||e.credentials||null}async function j(e){let t=c();t.temporaryCredentials=e,await g(t)}async function k(e){let t=c();t.loginMethod=e,await g(t)}var I=class{config;baseUrl;constructor(){this.config=N(),this.baseUrl=`https://${this.config.domain}`}async login(t){let s=(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;t?.onDeviceCode?.(s.user_code,s.verification_uri),await this.sleep(2e3);try{await te(s.verification_uri_complete)}catch{}t?.onWaiting?.();let r=await this.pollForToken(s.device_code,s.interval||5);await A(r),k("oauth"),await this.extractAndStoreOrganizations(r.idToken)}async pollForToken(t,n){let r=0;for(;r<60;){r++;try{let a=(await T.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,o=Date.now()+(a.expires_in||3600)*1e3;return{accessToken:a.access_token,refreshToken:a.refresh_token,idToken:a.id_token,expiresAt:o}}catch(i){if(T.isAxiosError(i)&&i.response){let a=i.response.data?.error;if(a==="authorization_pending"){await this.sleep(n*1e3);continue}if(a==="slow_down"){n+=5,await this.sleep(n*1e3);continue}throw new Error(i.response.data?.error_description||"Authentication failed")}throw i}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let t=await m();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 m(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let r=(await T.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:n.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,i={accessToken:r.access_token,refreshToken:r.refresh_token||n.refreshToken,idToken:r.id_token||n.idToken,expiresAt:Date.now()+(r.expires_in||3600)*1e3};return await A(i),i}catch{throw await _(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let t=await m();if(!t||!t.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let n=t.idToken.split(".")[1],s=Buffer.from(n,"base64").toString("utf8");return JSON.parse(s)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(t){if(t)try{let n=t.split(".")[1],s=Buffer.from(n,"base64").toString("utf8"),i=JSON.parse(s)[E];if(!i)return;let a=i?.ns?.map(o=>typeof o=="object"&&o!==null?{id:o.id,name:o.name,displayName:o.name}:{id:o,name:o,displayName:o})||[];if(a.length===0)return;L(a)}catch{}}async getOrganizations(){return await this.getAccessToken(),R()}async logout(){await _()}async isAuthenticated(){return await m()!==null}sleep(t){return new Promise(n=>setTimeout(n,t))}},P=null;function q(){return P||(P=new I),P}import{readFileSync as ne,existsSync as se}from"fs";import{join as V,dirname as re}from"path";import{fileURLToPath as ie}from"url";import*as H from"yaml";var oe=ie(import.meta.url),ae=re(oe),M=null;function ce(){let e=ae;for(let t=0;t<5;t++){let n=V(e,"specs.yaml");if(se(n))return n;e=V(e,"..")}throw new Error("Could not find specs.yaml")}function le(){if(!M){let e=ce(),t=ne(e,"utf8");M=H.parse(t)}return M}function J(e,t){let s=le().commands.find(r=>r.name===e);return s?t&&s.operations?s.operations.find(r=>r.name===t)||null:s:null}var b={success:"\u2714",failure:"\u2716",hint:"\u2192"};function y(e){let t=J(e.command,e.operation);if(t)return t.messages}function h(e,t){let n=e;return n=n.replace(/\\n/g,`
|
|
2
|
+
`),t&&(n=n.replace(/\{\{(\w+)\}\}/g,(s,r)=>{let i=t[r];return i!==void 0?String(i):`{{${r}}}`})),n}function x(e,t){let n=y(e);n?.onStart&&console.log(h(n.onStart,t))}function w(e,t){let n=y(e);n?.onSuccess&&console.log(`${b.success} ${h(n.onSuccess,t)}`)}function l(e,t,n){let s=y(e);s?.onFailure&&console.error(`${b.failure} ${h(s.onFailure,n)}`),t&&console.error(` ${t}`)}function W(e,t){let n=y(e);n?.onAlreadyDone&&console.log(h(n.onAlreadyDone,t))}function B(e,t){let n=y(e);n?.hint&&console.log(`${b.hint} ${h(n.hint,t)}`)}function u(e,t){return{command:e,operation:t}}var f=u("login","ui");async function z(){x(f);try{let e=q();if(await e.isAuthenticated()){W(f);return}await e.login({onDeviceCode:(s,r)=>{console.log(`
|
|
3
|
+
Your confirmation code: ${s}
|
|
4
|
+
`),console.log(`If browser doesn't open, visit: ${r}`)},onWaiting:()=>console.log(`
|
|
5
|
+
Waiting for authentication...`)});let n=await e.getOrganizations();if(n.length>0){let s=n[0];U(s.id),w(f,{org:s.displayName||s.name}),n.length>1&&B(f,{count:n.length})}else w(f,{org:"none"})}catch{l(f),process.exit(1)}}import de from"enquirer";var{prompt:K}=de,p=u("login","credentials");async function C(e){x(p);let t=e["access-key"]||e.accessKey||e.key||e.Key||e.accesskey,n=e["access-secret"]||e.accessSecret||e.secret||e.Secret||e.accesssecret,s=e.profile||e.Profile||e.p||e.P;if(!t||!n){let a=O();if(a)if(s)t=a.accessKeyId,n=a.secretAccessKey;else try{if((await K({type:"confirm",name:"useSaved",message:"Saved credentials found. Use them?",initial:!0})).useSaved)t=a.accessKeyId,n=a.secretAccessKey;else{let d=[];t||d.push({type:"input",name:"accessKey",message:"Tigris Access Key ID:",required:!0}),n||d.push({type:"password",name:"accessSecret",message:"Tigris Secret Access Key:",required:!0});let D=await K(d);t=t||D.accessKey,n=n||D.accessSecret}}catch{l(p,"Login cancelled"),process.exit(1)}else{s&&(l(p,'No saved credentials found. Please run "tigris configure" first.'),process.exit(1));try{let o=[];t||o.push({type:"input",name:"accessKey",message:"Tigris Access Key ID:",required:!0}),n||o.push({type:"password",name:"accessSecret",message:"Tigris Secret Access Key:",required:!0});let d=await K(o);t=t||d.accessKey,n=n||d.accessSecret}catch{l(p,"Login cancelled"),process.exit(1)}}}(!t||!n)&&(l(p,"Access key and secret are required"),process.exit(1));let i=O()?.endpoint||"https://t3.storage.dev";await j({accessKeyId:t,secretAccessKey:n,endpoint:i}),await k("credentials"),w(p)}var{prompt:ue}=ge,fe=u("login","select");async function pe(e){let t=e.profile||e.Profile||e.p||e.P,n=e["access-key"]||e.accessKey||e.key||e.Key||e.accesskey,s=e["access-secret"]||e.accessSecret||e.secret||e.Secret||e.accesssecret,r=e.oauth||e.OAuth||e.o||e.O;if(t){await C(e);return}if(n||s){await C(e);return}if(r){await z();return}try{(await ue({type:"select",name:"loginType",message:"How would you like to login?",choices:[{name:"user",message:"As a user (OAuth2 flow)",value:"user"},{name:"machine",message:"As a machine (Access Key & Secret)",value:"machine"}]})).loginType==="user"?await z():await C(e)}catch{l(fe,"Login cancelled"),process.exit(1)}}export{pe as default};
|
package/dist/lib/login/ui.js
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
`);
|
|
3
|
-
|
|
4
|
-
`)
|
|
5
|
-
|
|
6
|
-
`);return}await t.login();let n=await t.getOrganizations();if(n.length>0){let o=n[0];x(o.id),console.log("\u{1F3AF} Auto-selected organization:"),console.log(` ${o.displayName||o.name} (${o.id})
|
|
7
|
-
`),n.length>1&&(console.log(`\u{1F4A1} You have ${n.length} organizations available.`),console.log(` Run "tigris orgs list" to see all and switch if needed.
|
|
8
|
-
`))}}catch{process.exit(1)}}var V=D;export{V as default,D as ui};
|
|
1
|
+
import m from"axios";import G from"open";function v(){return{domain:process.env.AUTH0_DOMAIN||"auth-dev.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF",audience:process.env.AUTH0_AUDIENCE||"https://tigris-api-dev"}}var A="https://tigris";import{homedir as j}from"os";import{join as _}from"path";import{readFileSync as V,writeFileSync as H,existsSync as O,mkdirSync as J}from"fs";import{chmod as W}from"fs/promises";var h=_(j(),".tigris"),u=_(h,"config.json");function B(){O(h)||J(h,{recursive:!0,mode:448})}function c(){if(O(u))try{let t=V(u,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function g(t){B(),H(u,JSON.stringify(t,null,2),{mode:384});try{await W(u,384)}catch{}}async function y(t){let e=c();e.tokens=t,await g(e)}async function d(){return c().tokens||null}async function C(){let t=c();delete t.tokens,await g(t)}async function P(t){let e=c();e.organizations=t,await g(e)}function I(){return c().organizations||[]}async function M(t){let e=c();e.selectedOrganization=t,await g(e)}async function b(t){let e=c();e.loginMethod=t,await g(e)}var k=class{config;baseUrl;constructor(){this.config=v(),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 G(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await y(i),b("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 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 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 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)[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;P(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),I()}async logout(){await C()}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},w=null;function z(){return w||(w=new k),w}import{readFileSync as Y,existsSync as K}from"fs";import{join as D,dirname as q}from"path";import{fileURLToPath as Q}from"url";import*as E from"yaml";var X=Q(import.meta.url),Z=q(X),T=null;function ee(){let t=Z;for(let e=0;e<5;e++){let n=D(t,"specs.yaml");if(K(n))return n;t=D(t,"..")}throw new Error("Could not find specs.yaml")}function ne(){if(!T){let t=ee(),e=Y(t,"utf8");T=E.parse(e)}return T}function N(t,e){let o=ne().commands.find(i=>i.name===t);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var x={success:"\u2714",failure:"\u2716",hint:"\u2192"};function p(t){let e=N(t.command,t.operation);if(e)return e.messages}function f(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 $(t,e){let n=p(t);n?.onStart&&console.log(f(n.onStart,e))}function S(t,e){let n=p(t);n?.onSuccess&&console.log(`${x.success} ${f(n.onSuccess,e)}`)}function F(t,e,n){let o=p(t);o?.onFailure&&console.error(`${x.failure} ${f(o.onFailure,n)}`),e&&console.error(` ${e}`)}function L(t,e){let n=p(t);n?.onAlreadyDone&&console.log(f(n.onAlreadyDone,e))}function R(t,e){let n=p(t);n?.hint&&console.log(`${x.hint} ${f(n.hint,e)}`)}function U(t,e){return{command:t,operation:e}}var l=U("login","ui");async function te(){$(l);try{let t=z();if(await t.isAuthenticated()){L(l);return}await t.login({onDeviceCode:(o,i)=>{console.log(`
|
|
3
|
+
Your confirmation code: ${o}
|
|
4
|
+
`),console.log(`If browser doesn't open, visit: ${i}`)},onWaiting:()=>console.log(`
|
|
5
|
+
Waiting for authentication...`)});let n=await t.getOrganizations();if(n.length>0){let o=n[0];M(o.id),S(l,{org:o.displayName||o.name}),n.length>1&&R(l,{count:n.length})}else S(l,{org:"none"})}catch{F(l),process.exit(1)}}var Se=te;export{Se as default,te as ui};
|
package/dist/lib/logout.js
CHANGED
|
@@ -1,4 +1,2 @@
|
|
|
1
|
-
import{homedir as
|
|
2
|
-
`),
|
|
3
|
-
`)}catch(n){console.error("\u274C Error during logout"),n instanceof Error&&console.error(` ${n.message}
|
|
4
|
-
`),process.exit(1)}}export{p as default};
|
|
1
|
+
import{homedir as O}from"os";import{join as m}from"path";import{readFileSync as A,writeFileSync as P,existsSync as u,mkdirSync as w}from"fs";import{chmod as z}from"fs/promises";var a=m(O(),".tigris"),r=m(a,"config.json");function T(){u(a)||w(a,{recursive:!0,mode:448})}function b(){if(u(r))try{let e=A(r,"utf8");return JSON.parse(e)}catch{return{}}return{}}async function k(e){T(),P(r,JSON.stringify(e,null,2),{mode:384});try{await z(r,384)}catch{}}async function d(){let n=b().credentials;await k({credentials:n})}import{readFileSync as F,existsSync as I}from"fs";import{join as C,dirname as $}from"path";import{fileURLToPath as D}from"url";import*as y from"yaml";var V=D(import.meta.url),j=$(V),c=null;function _(){let e=j;for(let n=0;n<5;n++){let t=C(e,"specs.yaml");if(I(t))return t;e=C(e,"..")}throw new Error("Could not find specs.yaml")}function E(){if(!c){let e=_(),n=F(e,"utf8");c=y.parse(n)}return c}function S(e,n){let o=E().commands.find(i=>i.name===e);return o?n&&o.operations?o.operations.find(i=>i.name===n)||null:o:null}var x={success:"\u2714",failure:"\u2716",hint:"\u2192"};function l(e){let n=S(e.command,e.operation);if(n)return n.messages}function g(e,n){let t=e;return t=t.replace(/\\n/g,`
|
|
2
|
+
`),n&&(t=t.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let p=n[i];return p!==void 0?String(p):`{{${i}}}`})),t}function M(e,n){let t=l(e);t?.onStart&&console.log(g(t.onStart,n))}function v(e,n){let t=l(e);t?.onSuccess&&console.log(`${x.success} ${g(t.onSuccess,n)}`)}function f(e,n,t){let o=l(e);o?.onFailure&&console.error(`${x.failure} ${g(o.onFailure,t)}`),n&&console.error(` ${n}`)}function h(e,n){return{command:e,operation:n}}var s=h("logout");async function L(){M(s);try{await d(),v(s)}catch(e){e instanceof Error?f(s,e.message):f(s),process.exit(1)}}export{L as default};
|
package/dist/lib/ls.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
async function e(t){t.path||t._positional?.[0]||(console.error("path argument is required"),process.exit(1)),console.error("ls command not yet implemented"),process.exit(1)}export{e as default};
|
package/dist/lib/mk.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
async function e(t){t.path||t._positional?.[0]||(console.error("path argument is required"),process.exit(1)),console.error("mk command not yet implemented"),process.exit(1)}export{e as default};
|
package/dist/lib/mv.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
async function t(e){let s=e.src||e._positional?.[0],r=e.dest||e._positional?.[1];(!s||!r)&&(console.error("both src and dest arguments are required"),process.exit(1)),console.error("mv command not yet implemented"),process.exit(1)}export{t as default};
|
package/dist/lib/orgs/create.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function
|
|
2
|
-
\
|
|
1
|
+
import{createOrganization as se}from"@tigrisdata/storage";function _(t,e,n){for(let o of e)if(t[o]!==void 0)return t[o];return n}import{S3Client as ke}from"@aws-sdk/client-s3";import{homedir as V}from"os";import{join as I}from"path";import{readFileSync as G,writeFileSync as J,existsSync as O,mkdirSync as q}from"fs";import{chmod as B}from"fs/promises";var y=I(V(),".tigris"),l=I(y,"config.json");function W(){O(y)||q(y,{recursive:!0,mode:448})}function c(){if(O(l))try{let t=G(l,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function p(t){W(),J(l,JSON.stringify(t,null,2),{mode:384});try{await B(l,384)}catch{}}async function w(t){let e=c();e.tokens=t,await p(e)}async function d(){return c().tokens||null}async function C(){let t=c();delete t.tokens,await p(t)}async function P(t){let e=c();e.organizations=t,await p(e)}function M(){return c().organizations||[]}function T(){return c().selectedOrganization||null}function N(){let t=c();return t.temporaryCredentials||t.credentials||null}async function E(t){let e=c();e.loginMethod=t,await p(e)}function z(){return c().loginMethod||null}import u from"axios";import Y from"open";function b(){return{domain:process.env.AUTH0_DOMAIN||"auth-dev.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF",audience:process.env.AUTH0_AUDIENCE||"https://tigris-api-dev"}}var D="https://tigris";var S=class{config;baseUrl;constructor(){this.config=b(),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 Y(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await w(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 w(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)[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;P(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),M()}async logout(){await C()}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},k=null;function f(){return k||(k=new S),k}async function Q(){return z()}async function R(){let t=await Q();if(!t)throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.');if(t==="oauth"){let o=await f().getAccessToken();if(!T())throw new Error('No organization selected. Please run "tigris orgs select" first.');let r=process.env.TIGRIS_ENDPOINT??"https://t3.storage.dev",s=process.env.TIGRIS_STORAGE_IAM_ENDPOINT??"https://iam.storageapi.dev",a=process.env.AUTH0_DOMAIN??"https://auth.tigris.dev";return{sessionToken:o,accessKeyId:"",secretAccessKey:"",endpoint:r,organizationId:T()??void 0,iamEndpoint:s,authDomain:a}}let e=N();if(!e)throw new Error('No credentials found. Please run "tigris configure" first.');return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint}}import{readFileSync as X,existsSync as Z}from"fs";import{join as K,dirname as ee}from"path";import{fileURLToPath as te}from"url";import*as L from"yaml";var ne=te(import.meta.url),oe=ee(ne),x=null;function ie(){let t=oe;for(let e=0;e<5;e++){let n=K(t,"specs.yaml");if(Z(n))return n;t=K(t,"..")}throw new Error("Could not find specs.yaml")}function re(){if(!x){let t=ie(),e=X(t,"utf8");x=L.parse(e)}return x}function F(t,e){let o=re().commands.find(i=>i.name===t);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var A={success:"\u2714",failure:"\u2716",hint:"\u2192"};function m(t){let e=F(t.command,t.operation);if(e)return e.messages}function h(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 $(t,e){let n=m(t);n?.onStart&&console.log(h(n.onStart,e))}function U(t,e){let n=m(t);n?.onSuccess&&console.log(`${A.success} ${h(n.onSuccess,e)}`)}function v(t,e,n){let o=m(t);o?.onFailure&&console.error(`${A.failure} ${h(o.onFailure,n)}`),e&&console.error(` ${e}`)}function H(t,e){let n=m(t);n?.hint&&console.log(`${A.hint} ${h(n.hint,e)}`)}function j(t,e){return{command:t,operation:e}}var g=j("orgs","create");async function ae(t){$(g);let e=_(t,["name","N"]);e||(v(g,"Organization name is required"),process.exit(1));let n=await R(),{data:o,error:i}=await se(e,{config:n});i&&(v(g,i.message),process.exit(1));let r=f(),s=await r.refreshAccessToken();s.idToken&&await r.extractAndStoreOrganizations(s.idToken);let a=o.id;U(g,{name:e,id:a}),H(g,{name:e})}export{ae as default};
|
package/dist/lib/orgs/list.js
CHANGED
|
@@ -1,21 +1,7 @@
|
|
|
1
|
-
function
|
|
2
|
-
`)}function
|
|
3
|
-
`)}function
|
|
4
|
-
`+
|
|
5
|
-
`),
|
|
6
|
-
`)}function
|
|
7
|
-
`);
|
|
8
|
-
`)}console.log(`\u23F3 Waiting for authentication...
|
|
9
|
-
`);let o=await this.pollForToken(n.device_code,n.interval||5);await y(o),E("oauth"),await this.extractAndStoreOrganizations(o.idToken),console.log(`\u2705 Authentication successful!
|
|
10
|
-
`)}catch(e){throw e instanceof Error?console.error(`\u274C Authentication failed: ${e.message}`):console.error("\u274C Authentication failed"),e}}async pollForToken(e,n){let r=0;for(;r<60;){r++;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,i=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:i}}catch(a){if(h.isAxiosError(a)&&a.response){let s=a.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(a.response.data?.error_description||"Authentication failed")}throw a}}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&&(console.log("\u{1F504} Refreshing access token..."),e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){if(!e.refreshToken)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:e.refreshToken},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,r={accessToken:o.access_token,refreshToken:o.refresh_token||e.refreshToken,idToken:o.id_token||e.idToken,expiresAt:Date.now()+(o.expires_in||3600)*1e3};return await y(r),r}catch{throw await T(),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){console.warn("\u26A0\uFE0F No ID token available, skipping organization extraction");return}try{let n=e.split(".")[1],o=Buffer.from(n,"base64").toString("utf8"),a=JSON.parse(o)[A];if(!a){console.warn("\u26A0\uFE0F No Tigris claims found in token");return}let s=a?.ns?.map(i=>typeof i=="object"&&i!==null?{id:i.id,name:i.name,displayName:i.name}:{id:i,name:i,displayName:i})||[];if(s.length===0){console.warn("\u26A0\uFE0F No organizations found in claims");return}N(s),console.log(`\u{1F4C2} Found ${s.length} organization(s)`)}catch{console.error("Failed to extract organizations from token")}}async getOrganizations(){return await this.getAccessToken(),P()}async logout(){await T(),console.log("\u2705 Logged out successfully")}async isAuthenticated(){return await m()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},C=null;function R(){return C||(C=new x),C}import K from"enquirer";async function V(t){console.log("\u{1F4CB} Listing Organizations");let e=v(t,["format","f","F"],"select");try{let n=R();await n.getAccessToken();let o=await n.getOrganizations();if(o.length===0){console.log(`
|
|
11
|
-
\u26A0\uFE0F No organizations found. You may need to re-authenticate.`),console.log(` Run: tigris login
|
|
12
|
-
`);return}let r=$();if(e==="select"){let i=o.map(c=>({name:c.id,message:`${c.displayName||c.name} (${c.id})`,hint:c.id===r?"currently selected":void 0}));try{let g=(await K.prompt({type:"select",name:"organization",message:"Select an organization:",choices:i.map(u=>u.message),initial:r?o.findIndex(u=>u.id===r):0})).organization.match(/\(([^)]+)\)$/),w=g?g[1]:o[0].id;b(w);let _=o.find(u=>u.id===w);console.log(`
|
|
13
|
-
\u2705 Selected organization: ${_?.displayName||_?.name} (${w})
|
|
14
|
-
`);return}catch{console.log(`
|
|
15
|
-
\u274C Selection cancelled
|
|
16
|
-
`),process.exit(0)}}let a=o.map(i=>({id:i.id,name:i.name,displayName:i.displayName||i.name,selected:i.id===r?"\u2713":""})),s=O(a,e,"organizations","organization",[{key:"selected",header:"",width:3},{key:"id",header:"ID",width:20},{key:"name",header:"Name",width:20},{key:"displayName",header:"Display Name",width:30}]);if(console.log(s),console.log(`
|
|
17
|
-
Found ${a.length} organization(s)`),r){let i=o.find(c=>c.id===r);console.log(`Currently selected: ${i?.displayName||i?.name} (${r})`)}else console.log("No organization selected.")}catch(n){n instanceof Error?console.error(`
|
|
18
|
-
\u274C ${n.message}
|
|
19
|
-
`):console.error(`
|
|
20
|
-
\u274C Failed to list organizations
|
|
21
|
-
`),process.exit(1)}}export{V as default};
|
|
1
|
+
function M(n,e,t){for(let o of e)if(n[o]!==void 0)return n[o];return t}function X(n){return JSON.stringify(n,null,2)}function Q(n,e=" "){return Object.entries(n).map(([t,o])=>`${e}<${t}>${o}</${t}>`).join(`
|
|
2
|
+
`)}function Z(n,e,t){let o=[`<${e}>`];return n.forEach(i=>{o.push(` <${t}>`),o.push(Q(i," ")),o.push(` </${t}>`)}),o.push(`</${e}>`),o.join(`
|
|
3
|
+
`)}function z(n){if(n==null)return"";if(n instanceof Date)return P(n);if(typeof n=="string"){let e=new Date(n);if(!isNaN(e.getTime())&&n.includes("T"))return P(e)}return String(n)}function P(n){return new Intl.DateTimeFormat(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(n)}function ee(n,e){return e.map(t=>{if(t.width)return t.width;let o=t.header.length,i=n.reduce((r,c)=>{let s=z(c[t.key]);return Math.max(r,s.length)},0);return Math.max(o,i)})}function ne(n,e){let t=[],o=ee(n,e),i="\u250C"+o.map(a=>"\u2500".repeat(a+2)).join("\u252C")+"\u2510",r="\u251C"+o.map(a=>"\u2500".repeat(a+2)).join("\u253C")+"\u2524",c="\u2514"+o.map(a=>"\u2500".repeat(a+2)).join("\u2534")+"\u2518";t.push(`
|
|
4
|
+
`+i);let s="\u2502 "+e.map((a,y)=>a.header.padEnd(o[y])).join(" \u2502 ")+" \u2502";return t.push(s),t.push(r),n.forEach(a=>{let y=e.map((u,p)=>{let g=z(a[u.key]);return u.align==="right"?g.padStart(o[p]):g.padEnd(o[p])});t.push("\u2502 "+y.join(" \u2502 ")+" \u2502")}),t.push(c+`
|
|
5
|
+
`),t.join(`
|
|
6
|
+
`)}function N(n,e,t,o,i){switch(e){case"json":return X(n);case"xml":return Z(n,t,o);default:return ne(n,i)}}import C from"axios";import ce from"open";function D(){return{domain:process.env.AUTH0_DOMAIN||"auth-dev.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF",audience:process.env.AUTH0_AUDIENCE||"https://tigris-api-dev"}}var E="https://tigris";import{homedir as te}from"os";import{join as $}from"path";import{readFileSync as oe,writeFileSync as ie,existsSync as j,mkdirSync as re}from"fs";import{chmod as se}from"fs/promises";var S=$(te(),".tigris"),w=$(S,"config.json");function ae(){j(S)||re(S,{recursive:!0,mode:448})}function d(){if(j(w))try{let n=oe(w,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function m(n){ae(),ie(w,JSON.stringify(n,null,2),{mode:384});try{await se(w,384)}catch{}}async function A(n){let e=d();e.tokens=n,await m(e)}async function h(){return d().tokens||null}async function _(){let n=d();delete n.tokens,await m(n)}async function R(n){let e=d();e.organizations=n,await m(e)}function F(){return d().organizations||[]}async function L(n){let e=d();e.selectedOrganization=n,await m(e)}function U(){return d().selectedOrganization||null}async function V(n){let e=d();e.loginMethod=n,await m(e)}var O=class{config;baseUrl;constructor(){this.config=D(),this.baseUrl=`https://${this.config.domain}`}async login(e){let o=(await C.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;e?.onDeviceCode?.(o.user_code,o.verification_uri),await this.sleep(2e3);try{await ce(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await A(i),V("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(e,t){let i=0;for(;i<60;){i++;try{let c=(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,s=Date.now()+(c.expires_in||3600)*1e3;return{accessToken:c.access_token,refreshToken:c.refresh_token,idToken:c.id_token,expiresAt:s}}catch(r){if(C.isAxiosError(r)&&r.response){let c=r.response.data?.error;if(c==="authorization_pending"){await this.sleep(t*1e3);continue}if(c==="slow_down"){t+=5,await this.sleep(t*1e3);continue}throw new Error(r.response.data?.error_description||"Authentication failed")}throw r}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await h();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 h(),!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 A(r),r}catch{throw await _(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let e=await h();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)[E];if(!r)return;let c=r?.ns?.map(s=>typeof s=="object"&&s!==null?{id:s.id,name:s.name,displayName:s.name}:{id:s,name:s,displayName:s})||[];if(c.length===0)return;R(c)}catch{}}async getOrganizations(){return await this.getAccessToken(),F()}async logout(){await _()}async isAuthenticated(){return await h()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},v=null;function J(){return v||(v=new O),v}import ye from"enquirer";import{readFileSync as de,existsSync as le}from"fs";import{join as B,dirname as ue}from"path";import{fileURLToPath as pe}from"url";import*as H from"yaml";var ge=pe(import.meta.url),fe=ue(ge),I=null;function me(){let n=fe;for(let e=0;e<5;e++){let t=B(n,"specs.yaml");if(le(t))return t;n=B(n,"..")}throw new Error("Could not find specs.yaml")}function he(){if(!I){let n=me(),e=de(n,"utf8");I=H.parse(e)}return I}function W(n,e){let o=he().commands.find(i=>i.name===n);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var G={success:"\u2714",failure:"\u2716",hint:"\u2192"};function T(n){let e=W(n.command,n.operation);if(e)return e.messages}function k(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 Y(n,e){let t=T(n);t?.onStart&&console.log(k(t.onStart,e))}function b(n,e){let t=T(n);t?.onSuccess&&console.log(`${G.success} ${k(t.onSuccess,e)}`)}function x(n,e,t){let o=T(n);o?.onFailure&&console.error(`${G.failure} ${k(o.onFailure,t)}`),e&&console.error(` ${e}`)}function q(n,e){let t=T(n);t?.onEmpty&&console.log(k(t.onEmpty,e))}function K(n,e){return{command:n,operation:e}}var l=K("orgs","list");async function we(n){Y(l);let e=M(n,["format","f","F"],"select");try{let t=J();await t.getAccessToken();let o=await t.getOrganizations();if(o.length===0){q(l);return}let i=U();if(e==="select"){let s=o.map(a=>({name:a.id,message:`${a.displayName||a.name} (${a.id})`,hint:a.id===i?"currently selected":void 0}));try{let u=(await ye.prompt({type:"select",name:"organization",message:"Select an organization:",choices:s.map(f=>f.message),initial:i?o.findIndex(f=>f.id===i):0})).organization.match(/\(([^)]+)\)$/),p=u?u[1]:o[0].id;L(p);let g=o.find(f=>f.id===p);b(l,{name:g?.displayName||g?.name});return}catch{x(l,"Selection cancelled"),process.exit(0)}}let r=o.map(s=>({id:s.id,name:s.name,displayName:s.displayName||s.name,selected:s.id===i?"*":""})),c=N(r,e,"organizations","organization",[{key:"selected",header:" ",width:1},{key:"id",header:"ID"},{key:"name",header:"Name"},{key:"displayName",header:"Display Name"}]);console.log(c),b(l,{count:r.length})}catch(t){t instanceof Error?x(l,t.message):x(l),process.exit(1)}}export{we as default};
|
package/dist/lib/orgs/select.js
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
|
-
function
|
|
2
|
-
`);
|
|
3
|
-
`)
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
\u{1F4A1} Available organizations:`),t.forEach(i=>console.log(` - ${i.name} (${i.id})`)),console.log(),process.exit(1)),A(r.id),console.log("\u2705 Organization selected successfully!"),console.log(`\u{1F4DB} Active Organization: ${r.name} (${r.id})`),console.log(`
|
|
8
|
-
\u{1F4A1} This organization will be used for all subsequent commands`)}catch(n){n instanceof Error?console.error(`
|
|
9
|
-
\u274C ${n.message}
|
|
10
|
-
`):console.error(`
|
|
11
|
-
\u274C Failed to select organization
|
|
12
|
-
`),process.exit(1)}}export{D as default};
|
|
1
|
+
function S(t,e,n){for(let o of e)if(t[o]!==void 0)return t[o];return n}import u from"axios";import G from"open";function v(){return{domain:process.env.AUTH0_DOMAIN||"auth-dev.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF",audience:process.env.AUTH0_AUDIENCE||"https://tigris-api-dev"}}var A="https://tigris";import{homedir as U}from"os";import{join as _}from"path";import{readFileSync as j,writeFileSync as V,existsSync as O,mkdirSync as J}from"fs";import{chmod as H}from"fs/promises";var m=_(U(),".tigris"),f=_(m,"config.json");function B(){O(m)||J(m,{recursive:!0,mode:448})}function c(){if(O(f))try{let t=j(f,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function d(t){B(),V(f,JSON.stringify(t,null,2),{mode:384});try{await H(f,384)}catch{}}async function h(t){let e=c();e.tokens=t,await d(e)}async function g(){return c().tokens||null}async function y(){let t=c();delete t.tokens,await d(t)}async function I(t){let e=c();e.organizations=t,await d(e)}function P(){return c().organizations||[]}async function M(t){let e=c();e.selectedOrganization=t,await d(e)}async function b(t){let e=c();e.loginMethod=t,await d(e)}var w=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 G(o.verification_uri_complete)}catch{}e?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await h(i),b("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 h(r),r}catch{throw await y(),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)[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(),P()}async logout(){await y()}async isAuthenticated(){return await g()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},C=null;function z(){return C||(C=new w),C}import{readFileSync as W,existsSync as Y}from"fs";import{join as E,dirname as q}from"path";import{fileURLToPath as K}from"url";import*as N from"yaml";var Q=K(import.meta.url),X=q(Q),k=null;function Z(){let t=X;for(let e=0;e<5;e++){let n=E(t,"specs.yaml");if(Y(n))return n;t=E(t,"..")}throw new Error("Could not find specs.yaml")}function ee(){if(!k){let t=Z(),e=W(t,"utf8");k=N.parse(e)}return k}function D(t,e){let o=ee().commands.find(i=>i.name===t);return o?e&&o.operations?o.operations.find(i=>i.name===e)||null:o:null}var $={success:"\u2714",failure:"\u2716",hint:"\u2192"};function T(t){let e=D(t.command,t.operation);if(e)return e.messages}function x(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 F(t,e){let n=T(t);n?.onStart&&console.log(x(n.onStart,e))}function R(t,e){let n=T(t);n?.onSuccess&&console.log(`${$.success} ${x(n.onSuccess,e)}`)}function p(t,e,n){let o=T(t);o?.onFailure&&console.error(`${$.failure} ${x(o.onFailure,n)}`),e&&console.error(` ${e}`)}function L(t,e){return{command:t,operation:e}}var l=L("orgs","select");async function ne(t){F(l);let e=S(t,["name","N"]);e||(p(l,"Organization name or ID is required"),process.exit(1));try{let n=z();await n.getAccessToken();let o=await n.getOrganizations(),i=o.find(r=>r.id===e||r.name===e);if(!i){let r=o.map(s=>` - ${s.name} (${s.id})`).join(`
|
|
3
|
+
`);p(l,`Organization "${e}" not found
|
|
4
|
+
|
|
5
|
+
Available organizations:
|
|
6
|
+
${r}`),process.exit(1)}M(i.id),R(l,{name:i.name})}catch(n){n instanceof Error?p(l,n.message):p(l),process.exit(1)}}export{ne as default};
|
package/dist/lib/rm.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
async function e(t){t.path||t._positional?.[0]||(console.error("path argument is required"),process.exit(1)),console.error("rm command not yet implemented"),process.exit(1)}export{e as default};
|
package/dist/lib/stat.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
async function e(t){t.path||t._positional?.[0]||(console.error("path argument is required"),process.exit(1)),console.error("stat command not yet implemented"),process.exit(1)}export{e as default};
|
package/dist/lib/whoami.js
CHANGED
|
@@ -1,14 +1,3 @@
|
|
|
1
|
-
import
|
|
2
|
-
`);
|
|
3
|
-
`)}
|
|
4
|
-
`);let o=await this.pollForToken(n.device_code,n.interval||5);await p(o),x("oauth"),await this.extractAndStoreOrganizations(o.idToken),console.log(`\u2705 Authentication successful!
|
|
5
|
-
`)}catch(e){throw e instanceof Error?console.error(`\u274C Authentication failed: ${e.message}`):console.error("\u274C Authentication failed"),e}}async pollForToken(e,n){let a=0;for(;a<60;){a++;try{let r=(await f.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:e,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,s=Date.now()+(r.expires_in||3600)*1e3;return{accessToken:r.access_token,refreshToken:r.refresh_token,idToken:r.id_token,expiresAt:s}}catch(i){if(f.isAxiosError(i)&&i.response){let r=i.response.data?.error;if(r==="authorization_pending"){await this.sleep(n*1e3);continue}if(r==="slow_down"){n+=5,await this.sleep(n*1e3);continue}throw new Error(i.response.data?.error_description||"Authentication failed")}throw i}}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&&(console.log("\u{1F504} Refreshing access token..."),e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){if(!e.refreshToken)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let o=(await f.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:e.refreshToken},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a={accessToken:o.access_token,refreshToken:o.refresh_token||e.refreshToken,idToken:o.id_token||e.idToken,expiresAt:Date.now()+(o.expires_in||3600)*1e3};return await p(a),a}catch{throw await m(),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){console.warn("\u26A0\uFE0F No ID token available, skipping organization extraction");return}try{let n=e.split(".")[1],o=Buffer.from(n,"base64").toString("utf8"),i=JSON.parse(o)[y];if(!i){console.warn("\u26A0\uFE0F No Tigris claims found in token");return}let r=i?.ns?.map(s=>typeof s=="object"&&s!==null?{id:s.id,name:s.name,displayName:s.name}:{id:s,name:s,displayName:s})||[];if(r.length===0){console.warn("\u26A0\uFE0F No organizations found in claims");return}v(r),console.log(`\u{1F4C2} Found ${r.length} organization(s)`)}catch{console.error("Failed to extract organizations from token")}}async getOrganizations(){return await this.getAccessToken(),_()}async logout(){await m(),console.log("\u2705 Logged out successfully")}async isAuthenticated(){return await g()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},h=null;function I(){return h||(h=new k),h}async function $(){try{let t=I();if(!await t.isAuthenticated()){console.log("\u274C Not authenticated"),console.log(`\u{1F4A1} Run "tigris login" to authenticate
|
|
6
|
-
`);return}let n=await t.getIdTokenClaims(),o=await t.getOrganizations(),a=A();if(console.log(`
|
|
7
|
-
\u{1F464} User Information:`),console.log(` Email: ${n.email||"N/A"}`),console.log(` User ID: ${n.sub}`),o.length>0){if(console.log(`
|
|
8
|
-
\u{1F4C2} Organizations (${o.length}):`),o.forEach(i=>{let s=i.id===a?"\u2192":" ";console.log(` ${s} ${i.name} (${i.id})`)}),a){let i=o.find(r=>r.id===a);i&&console.log(`
|
|
9
|
-
\u2713 Active: ${i.name}`)}}else console.log(`
|
|
10
|
-
\u{1F4C2} Organizations: None`);console.log()}catch(t){t instanceof Error?console.error(`
|
|
11
|
-
\u274C ${t.message}
|
|
12
|
-
`):console.error(`
|
|
13
|
-
\u274C Failed to retrieve user information
|
|
14
|
-
`),process.exit(1)}}export{$ as default};
|
|
1
|
+
import g from"axios";import H from"open";function T(){return{domain:process.env.AUTH0_DOMAIN||"auth-dev.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF",audience:process.env.AUTH0_AUDIENCE||"https://tigris-api-dev"}}var x="https://tigris";import{homedir as U}from"os";import{join as S}from"path";import{readFileSync as L,writeFileSync as R,existsSync as v,mkdirSync as j}from"fs";import{chmod as V}from"fs/promises";var f=S(U(),".tigris"),d=S(f,"config.json");function J(){v(f)||j(f,{recursive:!0,mode:448})}function c(){if(v(d))try{let n=L(d,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function p(n){J(),R(d,JSON.stringify(n,null,2),{mode:384});try{await V(d,384)}catch{}}async function u(n){let e=c();e.tokens=n,await p(e)}async function l(){return c().tokens||null}async function m(){let n=c();delete n.tokens,await p(n)}async function A(n){let e=c();e.organizations=n,await p(e)}function _(){return c().organizations||[]}function O(){return c().selectedOrganization||null}async function I(n){let e=c();e.loginMethod=n,await p(e)}var y=class{config;baseUrl;constructor(){this.config=T(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(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?.(i.user_code,i.verification_uri),await this.sleep(2e3);try{await H(i.verification_uri_complete)}catch{}e?.onWaiting?.();let s=await this.pollForToken(i.device_code,i.interval||5);await u(s),I("oauth"),await this.extractAndStoreOrganizations(s.idToken)}async pollForToken(e,t){let s=0;for(;s<60;){s++;try{let r=(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()+(r.expires_in||3600)*1e3;return{accessToken:r.access_token,refreshToken:r.refresh_token,idToken:r.id_token,expiresAt:a}}catch(o){if(g.isAxiosError(o)&&o.response){let r=o.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(o.response.data?.error_description||"Authentication failed")}throw o}}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 s=(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,o={accessToken:s.access_token,refreshToken:s.refresh_token||t.refreshToken,idToken:s.id_token||t.idToken,expiresAt:Date.now()+(s.expires_in||3600)*1e3};return await u(o),o}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],i=Buffer.from(t,"base64").toString("utf8");return JSON.parse(i)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(e){if(e)try{let t=e.split(".")[1],i=Buffer.from(t,"base64").toString("utf8"),o=JSON.parse(i)[x];if(!o)return;let r=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(r.length===0)return;A(r)}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 y),h}import{readFileSync as B,existsSync as G}from"fs";import{join as M,dirname as W}from"path";import{fileURLToPath as Y}from"url";import*as z from"yaml";var K=Y(import.meta.url),q=W(K),C=null;function Q(){let n=q;for(let e=0;e<5;e++){let t=M(n,"specs.yaml");if(G(t))return t;n=M(n,"..")}throw new Error("Could not find specs.yaml")}function X(){if(!C){let n=Q(),e=B(n,"utf8");C=z.parse(e)}return C}function b(n,e){let i=X().commands.find(s=>s.name===n);return i?e&&i.operations?i.operations.find(s=>s.name===e)||null:i:null}var Z={success:"\u2714",failure:"\u2716",hint:"\u2192"};function E(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,(i,s)=>{let o=e[s];return o!==void 0?String(o):`{{${s}}}`})),t}function w(n,e,t){let i=E(n);i?.onFailure&&console.error(`${Z.failure} ${N(i.onFailure,t)}`),e&&console.error(` ${e}`)}function $(n,e){let t=E(n);t?.onAlreadyDone&&console.log(N(t.onAlreadyDone,e))}function D(n,e){return{command:n,operation:e}}var k=D("whoami");async function ee(){try{let n=P();if(!await n.isAuthenticated()){$(k);return}let t=await n.getIdTokenClaims(),i=await n.getOrganizations(),s=O(),o=[];if(o.push(""),o.push("User Information:"),o.push(` Email: ${t.email||"N/A"}`),o.push(` User ID: ${t.sub}`),i.length>0){if(o.push(""),o.push(`Organizations (${i.length}):`),i.forEach(r=>{let F=r.id===s?">":" ";o.push(` ${F} ${r.name} (${r.id})`)}),s){let r=i.find(a=>a.id===s);r&&(o.push(""),o.push(`Active: ${r.name}`))}}else o.push(""),o.push("Organizations: None");o.push(""),console.log(o.join(`
|
|
3
|
+
`))}catch(n){n instanceof Error?w(k,n.message):w(k),process.exit(1)}}export{ee as default};
|
package/dist/specs.yaml
CHANGED
|
@@ -2,6 +2,78 @@ name: tigris
|
|
|
2
2
|
alias: t3
|
|
3
3
|
description: Command line interface for Tigris
|
|
4
4
|
version: 0.0.1
|
|
5
|
+
|
|
6
|
+
# Reusable option definitions
|
|
7
|
+
definitions:
|
|
8
|
+
tier_options: &tier_options
|
|
9
|
+
- name: Standard
|
|
10
|
+
value: STANDARD
|
|
11
|
+
description: The default storage class. It provides high durability, availability, and performance for frequently accessed data.
|
|
12
|
+
- name: Infrequent Access
|
|
13
|
+
value: STANDARD_IA
|
|
14
|
+
description: Lower-cost storage for data that is accessed less frequently but requires rapid access when needed.
|
|
15
|
+
- name: Archive
|
|
16
|
+
value: GLACIER
|
|
17
|
+
description: Low-cost storage for data archiving. Long-term data archiving with infrequent access.
|
|
18
|
+
- name: Instant Retrieval Archive
|
|
19
|
+
value: GLACIER_IR
|
|
20
|
+
description: Lowest-cost storage for long-lived data that is rarely accessed and requires retrieval in milliseconds.
|
|
21
|
+
|
|
22
|
+
consistency_options: &consistency_options
|
|
23
|
+
- name: Default
|
|
24
|
+
value: default
|
|
25
|
+
description: Strict read-after-write consistency in same region. Eventual consistency globally.
|
|
26
|
+
- name: Strict
|
|
27
|
+
value: strict
|
|
28
|
+
description: Strict read-after-write consistency globally. Latency will be higher than the default.
|
|
29
|
+
|
|
30
|
+
region_options: ®ion_options
|
|
31
|
+
- name: Global
|
|
32
|
+
value: 'global'
|
|
33
|
+
description: Global
|
|
34
|
+
- name: USA
|
|
35
|
+
value: usa
|
|
36
|
+
description: Restrict to USA
|
|
37
|
+
- name: Europe
|
|
38
|
+
value: eur
|
|
39
|
+
description: Restrict to Europe
|
|
40
|
+
- name: Amsterdam, Netherlands
|
|
41
|
+
value: ams
|
|
42
|
+
description: Amsterdam, Netherlands
|
|
43
|
+
- name: Frankfurt, Germany
|
|
44
|
+
value: fra
|
|
45
|
+
description: Frankfurt, Germany
|
|
46
|
+
- name: Sao Paulo, Brazil
|
|
47
|
+
value: gru
|
|
48
|
+
description: Sao Paulo, Brazil
|
|
49
|
+
- name: Ashburn, Virginia (US)
|
|
50
|
+
value: iad
|
|
51
|
+
description: Ashburn, Virginia (US)
|
|
52
|
+
- name: Johannesburg, South Africa
|
|
53
|
+
value: jnb
|
|
54
|
+
description: Johannesburg, South Africa
|
|
55
|
+
- name: London, United Kingdom
|
|
56
|
+
value: lhr
|
|
57
|
+
description: London, United Kingdom
|
|
58
|
+
- name: Tokyo, Japan
|
|
59
|
+
value: nrt
|
|
60
|
+
description: Tokyo, Japan
|
|
61
|
+
- name: Chicago, Illinois (US)
|
|
62
|
+
value: ord
|
|
63
|
+
description: Chicago, Illinois (US)
|
|
64
|
+
- name: Singapore, Singapore
|
|
65
|
+
value: sin
|
|
66
|
+
description: Singapore, Singapore
|
|
67
|
+
- name: San Jose, California (US)
|
|
68
|
+
value: sjc
|
|
69
|
+
description: San Jose, California (US)
|
|
70
|
+
- name: Sydney, Australia
|
|
71
|
+
value: syd
|
|
72
|
+
description: Sydney, Australia
|
|
73
|
+
|
|
74
|
+
access_options: &access_options
|
|
75
|
+
[public, private]
|
|
76
|
+
|
|
5
77
|
commands:
|
|
6
78
|
#########################
|
|
7
79
|
# Unix style commands
|
|
@@ -112,16 +184,29 @@ commands:
|
|
|
112
184
|
# logout
|
|
113
185
|
- name: logout
|
|
114
186
|
description: Logout from Tigris
|
|
187
|
+
messages:
|
|
188
|
+
onStart: "Logging out..."
|
|
189
|
+
onSuccess: "Logged out successfully"
|
|
190
|
+
onFailure: "Failed to logout"
|
|
115
191
|
|
|
116
192
|
# whoami
|
|
117
193
|
- name: whoami
|
|
118
194
|
description: Show information about the current user
|
|
119
195
|
alias: w
|
|
196
|
+
messages:
|
|
197
|
+
onStart: ""
|
|
198
|
+
onSuccess: ""
|
|
199
|
+
onFailure: "Failed to get user information"
|
|
200
|
+
onAlreadyDone: "Not authenticated\nRun \"tigris login\" to authenticate"
|
|
120
201
|
|
|
121
202
|
# configure
|
|
122
203
|
- name: configure
|
|
123
204
|
description: Configure Tigris credentials interactively
|
|
124
205
|
alias: c
|
|
206
|
+
messages:
|
|
207
|
+
onStart: "Configuring credentials..."
|
|
208
|
+
onSuccess: "Configuration saved"
|
|
209
|
+
onFailure: "Failed to configure credentials"
|
|
125
210
|
arguments:
|
|
126
211
|
- name: access-key
|
|
127
212
|
description: Tigris Access key ID
|
|
@@ -139,6 +224,10 @@ commands:
|
|
|
139
224
|
# login
|
|
140
225
|
- name: login
|
|
141
226
|
description: Login to Tigris (interactive selection between user and machine)
|
|
227
|
+
messages:
|
|
228
|
+
onStart: "Logging in..."
|
|
229
|
+
onSuccess: "Login successful"
|
|
230
|
+
onFailure: "Login failed"
|
|
142
231
|
alias: l
|
|
143
232
|
arguments:
|
|
144
233
|
- name: access-key
|
|
@@ -163,6 +252,10 @@ commands:
|
|
|
163
252
|
# login (main interactive operation)
|
|
164
253
|
- name: select
|
|
165
254
|
description: Interactive selection between user and machine login
|
|
255
|
+
messages:
|
|
256
|
+
onStart: ""
|
|
257
|
+
onSuccess: "Login successful"
|
|
258
|
+
onFailure: "Login failed"
|
|
166
259
|
arguments:
|
|
167
260
|
- name: access-key
|
|
168
261
|
description: Access key (optional, will use credentials flow if provided)
|
|
@@ -186,10 +279,20 @@ commands:
|
|
|
186
279
|
- name: ui
|
|
187
280
|
description: Login as a user (OAuth2 flow)
|
|
188
281
|
alias: u
|
|
282
|
+
messages:
|
|
283
|
+
onStart: "Initiating authentication..."
|
|
284
|
+
onSuccess: "Authentication successful\nOrganization '{{org}}' selected"
|
|
285
|
+
onFailure: "Authentication failed"
|
|
286
|
+
onAlreadyDone: "You are already logged in.\nRun \"tigris logout\" first if you want to login with a different account."
|
|
287
|
+
hint: "You have {{count}} organizations available.\nRun \"tigris orgs list\" to see all and switch if needed."
|
|
189
288
|
# credentials
|
|
190
289
|
- name: credentials
|
|
191
290
|
description: Login as a machine (with access key and secret)
|
|
192
291
|
alias: c
|
|
292
|
+
messages:
|
|
293
|
+
onStart: "Authenticating with credentials..."
|
|
294
|
+
onSuccess: "Login successful"
|
|
295
|
+
onFailure: "Login failed"
|
|
193
296
|
arguments:
|
|
194
297
|
- name: access-key
|
|
195
298
|
description: Access key (optional, will prompt or use saved credentials if not provided)
|
|
@@ -211,6 +314,11 @@ commands:
|
|
|
211
314
|
- name: list
|
|
212
315
|
description: List organizations
|
|
213
316
|
alias: l
|
|
317
|
+
messages:
|
|
318
|
+
onStart: "Listing organizations..."
|
|
319
|
+
onSuccess: "Organization '{{name}}' selected"
|
|
320
|
+
onFailure: "Failed to select organization"
|
|
321
|
+
onEmpty: "No organizations found. You may need to re-authenticate.\nRun: tigris login"
|
|
214
322
|
arguments:
|
|
215
323
|
- name: format
|
|
216
324
|
description: Format
|
|
@@ -224,17 +332,23 @@ commands:
|
|
|
224
332
|
- name: create
|
|
225
333
|
description: Create organization
|
|
226
334
|
alias: c
|
|
335
|
+
messages:
|
|
336
|
+
onStart: "Creating organization..."
|
|
337
|
+
onSuccess: "Organization '{{name}}' created successfully\nOrganization ID: {{id}}"
|
|
338
|
+
onFailure: "Failed to create organization"
|
|
339
|
+
hint: "Next steps:\n - Select this organization: tigris orgs select {{name}}"
|
|
227
340
|
arguments:
|
|
228
341
|
- name: name
|
|
229
|
-
|
|
230
|
-
alias: n
|
|
342
|
+
type: noun
|
|
231
343
|
required: true
|
|
232
|
-
|
|
233
|
-
description: Description of the organization
|
|
234
|
-
alias: d
|
|
344
|
+
description: Name of the organization
|
|
235
345
|
- name: select
|
|
236
346
|
description: Select the organization to use
|
|
237
347
|
alias: s
|
|
348
|
+
messages:
|
|
349
|
+
onStart: ""
|
|
350
|
+
onSuccess: "Organization '{{name}}' selected"
|
|
351
|
+
onFailure: "Failed to select organization"
|
|
238
352
|
arguments:
|
|
239
353
|
- name: name
|
|
240
354
|
type: noun
|
|
@@ -252,6 +366,11 @@ commands:
|
|
|
252
366
|
- name: list
|
|
253
367
|
description: List buckets
|
|
254
368
|
alias: l
|
|
369
|
+
messages:
|
|
370
|
+
onStart: "Listing buckets..."
|
|
371
|
+
onSuccess: "Found {{count}} bucket(s)"
|
|
372
|
+
onFailure: "Failed to list buckets"
|
|
373
|
+
onEmpty: "No buckets found"
|
|
255
374
|
arguments:
|
|
256
375
|
- name: format
|
|
257
376
|
description: Format
|
|
@@ -262,109 +381,48 @@ commands:
|
|
|
262
381
|
- name: create
|
|
263
382
|
description: Create bucket
|
|
264
383
|
alias: [c]
|
|
384
|
+
messages:
|
|
385
|
+
onStart: "Creating bucket..."
|
|
386
|
+
onSuccess: "Bucket '{{name}}' created successfully"
|
|
387
|
+
onFailure: "Failed to create bucket"
|
|
265
388
|
arguments:
|
|
266
389
|
- name: name
|
|
267
390
|
description: Name of the bucket
|
|
268
391
|
type: noun
|
|
269
|
-
required:
|
|
392
|
+
required: false
|
|
270
393
|
- name: access
|
|
271
394
|
description: Access level
|
|
272
395
|
alias: a
|
|
273
|
-
options:
|
|
396
|
+
options: *access_options
|
|
274
397
|
default: private
|
|
398
|
+
- name: enable-snapshots
|
|
399
|
+
description: Enable snapshots for the bucket
|
|
400
|
+
alias: s
|
|
401
|
+
type: flag
|
|
402
|
+
default: false
|
|
275
403
|
- name: default-tier
|
|
276
404
|
description: Choose the default tier for the bucket
|
|
277
405
|
alias: t
|
|
278
|
-
options:
|
|
279
|
-
- name: Standard
|
|
280
|
-
value: STANDARD
|
|
281
|
-
description: The default storage class. It provides high durability, availability, and performance for frequently accessed data.
|
|
282
|
-
- name: Infrequent Access
|
|
283
|
-
value: STANDARD_IA
|
|
284
|
-
description: Lower-cost storage for data that is accessed less frequently but requires rapid access when needed.
|
|
285
|
-
- name: Archive
|
|
286
|
-
value: GLACIER
|
|
287
|
-
description: Low-cost storage for data archiving. Long-term data archiving with infrequent access.
|
|
288
|
-
- name: Instant Retrieval Archive
|
|
289
|
-
value: GLACIER_IR
|
|
290
|
-
description: Lowest-cost storage for long-lived data that is rarely accessed and requires retrieval in milliseconds.
|
|
406
|
+
options: *tier_options
|
|
291
407
|
default: STANDARD
|
|
292
408
|
- name: consistency
|
|
293
409
|
description: Choose the consistency level for the bucket
|
|
294
410
|
alias: c
|
|
295
|
-
options:
|
|
296
|
-
- name: Default
|
|
297
|
-
value: default
|
|
298
|
-
description: Strict read-after-write consistency in same region. Eventual consistency globally.
|
|
299
|
-
- name: Strict
|
|
300
|
-
value: strict
|
|
301
|
-
description: Strict read-after-write consistency globally. Latency will be higher than the default.
|
|
411
|
+
options: *consistency_options
|
|
302
412
|
default: default
|
|
303
413
|
- name: region
|
|
304
414
|
description: Region
|
|
305
415
|
alias: r
|
|
306
|
-
options:
|
|
307
|
-
|
|
308
|
-
value: ''
|
|
309
|
-
description: Global
|
|
310
|
-
- name: USA
|
|
311
|
-
value: usa
|
|
312
|
-
description: Restrict to USA
|
|
313
|
-
- name: Europe
|
|
314
|
-
value: eur
|
|
315
|
-
description: Restrict to Europe
|
|
316
|
-
- name: Amsterdam, Netherlands
|
|
317
|
-
value: ams
|
|
318
|
-
description: Amsterdam, Netherlands
|
|
319
|
-
- name: Frankfurt, Germany
|
|
320
|
-
value: fra
|
|
321
|
-
description: Frankfurt, Germany
|
|
322
|
-
- name: Sao Paulo, Brazil
|
|
323
|
-
value: gru
|
|
324
|
-
description: Sao Paulo, Brazil
|
|
325
|
-
- name: Ashburn, Virginia (US)
|
|
326
|
-
value: iad
|
|
327
|
-
description: Ashburn, Virginia (US)
|
|
328
|
-
- name: Johannesburg, South Africa
|
|
329
|
-
value: jnb
|
|
330
|
-
description: Johannesburg, South Africa
|
|
331
|
-
- name: London, United Kingdom
|
|
332
|
-
value: lhr
|
|
333
|
-
description: London, United Kingdom
|
|
334
|
-
- name: Tokyo, Japan
|
|
335
|
-
value: nrt
|
|
336
|
-
description: Tokyo, Japan
|
|
337
|
-
- name: Chicago, Illinois (US)
|
|
338
|
-
value: ord
|
|
339
|
-
description: Chicago, Illinois (US)
|
|
340
|
-
- name: Singapore, Singapore
|
|
341
|
-
value: sin
|
|
342
|
-
description: Singapore, Singapore
|
|
343
|
-
- name: San Jose, California (US)
|
|
344
|
-
value: sjc
|
|
345
|
-
description: San Jose, California (US)
|
|
346
|
-
- name: Sydney, Australia
|
|
347
|
-
value: syd
|
|
348
|
-
description: Sydney, Australia
|
|
349
|
-
default: ''
|
|
350
|
-
- name: Cache Control
|
|
351
|
-
description: This lets you set the default Cache-Control header for objects in the bucket. Tigris will set some cache control headers by default for public objects, but you can set an implicit default here.
|
|
352
|
-
alias: cc
|
|
353
|
-
- name: Delete Protection
|
|
354
|
-
description: This lets you enable or disable delete protection for the bucket. When enabled, objects in the bucket cannot be deleted.
|
|
355
|
-
alias: dp
|
|
356
|
-
options:
|
|
357
|
-
- name: Enabled
|
|
358
|
-
value: enabled
|
|
359
|
-
description: Enabled
|
|
360
|
-
- name: Disabled
|
|
361
|
-
value: disabled
|
|
362
|
-
description: Disabled
|
|
363
|
-
default: disabled
|
|
416
|
+
options: *region_options
|
|
417
|
+
default: 'global'
|
|
364
418
|
# get
|
|
365
419
|
- name: get
|
|
366
420
|
description: Get bucket details
|
|
367
421
|
alias: g
|
|
422
|
+
messages:
|
|
423
|
+
onStart: "Getting bucket details..."
|
|
424
|
+
onSuccess: ""
|
|
425
|
+
onFailure: "Failed to get bucket details"
|
|
368
426
|
arguments:
|
|
369
427
|
- name: name
|
|
370
428
|
description: Name of the bucket
|
|
@@ -374,6 +432,10 @@ commands:
|
|
|
374
432
|
- name: delete
|
|
375
433
|
description: Delete bucket
|
|
376
434
|
alias: d
|
|
435
|
+
messages:
|
|
436
|
+
onStart: "Deleting bucket..."
|
|
437
|
+
onSuccess: "Bucket '{{name}}' deleted successfully"
|
|
438
|
+
onFailure: "Failed to delete bucket '{{name}}'"
|
|
377
439
|
arguments:
|
|
378
440
|
- name: name
|
|
379
441
|
description: Name of the bucket or comma separated list of buckets
|
|
@@ -500,7 +562,7 @@ commands:
|
|
|
500
562
|
- name: access
|
|
501
563
|
description: Access level
|
|
502
564
|
alias: a
|
|
503
|
-
options:
|
|
565
|
+
options: *access_options
|
|
504
566
|
default: private
|
|
505
567
|
- name: content-type
|
|
506
568
|
description: Content type
|
|
@@ -511,19 +573,7 @@ commands:
|
|
|
511
573
|
- name: tier
|
|
512
574
|
description: Tier
|
|
513
575
|
alias: t
|
|
514
|
-
options:
|
|
515
|
-
- name: Standard
|
|
516
|
-
value: STANDARD
|
|
517
|
-
description: The default storage class. It provides high durability, availability, and performance for frequently accessed data.
|
|
518
|
-
- name: Infrequent Access
|
|
519
|
-
value: STANDARD_IA
|
|
520
|
-
description: Lower-cost storage for data that is accessed less frequently but requires rapid access when needed.
|
|
521
|
-
- name: Archive
|
|
522
|
-
value: GLACIER
|
|
523
|
-
description: Low-cost storage for data archiving. Long-term data archiving with infrequent access.
|
|
524
|
-
- name: Instant Retrieval Archive
|
|
525
|
-
value: GLACIER_IR
|
|
526
|
-
description: Lowest-cost storage for long-lived data that is rarely accessed and requires retrieval in milliseconds.
|
|
576
|
+
options: *tier_options
|
|
527
577
|
default: STANDARD
|
|
528
578
|
# delete
|
|
529
579
|
- name: delete
|
package/dist/utils/format.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
function
|
|
2
|
-
`)}function
|
|
3
|
-
`)}function f(r,t){let
|
|
4
|
-
`+
|
|
5
|
-
`),
|
|
6
|
-
`)}function
|
|
1
|
+
function m(n){return JSON.stringify(n,null,2)}function l(n,e=" "){return Object.entries(n).map(([t,r])=>`${e}<${t}>${r}</${t}>`).join(`
|
|
2
|
+
`)}function T(n,e,t){let r=[`<${e}>`];return n.forEach(o=>{r.push(` <${t}>`),r.push(l(o," ")),r.push(` </${t}>`)}),r.push(`</${e}>`),r.join(`
|
|
3
|
+
`)}function p(n){if(n==null)return"";if(n instanceof Date)return f(n);if(typeof n=="string"){let e=new Date(n);if(!isNaN(e.getTime())&&n.includes("T"))return f(e)}return String(n)}function f(n){return new Intl.DateTimeFormat(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(n)}function w(n,e){return e.map(t=>{if(t.width)return t.width;let r=t.header.length,o=n.reduce((s,u)=>{let a=p(u[t.key]);return Math.max(s,a.length)},0);return Math.max(r,o)})}function x(n,e){let t=[],r=w(n,e),o="\u250C"+r.map(i=>"\u2500".repeat(i+2)).join("\u252C")+"\u2510",s="\u251C"+r.map(i=>"\u2500".repeat(i+2)).join("\u253C")+"\u2524",u="\u2514"+r.map(i=>"\u2500".repeat(i+2)).join("\u2534")+"\u2518";t.push(`
|
|
4
|
+
`+o);let a="\u2502 "+e.map((i,d)=>i.header.padEnd(r[d])).join(" \u2502 ")+" \u2502";return t.push(a),t.push(s),n.forEach(i=>{let d=e.map((c,g)=>{let h=p(i[c.key]);return c.align==="right"?h.padStart(r[g]):h.padEnd(r[g])});t.push("\u2502 "+d.join(" \u2502 ")+" \u2502")}),t.push(u+`
|
|
5
|
+
`),t.join(`
|
|
6
|
+
`)}function j(n,e,t,r,o){switch(e){case"json":return m(n);case"xml":return T(n,t,r);default:return x(n,o)}}export{m as formatJson,j as formatOutput,x as formatTable,T as formatXml,l as formatXmlObject};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{readFileSync as g,existsSync as f}from"fs";import{join as m,dirname as d}from"path";import{fileURLToPath as S}from"url";import*as l from"yaml";var C=S(import.meta.url),M=d(C),a=null;function x(){let n=M;for(let e=0;e<5;e++){let s=m(n,"specs.yaml");if(f(s))return s;n=m(n,"..")}throw new Error("Could not find specs.yaml")}function y(){if(!a){let n=x(),e=g(n,"utf8");a=l.parse(e)}return a}function u(n,e){let t=y().commands.find(o=>o.name===n);return t?e&&t.operations?t.operations.find(o=>o.name===e)||null:t:null}var c={success:"\u2714",failure:"\u2716",hint:"\u2192"};function r(n){let e=u(n.command,n.operation);if(e)return e.messages}function i(n,e){let s=n;return s=s.replace(/\\n/g,`
|
|
2
|
+
`),e&&(s=s.replace(/\{\{(\w+)\}\}/g,(t,o)=>{let p=e[o];return p!==void 0?String(p):`{{${o}}}`})),s}function V(n,e){let s=r(n);s?.onStart&&console.log(i(s.onStart,e))}function O(n,e){let s=r(n);s?.onSuccess&&console.log(`${c.success} ${i(s.onSuccess,e)}`)}function P(n,e,s){let t=r(n);t?.onFailure&&console.error(`${c.failure} ${i(t.onFailure,s)}`),e&&console.error(` ${e}`)}function _(n,e){let s=r(n);s?.onEmpty&&console.log(i(s.onEmpty,e))}function j(n,e){let s=r(n);s?.onAlreadyDone&&console.log(i(s.onAlreadyDone,e))}function D(n,e){let s=r(n);s?.hint&&console.log(`${c.hint} ${i(s.hint,e)}`)}function E(n,e){return{command:n,operation:e}}export{E as msg,j as printAlreadyDone,_ as printEmpty,P as printFailure,D as printHint,V as printStart,O as printSuccess};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{readFileSync as c,existsSync as m}from"fs";import{join as o,dirname as p}from"path";import{fileURLToPath as l}from"url";import*as a from"yaml";var u=l(import.meta.url),f=p(u),i=null;function d(){let e=f;for(let n=0;n<5;n++){let t=o(e,"specs.yaml");if(m(t))return t;e=o(e,"..")}throw new Error("Could not find specs.yaml")}function g(){if(!i){let e=d(),n=c(e,"utf8");i=a.parse(n)}return i}function S(e,n){let r=g().commands.find(s=>s.name===e);return r?n&&r.operations?r.operations.find(s=>s.name===n)||null:r:null}function h(e,n,t){let r=S(e,t);return!r||!r.arguments?null:r.arguments.find(s=>s.name===n)||null}function v(e){return e.options?Array.isArray(e.options)&&typeof e.options[0]=="string"?e.options.map(n=>({name:n,message:n.charAt(0).toUpperCase()+n.slice(1),value:n})):Array.isArray(e.options)&&typeof e.options[0]=="object"?e.options.map(n=>({name:n.value,message:n.description?`${n.name} - ${n.description}`:n.name,value:n.value})):null:null}export{v as buildPromptChoices,h as getArgumentSpec,S as getCommandSpec};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tigrisdata/cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "Command line interface for Tigris object storage",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -29,7 +29,6 @@
|
|
|
29
29
|
"publint": "publint",
|
|
30
30
|
"prepublishOnly": "npm run build",
|
|
31
31
|
"clean": "rm -rf dist",
|
|
32
|
-
"commit": "cz",
|
|
33
32
|
"semantic-release": "semantic-release",
|
|
34
33
|
"prepare": "husky install"
|
|
35
34
|
},
|
|
@@ -73,7 +72,7 @@
|
|
|
73
72
|
},
|
|
74
73
|
"dependencies": {
|
|
75
74
|
"@aws-sdk/client-s3": "^3.908.0",
|
|
76
|
-
"@tigrisdata/storage": "
|
|
75
|
+
"@tigrisdata/storage": "^2.10.0",
|
|
77
76
|
"axios": "^1.12.2",
|
|
78
77
|
"commander": "^11.0.0",
|
|
79
78
|
"enquirer": "^2.4.1",
|
|
@@ -81,20 +80,18 @@
|
|
|
81
80
|
"yaml": "^2.3.4"
|
|
82
81
|
},
|
|
83
82
|
"devDependencies": {
|
|
84
|
-
"@commitlint/cli": "^
|
|
85
|
-
"@commitlint/config-conventional": "^
|
|
86
|
-
"@semantic-release/changelog": "^6.0.
|
|
87
|
-
"@semantic-release/git": "^10.0.
|
|
83
|
+
"@commitlint/cli": "^20.2.0",
|
|
84
|
+
"@commitlint/config-conventional": "^20.2.0",
|
|
85
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
86
|
+
"@semantic-release/git": "^10.0.1",
|
|
88
87
|
"@types/node": "^20.0.0",
|
|
89
88
|
"@typescript-eslint/eslint-plugin": "^6.0.0",
|
|
90
89
|
"@typescript-eslint/parser": "^6.0.0",
|
|
91
|
-
"commitizen": "^4.3.0",
|
|
92
|
-
"cz-conventional-changelog": "^3.3.0",
|
|
93
90
|
"eslint": "^8.0.0",
|
|
94
91
|
"husky": "^8.0.0",
|
|
95
92
|
"prettier": "^3.0.0",
|
|
96
93
|
"publint": "^0.2.0",
|
|
97
|
-
"semantic-release": "^
|
|
94
|
+
"semantic-release": "^25.0.2",
|
|
98
95
|
"tsup": "^8.0.0",
|
|
99
96
|
"typescript": "^5.0.0"
|
|
100
97
|
}
|