@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.
@@ -1,5 +1 @@
1
- import f 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 y="https://tigris";import{homedir as A}from"os";import{join as T}from"path";import{readFileSync as I,writeFileSync as O,existsSync as C,mkdirSync as P}from"fs";import{chmod as S}from"fs/promises";var u=T(A(),".tigris"),l=T(u,"config.json");function z(){C(u)||P(u,{recursive:!0,mode:448})}function c(){if(C(l))try{let t=I(l,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function d(t){z(),O(l,JSON.stringify(t,null,2),{mode:384});try{await S(l,384)}catch{}}async function p(t){let e=c();e.tokens=t,await d(e)}async function g(){return c().tokens||null}async function h(){let t=c();delete t.tokens,await d(t)}async function _(t){let e=c();e.organizations=t,await d(e)}function v(){return c().organizations||[]}async function x(t){let e=c();e.loginMethod=t,await d(e)}var k=class{config;baseUrl;constructor(){this.config=w(),this.baseUrl=`https://${this.config.domain}`}async login(){console.log(`\u{1F510} Initiating authentication...
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};
@@ -1,5 +1 @@
1
- import{S3Client as O}from"@aws-sdk/client-s3";import{homedir as E}from"os";import{join as y}from"path";import{readFileSync as b,writeFileSync as M,existsSync as k,mkdirSync as D}from"fs";import{chmod as L}from"fs/promises";var u=y(E(),".tigris"),l=y(u,"config.json");function R(){k(u)||D(u,{recursive:!0,mode:448})}function a(){if(k(l))try{let t=b(l,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function d(t){R(),M(l,JSON.stringify(t,null,2),{mode:384});try{await L(l,384)}catch{}}async function p(t){let e=a();e.tokens=t,await d(e)}async function g(){return a().tokens||null}async function h(){let t=a();delete t.tokens,await d(t)}async function T(t){let e=a();e.organizations=t,await d(e)}function C(){return a().organizations||[]}function v(){return a().selectedOrganization||null}function _(){let t=a();return t.temporaryCredentials||t.credentials||null}async function x(t){let e=a();e.loginMethod=t,await d(e)}function A(){return a().loginMethod||null}import f from"axios";import F from"open";function I(){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 P="https://tigris";var w=class{config;baseUrl;constructor(){this.config=I(),this.baseUrl=`https://${this.config.domain}`}async login(){console.log(`\u{1F510} Initiating authentication...
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 C}from"commander";import{readFileSync as E}from"fs";import{join as x,dirname as q}from"path";import{fileURLToPath as v}from"url";import*as w from"yaml";var P=v(import.meta.url),b=q(P),j=x(b,"specs.yaml"),k=E(j,"utf8"),l=w.parse(k);function y(e){let t;e.type==="noun"?t=` ${e.name}`:(t=` --${e.name}`,e.alias&&(t+=`, -${e.alias}`));let n=26,i=t.length>=n?t+" ":t.padEnd(n),o=e.description;return e.options&&(Array.isArray(e.options)&&typeof e.options[0]=="string"?o+=` (options: ${e.options.join(", ")})`:o+=` (options: ${e.options.map(s=>s.value).join(", ")})`),e.default&&(o+=` [default: ${e.default}]`),e.required&&(o+=" [required]"),e["required-when"]&&(o+=` [required when: ${e["required-when"]}]`),e.multiple&&(o+=" [multiple values: comma-separated]"),e.type==="noun"&&(o+=" [positional argument]"),e.examples&&e.examples.length>0&&(o+=` (examples: ${e.examples.join(", ")})`),`${i}${o}`}function g(e){console.log(`
3
- ${l.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 o=Array.isArray(t.alias)?t.alias:[t.alias];n+=` (${o.join(", ")})`}let i=n.padEnd(24);console.log(`${i}${t.description}`)}),console.log()),e.arguments&&e.arguments.length>0&&(console.log("Arguments:"),e.arguments.forEach(t=>{console.log(y(t))}),console.log()),console.log(`Use "${l.name} ${e.name} <operation> help" for more information about an operation.`)}function R(e,t){console.log(`
5
- ${l.name} ${e.name} ${t.name} - ${t.description}
6
- `),t.arguments&&t.arguments.length>0&&(console.log("Arguments:"),t.arguments.forEach(n=>{console.log(y(n))}),console.log())}function A(){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:"),l.commands.forEach(e=>{let t=` ${e.name}`;e.alias&&(t+=` (${e.alias})`);let n=t.padEnd(24);console.log(`${n}${e.description}`)}),console.log(`
10
- Version: ${l.version}`),console.log(`
11
- Use "${l.name} <command> help" for more information about a command.`)}function p(e,t=[]){t.forEach(n=>{if(n.type==="noun"){let i=n.required?`<${n.name}>`:`[${n.name}]`;e.argument(i,n.description)}else{let i=`--${n.name}`;n.alias&&(i+=`, -${n.alias}`),n.options?i+=" <value>":i+=n.required||n["required-when"]?" <value>":" [value]",e.option(i,n.description,n.default)}})}function d(e,t){for(let n of e){if(n["required-when"]){let[i,o]=n["required-when"].split("="),s=m(t,i,e),r=m(t,n.name,e);if(s===o&&!r)return console.error(`Error: --${n.name} is required when --${i} is ${o}`),!1}if(n.required&&!m(t,n.name,e))return console.error(`Error: --${n.name} is required`),!1}return!0}function m(e,t,n){if(n){let o=n.find(s=>s.name===t);if(o&&o.alias){let s=o.alias.charAt(0).toUpperCase()+o.alias.slice(1);if(e[s]!==void 0)return e[s]}}let i=[t,t.replace(/-/g,""),t.replace(/-/g,"").toLowerCase(),t.charAt(0).toUpperCase(),U(t)];for(let o of i)if(e[o]!==void 0)return e[o]}function U(e){return e.replace(/-([a-z])/g,(t,n)=>n.toUpperCase())}async function $(e,t,n=[],i={}){try{let o,s;t?(o=`./lib/${e}/${t}.js`,s=t):(o=`./lib/${e}.js`,s=e);try{let r=await import(o),a=r.default||r[s];typeof a=="function"?await a({...i,_positional:n}):console.error(`No default export or ${s} function found in ${o}`)}catch{try{let a=t?`./lib/${e}/${t}/index.js`:`./lib/${e}/index.js`,f=await import(a),h=f.default||f[s];typeof h=="function"?await h({...i,_positional:n}):console.error(`No default export or ${s} function found in ${a}`)}catch{console.error(`Command implementation not found: ${o} or ${t?`${e}/${t}/index`:`${e}/index`}`),console.error("Create the implementation file with a default export function.")}}}catch(o){console.error(`Error executing command: ${o}`)}}var c=new C;c.name(l.name).description(l.description).version(l.version);function u(e,t,n){let i;"opts"in n&&typeof n.opts=="function"?i=n.opts():i=n;let o={...i};return e.filter(r=>r.type==="noun").forEach((r,a)=>{t[a]!==void 0&&(r.multiple?o[r.name]=t[a].split(",").map(f=>f.trim()):o[r.name]=t[a])}),e.forEach(r=>{r.multiple&&r.type!=="noun"&&o[r.name]&&typeof o[r.name]=="string"&&(o[r.name]=o[r.name].split(",").map(a=>a.trim()))}),o}l.commands.forEach(e=>{let t=c.command(e.name).description(e.description);if(e.alias&&t.alias(e.alias),e.operations&&e.operations.length>0)if(e.operations.forEach(n=>{let i=t.command(n.name).description(n.description);n.alias&&(Array.isArray(n.alias)?n.alias:[n.alias]).forEach(s=>i.alias(s)),p(i,n.arguments),i.action(async(...o)=>{let s=o.pop(),r=o;n.arguments&&!d(n.arguments,u(n.arguments,r,s))||await $(e.name,n.name,r,u(n.arguments||[],r,s))}),i.command("help").description("Show help for this operation").action(()=>{R(e,n)})}),e.default){let n=e.operations?.find(i=>i.name===e.default);n&&(p(t,n.arguments),t.action(async(...i)=>{let o=i.pop(),s=i;n.arguments&&!d(n.arguments,u(n.arguments,s,o))||await $(e.name,n.name,s,u(n.arguments||[],s,o))}))}else t.action(()=>{g(e)});else p(t,e.arguments),t.action(async(...n)=>{let i=n.pop(),o=n;e.arguments&&!d(e.arguments,u(e.arguments,o,i))||await $(e.name,void 0,o,u(e.arguments||[],o,i))});t.command("help").description("Show help for this command").action(()=>{g(e)})});c.command("help").description("Show general help").action(()=>{A()});c.action(()=>{A()});c.parse();
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 C}from"commander";import{readFileSync as E}from"fs";import{join as x,dirname as q}from"path";import{fileURLToPath as v}from"url";import*as w from"yaml";var P=v(import.meta.url),b=q(P),j=x(b,"specs.yaml"),k=E(j,"utf8"),l=w.parse(k);function y(e){let t;e.type==="noun"?t=` ${e.name}`:(t=` --${e.name}`,e.alias&&(t+=`, -${e.alias}`));let n=26,i=t.length>=n?t+" ":t.padEnd(n),o=e.description;return e.options&&(Array.isArray(e.options)&&typeof e.options[0]=="string"?o+=` (options: ${e.options.join(", ")})`:o+=` (options: ${e.options.map(s=>s.value).join(", ")})`),e.default&&(o+=` [default: ${e.default}]`),e.required&&(o+=" [required]"),e["required-when"]&&(o+=` [required when: ${e["required-when"]}]`),e.multiple&&(o+=" [multiple values: comma-separated]"),e.type==="noun"&&(o+=" [positional argument]"),e.examples&&e.examples.length>0&&(o+=` (examples: ${e.examples.join(", ")})`),`${i}${o}`}function g(e){console.log(`
2
- ${l.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 o=Array.isArray(t.alias)?t.alias:[t.alias];n+=` (${o.join(", ")})`}let i=n.padEnd(24);console.log(`${i}${t.description}`)}),console.log()),e.arguments&&e.arguments.length>0&&(console.log("Arguments:"),e.arguments.forEach(t=>{console.log(y(t))}),console.log()),console.log(`Use "${l.name} ${e.name} <operation> help" for more information about an operation.`)}function R(e,t){console.log(`
4
- ${l.name} ${e.name} ${t.name} - ${t.description}
5
- `),t.arguments&&t.arguments.length>0&&(console.log("Arguments:"),t.arguments.forEach(n=>{console.log(y(n))}),console.log())}function A(){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:"),l.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
- Version: ${l.version}`),console.log(`
10
- Use "${l.name} <command> help" for more information about a command.`)}function p(e,t=[]){t.forEach(n=>{if(n.type==="noun"){let i=n.required?`<${n.name}>`:`[${n.name}]`;e.argument(i,n.description)}else{let i=`--${n.name}`;n.alias&&(i+=`, -${n.alias}`),n.options?i+=" <value>":i+=n.required||n["required-when"]?" <value>":" [value]",e.option(i,n.description,n.default)}})}function d(e,t){for(let n of e){if(n["required-when"]){let[i,o]=n["required-when"].split("="),s=m(t,i,e),r=m(t,n.name,e);if(s===o&&!r)return console.error(`Error: --${n.name} is required when --${i} is ${o}`),!1}if(n.required&&!m(t,n.name,e))return console.error(`Error: --${n.name} is required`),!1}return!0}function m(e,t,n){if(n){let o=n.find(s=>s.name===t);if(o&&o.alias){let s=o.alias.charAt(0).toUpperCase()+o.alias.slice(1);if(e[s]!==void 0)return e[s]}}let i=[t,t.replace(/-/g,""),t.replace(/-/g,"").toLowerCase(),t.charAt(0).toUpperCase(),U(t)];for(let o of i)if(e[o]!==void 0)return e[o]}function U(e){return e.replace(/-([a-z])/g,(t,n)=>n.toUpperCase())}async function $(e,t,n=[],i={}){try{let o,s;t?(o=`./lib/${e}/${t}.js`,s=t):(o=`./lib/${e}.js`,s=e);try{let r=await import(o),a=r.default||r[s];typeof a=="function"?await a({...i,_positional:n}):console.error(`No default export or ${s} function found in ${o}`)}catch{try{let a=t?`./lib/${e}/${t}/index.js`:`./lib/${e}/index.js`,f=await import(a),h=f.default||f[s];typeof h=="function"?await h({...i,_positional:n}):console.error(`No default export or ${s} function found in ${a}`)}catch{console.error(`Command implementation not found: ${o} or ${t?`${e}/${t}/index`:`${e}/index`}`),console.error("Create the implementation file with a default export function.")}}}catch(o){console.error(`Error executing command: ${o}`)}}var c=new C;c.name(l.name).description(l.description).version(l.version);function u(e,t,n){let i;"opts"in n&&typeof n.opts=="function"?i=n.opts():i=n;let o={...i};return e.filter(r=>r.type==="noun").forEach((r,a)=>{t[a]!==void 0&&(r.multiple?o[r.name]=t[a].split(",").map(f=>f.trim()):o[r.name]=t[a])}),e.forEach(r=>{r.multiple&&r.type!=="noun"&&o[r.name]&&typeof o[r.name]=="string"&&(o[r.name]=o[r.name].split(",").map(a=>a.trim()))}),o}l.commands.forEach(e=>{let t=c.command(e.name).description(e.description);if(e.alias&&t.alias(e.alias),e.operations&&e.operations.length>0)if(e.operations.forEach(n=>{let i=t.command(n.name).description(n.description);n.alias&&(Array.isArray(n.alias)?n.alias:[n.alias]).forEach(s=>i.alias(s)),p(i,n.arguments),i.action(async(...o)=>{let s=o.pop(),r=o;n.arguments&&!d(n.arguments,u(n.arguments,r,s))||await $(e.name,n.name,r,u(n.arguments||[],r,s))}),i.command("help").description("Show help for this operation").action(()=>{R(e,n)})}),e.default){let n=e.operations?.find(i=>i.name===e.default);n&&(p(t,n.arguments),t.action(async(...i)=>{let o=i.pop(),s=i;n.arguments&&!d(n.arguments,u(n.arguments,s,o))||await $(e.name,n.name,s,u(n.arguments||[],s,o))}))}else t.action(()=>{g(e)});else p(t,e.arguments),t.action(async(...n)=>{let i=n.pop(),o=n;e.arguments&&!d(e.arguments,u(e.arguments,o,i))||await $(e.name,void 0,o,u(e.arguments||[],o,i))});t.command("help").description("Show help for this command").action(()=>{g(e)})});c.command("help").description("Show general help").action(()=>{A()});c.action(()=>{A()});c.parse();
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};
@@ -1,14 +1,7 @@
1
- function C(n,e,t){for(let o of e)if(n[o]!==void 0)return n[o];return t}function $(n){return JSON.stringify(n,null,2)}function j(n,e=" "){return Object.entries(n).map(([t,o])=>`${e}<${t}>${o}</${t}>`).join(`
2
- `)}function D(n,e,t){let o=[`<${e}>`];return n.forEach(r=>{o.push(` <${t}>`),o.push(j(r," ")),o.push(` </${t}>`)}),o.push(`</${e}>`),o.join(`
3
- `)}function L(n,e){let t=[],o="\u250C"+e.map(i=>"\u2500".repeat(i.width+2)).join("\u252C")+"\u2510",r="\u251C"+e.map(i=>"\u2500".repeat(i.width+2)).join("\u253C")+"\u2524",s="\u2514"+e.map(i=>"\u2500".repeat(i.width+2)).join("\u2534")+"\u2518";t.push(`
4
- `+o);let a="\u2502 "+e.map(i=>i.header.padEnd(i.width)).join(" \u2502 ")+" \u2502";return t.push(a),t.push(r),n.forEach(i=>{let p=e.map(d=>{let y=String(i[d.key]??"");return d.align==="right"?y.padStart(d.width):y.padEnd(d.width)});t.push("\u2502 "+p.join(" \u2502 ")+" \u2502")}),t.push(s+`
5
- `),t.join(`
6
- `)}function x(n,e,t,o,r){switch(e){case"json":return $(n);case"xml":return D(n,t,o);default:return L(n,r)}}import{S3Client as R}from"@aws-sdk/client-s3";import{homedir as F}from"os";import{join as v}from"path";import{readFileSync as B,writeFileSync as J,existsSync as _,mkdirSync as U}from"fs";import{chmod as K}from"fs/promises";var h=v(F(),".tigris"),l=v(h,"config.json");function H(){_(h)||U(h,{recursive:!0,mode:448})}function c(){if(_(l))try{let n=B(l,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function g(n){H(),J(l,JSON.stringify(n,null,2),{mode:384});try{await K(l,384)}catch{}}async function m(n){let e=c();e.tokens=n,await g(e)}async function u(){return c().tokens||null}async function w(){let n=c();delete n.tokens,await g(n)}async function A(n){let e=c();e.organizations=n,await g(e)}function I(){return c().organizations||[]}function O(){return c().selectedOrganization||null}function S(){let n=c();return n.temporaryCredentials||n.credentials||null}async function P(n){let e=c();e.loginMethod=n,await g(e)}function N(){return c().loginMethod||null}import f from"axios";import q 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 z="https://tigris";var T=class{config;baseUrl;constructor(){this.config=b(),this.baseUrl=`https://${this.config.domain}`}async login(){console.log(`\u{1F510} Initiating authentication...
7
- `);try{let t=(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 q(t.verification_uri_complete)}catch{console.log(`Visit: ${t.verification_uri} and Enter code: ${t.user_code}
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 T from"enquirer";import{homedir as y}from"os";import{join as a}from"path";import{readFileSync as p,writeFileSync as m,existsSync as d,mkdirSync as C}from"fs";import{chmod as h}from"fs/promises";var c=a(y(),".tigris"),r=a(c,"config.json");function x(){d(c)||C(c,{recursive:!0,mode:448})}function g(){if(d(r))try{let e=p(r,"utf8");return JSON.parse(e)}catch{return{}}return{}}async function l(e){x(),m(r,JSON.stringify(e,null,2),{mode:384});try{await h(r,384)}catch{}}async function f(e){let n=g();n.credentials=e,await l(n)}async function u(e){let n=g();n.loginMethod=e,await l(n)}var{prompt:w}=T;async function S(e){console.log(`\u{1F510} Tigris Configuration
2
- `);let n=e["access-key"]||e.accessKey||e.key||e.Key||e.accesskey,i=e["access-secret"]||e.accessSecret||e.secret||e.Secret||e.accesssecret,o=e.endpoint||e.e||e.E||e.Endpoint;if(!n||!i||!o){console.log(`Please provide your Tigris credentials. You can find these in your Tigris dashboard.
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
- function n(t){let o=t.split("/");return{bucket:o[0],path:o.slice(1).join("/")}}function a(t,o){return{source:n(t),destination:n(o)}}async function c(t){let o=t.src||t._positional?.[0],r=t.dest||t._positional?.[1];if(!o||!r){console.error("Error: both src and dest arguments are required");return}console.log(`Copying from: ${o} to: ${r}`);let{source:s,destination:e}=a(o,r);console.log(`Source bucket: ${s.bucket}, path: ${s.path||"(root)"}`),console.log(`Destination bucket: ${e.bucket}, path: ${e.path||"(root)"}`),console.log("Implementation pending - this would copy folders or objects")}export{c as default};
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 T from"enquirer";import{homedir as v}from"os";import{join as u}from"path";import{readFileSync as h,writeFileSync as w,existsSync as y,mkdirSync as x}from"fs";import{chmod as K}from"fs/promises";var c=u(v(),".tigris"),i=u(c,"config.json");function P(){y(c)||x(c,{recursive:!0,mode:448})}function a(){if(y(i))try{let e=h(i,"utf8");return JSON.parse(e)}catch{return{}}return{}}async function p(e){P(),w(i,JSON.stringify(e,null,2),{mode:384});try{await K(i,384)}catch{}}function l(){let e=a();return e.temporaryCredentials||e.credentials||null}async function m(e){let s=a();s.temporaryCredentials=e,await p(s)}async function C(e){let s=a();s.loginMethod=e,await p(s)}var{prompt:d}=T;async function k(e){console.log(`\u{1F510} Tigris Machine Login
2
- `);let s=e["access-key"]||e.accessKey||e.key||e.Key||e.accesskey,n=e["access-secret"]||e.accessSecret||e.secret||e.Secret||e.accesssecret,g=e.profile||e.Profile||e.p||e.P;if(!s||!n){let o=l();if(o)if(g)console.log(`\u{1F4C1} Using saved credentials from profile...
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};
@@ -1,18 +1,5 @@
1
- import q from"enquirer";import m from"axios";import $ from"open";function x(){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 _="https://tigris";import{homedir as E}from"os";import{join as P}from"path";import{readFileSync as L,writeFileSync as D,existsSync as I,mkdirSync as R}from"fs";import{chmod as M}from"fs/promises";var h=P(E(),".tigris"),u=P(h,"config.json");function U(){I(h)||R(h,{recursive:!0,mode:448})}function c(){if(I(u))try{let e=L(u,"utf8");return JSON.parse(e)}catch{return{}}return{}}async function d(e){U(),D(u,JSON.stringify(e,null,2),{mode:384});try{await M(u,384)}catch{}}async function y(e){let t=c();t.tokens=e,await d(t)}async function f(){return c().tokens||null}async function w(){let e=c();delete e.tokens,await d(e)}async function O(e){let t=c();t.organizations=e,await d(t)}function z(){return c().organizations||[]}async function K(e){let t=c();t.selectedOrganization=e,await d(t)}function k(){let e=c();return e.temporaryCredentials||e.credentials||null}async function N(e){let t=c();t.temporaryCredentials=e,await d(t)}async function p(e){let t=c();t.loginMethod=e,await d(t)}var v=class{config;baseUrl;constructor(){this.config=x(),this.baseUrl=`https://${this.config.domain}`}async login(){console.log(`\u{1F510} Initiating authentication...
2
- `);try{let n=(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;console.log("\u{1F4F1} Please authenticate in your browser:");try{await $(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 y(o),p("oauth"),await this.extractAndStoreOrganizations(o.idToken),console.log(`\u2705 Authentication successful!
5
- `)}catch(t){throw t instanceof Error?console.error(`\u274C Authentication failed: ${t.message}`):console.error("\u274C Authentication failed"),t}}async pollForToken(t,n){let a=0;for(;a<60;){a++;try{let s=(await m.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,r=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:r}}catch(i){if(m.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 t=await f();if(!t)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let n=300*1e3;return Date.now()+n>=t.expiresAt&&(console.log("\u{1F504} Refreshing access token..."),t=await this.refreshAccessToken(t)),t.accessToken}async refreshAccessToken(t){if(!t.refreshToken)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let o=(await m.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:t.refreshToken},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a={accessToken:o.access_token,refreshToken:o.refresh_token||t.refreshToken,idToken:o.id_token||t.idToken,expiresAt:Date.now()+(o.expires_in||3600)*1e3};return await y(a),a}catch{throw await w(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let t=await f();if(!t||!t.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let n=t.idToken.split(".")[1],o=Buffer.from(n,"base64").toString("utf8");return JSON.parse(o)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(t){if(!t){console.warn("\u26A0\uFE0F No ID token available, skipping organization extraction");return}try{let n=t.split(".")[1],o=Buffer.from(n,"base64").toString("utf8"),i=JSON.parse(o)[_];if(!i){console.warn("\u26A0\uFE0F No Tigris claims found in token");return}let s=i?.ns?.map(r=>typeof r=="object"&&r!==null?{id:r.id,name:r.name,displayName:r.name}:{id:r,name:r,displayName:r})||[];if(s.length===0){console.warn("\u26A0\uFE0F No organizations found in claims");return}O(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(),z()}async logout(){await w(),console.log("\u2705 Logged out successfully")}async isAuthenticated(){return await f()!==null}sleep(t){return new Promise(n=>setTimeout(n,t))}},T=null;function b(){return T||(T=new v),T}async function C(){console.log("\u{1F510} Tigris User Login");try{let e=b();if(await e.isAuthenticated()){console.log("\u26A0\uFE0F You are already logged in."),console.log(`\u{1F4A1} Run "tigris logout" first if you want to login with a different account.
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};
@@ -1,8 +1,5 @@
1
- import f from"axios";import E 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 y="https://tigris";import{homedir as O}from"os";import{join as T}from"path";import{readFileSync as P,writeFileSync as z,existsSync as C,mkdirSync as S}from"fs";import{chmod as N}from"fs/promises";var u=T(O(),".tigris"),g=T(u,"config.json");function b(){C(u)||S(u,{recursive:!0,mode:448})}function a(){if(C(g))try{let t=P(g,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function l(t){b(),z(g,JSON.stringify(t,null,2),{mode:384});try{await N(g,384)}catch{}}async function p(t){let e=a();e.tokens=t,await l(e)}async function d(){return a().tokens||null}async function h(){let t=a();delete t.tokens,await l(t)}async function v(t){let e=a();e.organizations=t,await l(e)}function _(){return a().organizations||[]}async function x(t){let e=a();e.selectedOrganization=t,await l(e)}async function A(t){let e=a();e.loginMethod=t,await l(e)}var w=class{config;baseUrl;constructor(){this.config=k(),this.baseUrl=`https://${this.config.domain}`}async login(){console.log(`\u{1F510} Initiating authentication...
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 E(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),A("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 d();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 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){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}v(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(),_()}async logout(){await h(),console.log("\u2705 Logged out successfully")}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},m=null;function I(){return m||(m=new w),m}async function D(){console.log("\u{1F510} Tigris User Login");try{let t=I();if(await t.isAuthenticated()){console.log("\u26A0\uFE0F You are already logged in."),console.log(`\u{1F4A1} Run "tigris logout" first if you want to login with a different account.
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};
@@ -1,4 +1,2 @@
1
- import{homedir as a}from"os";import{join as t}from"path";import{readFileSync as c,writeFileSync as l,existsSync as i,mkdirSync as g}from"fs";import{chmod as f}from"fs/promises";var e=t(a(),".tigris"),o=t(e,"config.json");function d(){i(e)||g(e,{recursive:!0,mode:448})}function u(){if(i(o))try{let n=c(o,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function m(n){d(),l(o,JSON.stringify(n,null,2),{mode:384});try{await f(o,384)}catch{}}async function r(){let s=u().credentials;await m({credentials:s})}async function p(){try{console.log(`\u{1F513} Logging out...
2
- `),await r(),console.log("\u2705 Successfully logged out"),console.log(`\u{1F4A1} All stored tokens and data have been cleared
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
- function n(s){let t=s.split("/");return{bucket:t[0],path:t.slice(1).join("/")}}async function r(s){let t=s.path||s._positional?.[0];if(!t){console.error("Error: path argument is required");return}console.log(`Listing: ${t}`);let{bucket:e,path:o}=n(t);console.log(o?`Listing objects in bucket "${e}" at path "${o}"`:`Listing objects in bucket "${e}"`),console.log("Implementation pending - this would list buckets or objects")}export{r as default};
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 s(e){let t=e.split("/");return{bucket:t[0],path:t.slice(1).join("/")}}async function n(e){let t=e.path||e._positional?.[0];if(!t){console.error("Error: path argument is required");return}console.log(`Creating: ${t}`);let{bucket:r,path:o}=s(t);console.log(o?`Creating folder "${o}" in bucket "${r}"`:`Creating bucket "${r}"`),console.log("Implementation pending - this would create buckets or folders")}export{n as default};
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
- function n(t){let o=t.split("/");return{bucket:o[0],path:o.slice(1).join("/")}}function a(t,o){return{source:n(t),destination:n(o)}}async function i(t){let o=t.src||t._positional?.[0],r=t.dest||t._positional?.[1];if(!o||!r){console.error("Error: both src and dest arguments are required");return}console.log(`Moving from: ${o} to: ${r}`);let{source:s,destination:e}=a(o,r);console.log(`Source bucket: ${s.bucket}, path: ${s.path||"(root)"}`),console.log(`Destination bucket: ${e.bucket}, path: ${e.path||"(root)"}`),console.log("Implementation pending - this would move folders or objects")}export{i as default};
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};
@@ -1,2 +1,2 @@
1
- function i(e,o,n){for(let t of o)if(e[t]!==void 0)return e[t];return n}async function s(e){console.log("\u{1F3D7}\uFE0F Creating Organization");let o=i(e,["name","N"]),n=i(e,["description","D"]);o||(console.error("\u274C Organization name is required"),process.exit(1)),console.log(`\u{1F4DD} Name: ${o}`),n&&console.log(`\u{1F4C4} Description: ${n}`),console.log("\u{1F504} Creating organization..."),await new Promise(r=>setTimeout(r,1e3));let t=Math.random().toString(36).substring(2,10);console.log("\u2705 Organization created successfully!"),console.log(`\u{1F194} Organization ID: ${t}`),console.log(`\u{1F4DB} Organization Name: ${o}`),n&&console.log(`\u{1F4C4} Description: ${n}`),console.log(`
2
- \u{1F4A1} Next steps:`),console.log(` - Select this organization: tigris orgs select --name ${o}`),console.log(" - Create a bucket: tigris buckets create --name my-bucket")}export{s as default};
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};
@@ -1,21 +1,7 @@
1
- function v(t,e,n){for(let o of e)if(t[o]!==void 0)return t[o];return n}function j(t){return JSON.stringify(t,null,2)}function D(t,e=" "){return Object.entries(t).map(([n,o])=>`${e}<${n}>${o}</${n}>`).join(`
2
- `)}function F(t,e,n){let o=[`<${e}>`];return t.forEach(r=>{o.push(` <${n}>`),o.push(D(r," ")),o.push(` </${n}>`)}),o.push(`</${e}>`),o.join(`
3
- `)}function M(t,e){let n=[],o="\u250C"+e.map(i=>"\u2500".repeat(i.width+2)).join("\u252C")+"\u2510",r="\u251C"+e.map(i=>"\u2500".repeat(i.width+2)).join("\u253C")+"\u2524",a="\u2514"+e.map(i=>"\u2500".repeat(i.width+2)).join("\u2534")+"\u2518";n.push(`
4
- `+o);let s="\u2502 "+e.map(i=>i.header.padEnd(i.width)).join(" \u2502 ")+" \u2502";return n.push(s),n.push(r),t.forEach(i=>{let c=e.map(l=>{let g=String(i[l.key]??"");return l.align==="right"?g.padStart(l.width):g.padEnd(l.width)});n.push("\u2502 "+c.join(" \u2502 ")+" \u2502")}),n.push(a+`
5
- `),n.join(`
6
- `)}function O(t,e,n,o,r){switch(e){case"json":return j(t);case"xml":return F(t,n,o);default:return M(t,r)}}import h from"axios";import q from"open";function z(){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 L}from"os";import{join as I}from"path";import{readFileSync as J,writeFileSync as U,existsSync as S,mkdirSync as B}from"fs";import{chmod as H}from"fs/promises";var k=I(L(),".tigris"),p=I(k,"config.json");function G(){S(k)||B(k,{recursive:!0,mode:448})}function d(){if(S(p))try{let t=J(p,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function f(t){G(),U(p,JSON.stringify(t,null,2),{mode:384});try{await H(p,384)}catch{}}async function y(t){let e=d();e.tokens=t,await f(e)}async function m(){return d().tokens||null}async function T(){let t=d();delete t.tokens,await f(t)}async function N(t){let e=d();e.organizations=t,await f(e)}function P(){return d().organizations||[]}async function b(t){let e=d();e.selectedOrganization=t,await f(e)}function $(){return d().selectedOrganization||null}async function E(t){let e=d();e.loginMethod=t,await f(e)}var x=class{config;baseUrl;constructor(){this.config=z(),this.baseUrl=`https://${this.config.domain}`}async login(){console.log(`\u{1F510} Initiating authentication...
7
- `);try{let n=(await h.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;console.log("\u{1F4F1} Please authenticate in your browser:");try{await q(n.verification_uri_complete)}catch{console.log(`Visit: ${n.verification_uri} and Enter code: ${n.user_code}
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};
@@ -1,12 +1,6 @@
1
- function w(o,e,n){for(let t of e)if(o[t]!==void 0)return o[t];return n}import f from"axios";import $ 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 y="https://tigris";import{homedir as I}from"os";import{join as C}from"path";import{readFileSync as P,writeFileSync as S,existsSync as v,mkdirSync as N}from"fs";import{chmod as b}from"fs/promises";var u=C(I(),".tigris"),g=C(u,"config.json");function E(){v(u)||N(u,{recursive:!0,mode:448})}function c(){if(v(g))try{let o=P(g,"utf8");return JSON.parse(o)}catch{return{}}return{}}async function l(o){E(),S(g,JSON.stringify(o,null,2),{mode:384});try{await b(g,384)}catch{}}async function p(o){let e=c();e.tokens=o,await l(e)}async function d(){return c().tokens||null}async function m(){let o=c();delete o.tokens,await l(o)}async function _(o){let e=c();e.organizations=o,await l(e)}function x(){return c().organizations||[]}async function A(o){let e=c();e.selectedOrganization=o,await l(e)}async function O(o){let e=c();e.loginMethod=o,await l(e)}var k=class{config;baseUrl;constructor(){this.config=T(),this.baseUrl=`https://${this.config.domain}`}async login(){console.log(`\u{1F510} Initiating authentication...
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.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 t=await this.pollForToken(n.device_code,n.interval||5);await p(t),O("oauth"),await this.extractAndStoreOrganizations(t.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 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 d();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 t=(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:t.access_token,refreshToken:t.refresh_token||e.refreshToken,idToken:t.id_token||e.idToken,expiresAt:Date.now()+(t.expires_in||3600)*1e3};return await p(r),r}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],t=Buffer.from(n,"base64").toString("utf8");return JSON.parse(t)}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],t=Buffer.from(n,"base64").toString("utf8"),i=JSON.parse(t)[y];if(!i){console.warn("\u26A0\uFE0F No Tigris claims found in token");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){console.warn("\u26A0\uFE0F No organizations found in claims");return}_(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(),x()}async logout(){await m(),console.log("\u2705 Logged out successfully")}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},h=null;function z(){return h||(h=new k),h}async function D(o){console.log("\u{1F3AF} Selecting Organization");let e=w(o,["name","N"]);e||(console.error("\u274C Organization name or ID is required"),process.exit(1));try{console.log(`\u{1F50D} Looking for organization: ${e}`);let n=z();await n.getAccessToken();let t=await n.getOrganizations(),r=t.find(i=>i.id===e||i.name===e);r||(console.error(`
6
- \u274C Organization "${e}" not found`),console.log(`
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 s(e){let t=e.split("/");return{bucket:t[0],path:t.slice(1).join("/")}}async function n(e){let t=e.path||e._positional?.[0];if(!t){console.error("Error: path argument is required");return}console.log(`Removing: ${t}`);let{bucket:r,path:o}=s(t);o?o.includes("*")?console.log(`Removing objects matching pattern "${o}" in bucket "${r}"`):console.log(`Removing object "${o}" from bucket "${r}"`):console.log(`Removing bucket "${r}"`),console.log("Implementation pending - this would remove buckets, folders, or objects")}export{n as default};
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 r(e){let t=e.split("/");return{bucket:t[0],path:t.slice(1).join("/")}}async function n(e){let t=e.path||e._positional?.[0];if(!t){console.error("Error: path argument is required");return}console.log(`Getting details for: ${t}`);let{bucket:o,path:s}=r(t);console.log(s?`Getting object details for "${s}" in bucket "${o}"`:`Getting bucket details for "${o}"`),console.log("Implementation pending - this would show details of buckets, folders, or objects")}export{n as default};
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};
@@ -1,14 +1,3 @@
1
- import f from"axios";import b 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 y="https://tigris";import{homedir as O}from"os";import{join as T}from"path";import{readFileSync as z,writeFileSync as P,existsSync as C,mkdirSync as S}from"fs";import{chmod as N}from"fs/promises";var u=T(O(),".tigris"),l=T(u,"config.json");function E(){C(u)||S(u,{recursive:!0,mode:448})}function c(){if(C(l))try{let t=z(l,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function d(t){E(),P(l,JSON.stringify(t,null,2),{mode:384});try{await N(l,384)}catch{}}async function p(t){let e=c();e.tokens=t,await d(e)}async function g(){return c().tokens||null}async function m(){let t=c();delete t.tokens,await d(t)}async function v(t){let e=c();e.organizations=t,await d(e)}function _(){return c().organizations||[]}function A(){return c().selectedOrganization||null}async function x(t){let e=c();e.loginMethod=t,await d(e)}var k=class{config;baseUrl;constructor(){this.config=w(),this.baseUrl=`https://${this.config.domain}`}async login(){console.log(`\u{1F510} Initiating authentication...
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 b(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 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: &region_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
- description: Name of the organization
230
- alias: n
342
+ type: noun
231
343
  required: true
232
- - name: description
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: true
392
+ required: false
270
393
  - name: access
271
394
  description: Access level
272
395
  alias: a
273
- options: [public, private]
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
- - name: Global
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: [public, private]
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
@@ -1,6 +1,6 @@
1
- function g(r){return JSON.stringify(r,null,2)}function h(r,t=" "){return Object.entries(r).map(([n,e])=>`${t}<${n}>${e}</${n}>`).join(`
2
- `)}function c(r,t,n){let e=[`<${t}>`];return r.forEach(o=>{e.push(` <${n}>`),e.push(h(o," ")),e.push(` </${n}>`)}),e.push(`</${t}>`),e.join(`
3
- `)}function f(r,t){let n=[],e="\u250C"+t.map(i=>"\u2500".repeat(i.width+2)).join("\u252C")+"\u2510",o="\u251C"+t.map(i=>"\u2500".repeat(i.width+2)).join("\u253C")+"\u2524",u="\u2514"+t.map(i=>"\u2500".repeat(i.width+2)).join("\u2534")+"\u2518";n.push(`
4
- `+e);let p="\u2502 "+t.map(i=>i.header.padEnd(i.width)).join(" \u2502 ")+" \u2502";return n.push(p),n.push(o),r.forEach(i=>{let d=t.map(s=>{let a=String(i[s.key]??"");return s.align==="right"?a.padStart(s.width):a.padEnd(s.width)});n.push("\u2502 "+d.join(" \u2502 ")+" \u2502")}),n.push(u+`
5
- `),n.join(`
6
- `)}function w(r,t,n,e,o){switch(t){case"json":return g(r);case"xml":return c(r,n,e);default:return f(r,o)}}export{g as formatJson,w as formatOutput,f as formatTable,c as formatXml,h as formatXmlObject};
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.0.0",
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": "^18.0.0",
85
- "@commitlint/config-conventional": "^18.0.0",
86
- "@semantic-release/changelog": "^6.0.0",
87
- "@semantic-release/git": "^10.0.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": "^22.0.0",
94
+ "semantic-release": "^25.0.2",
98
95
  "tsup": "^8.0.0",
99
96
  "typescript": "^5.0.0"
100
97
  }