@tigrisdata/cli 2.5.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{Command as E}from"commander";import{readFileSync as k,existsSync as q}from"fs";import{join as u,dirname as R}from"path";import{fileURLToPath as P}from"url";import*as C from"yaml";var b="2.5.0";process.on("unhandledRejection",e=>{(e===""||e===void 0)&&(console.error(`
2
+ import{Command as E}from"commander";import{readFileSync as k,existsSync as q}from"fs";import{join as u,dirname as R}from"path";import{fileURLToPath as P}from"url";import*as C from"yaml";var b="2.6.0";process.on("unhandledRejection",e=>{(e===""||e===void 0)&&(console.error(`
3
3
  Operation cancelled`),process.exit(1)),console.error(`
4
4
  Error:`,e instanceof Error?e.message:e),process.exit(1)});process.on("uncaughtException",e=>{console.error(`
5
5
  Error:`,e.message),process.exit(1)});var D=P(import.meta.url),p=R(D),V=u(p,"specs.yaml"),M=k(V,"utf8"),l=C.parse(M);function y(e,t){return(t?[u(p,"lib",e,`${t}.js`),u(p,"lib",e,t,"index.js")]:[u(p,"lib",`${e}.js`),u(p,"lib",e,"index.js")]).some(i=>q(i))}function v(e){let t;e.type==="positional"?t=` ${e.name}`:(t=` --${e.name}`,e.alias&&e.alias.length===1&&(t+=`, -${e.alias}`));let n=26,i=t.length>=n?t+" ":t.padEnd(n),s=e.description;return e.options&&(Array.isArray(e.options)&&typeof e.options[0]=="string"?s+=` (options: ${e.options.join(", ")})`:s+=` (options: ${e.options.map(o=>o.value).join(", ")})`),e.default&&(s+=` [default: ${e.default}]`),e.required&&(s+=" [required]"),e["required-when"]&&(s+=` [required when: ${e["required-when"]}]`),e.multiple&&(s+=" [multiple values: comma-separated]"),e.type==="positional"&&(s+=" [positional argument]"),e.examples&&e.examples.length>0&&(s+=` (examples: ${e.examples.join(", ")})`),`${i}${s}`}function w(e){if(console.log(`
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{Command as E}from"commander";import{readFileSync as k,existsSync as q}from"fs";import{join as p,dirname as R}from"path";import{fileURLToPath as P}from"url";import*as C from"yaml";var b="2.5.0";process.on("unhandledRejection",e=>{(e===""||e===void 0)&&(console.error(`
1
+ import{Command as E}from"commander";import{readFileSync as k,existsSync as q}from"fs";import{join as p,dirname as R}from"path";import{fileURLToPath as P}from"url";import*as C from"yaml";var b="2.6.0";process.on("unhandledRejection",e=>{(e===""||e===void 0)&&(console.error(`
2
2
  Operation cancelled`),process.exit(1)),console.error(`
3
3
  Error:`,e instanceof Error?e.message:e),process.exit(1)});process.on("uncaughtException",e=>{console.error(`
4
4
  Error:`,e.message),process.exit(1)});var D=P(import.meta.url),u=R(D),V=p(u,"specs.yaml"),M=k(V,"utf8"),l=C.parse(M);function y(e,t){return(t?[p(u,"lib",e,`${t}.js`),p(u,"lib",e,t,"index.js")]:[p(u,"lib",`${e}.js`),p(u,"lib",e,"index.js")]).some(i=>q(i))}function v(e){let t;e.type==="positional"?t=` ${e.name}`:(t=` --${e.name}`,e.alias&&e.alias.length===1&&(t+=`, -${e.alias}`));let n=26,i=t.length>=n?t+" ":t.padEnd(n),s=e.description;return e.options&&(Array.isArray(e.options)&&typeof e.options[0]=="string"?s+=` (options: ${e.options.join(", ")})`:s+=` (options: ${e.options.map(o=>o.value).join(", ")})`),e.default&&(s+=` [default: ${e.default}]`),e.required&&(s+=" [required]"),e["required-when"]&&(s+=` [required when: ${e["required-when"]}]`),e.multiple&&(s+=" [multiple values: comma-separated]"),e.type==="positional"&&(s+=" [positional argument]"),e.examples&&e.examples.length>0&&(s+=` (examples: ${e.examples.join(", ")})`),`${i}${s}`}function w(e){if(console.log(`
@@ -1,7 +1,7 @@
1
- import{readFileSync as Oe,statSync as Pe}from"fs";function g(e,n,t){for(let o of n)if(e[o]!==void 0)return e[o];return t}function se(e){return JSON.stringify(e,null,2)}function ae(e,n=" "){return Object.entries(e).map(([t,o])=>`${n}<${t}>${o}</${t}>`).join(`
2
- `)}function ce(e,n,t){let o=[`<${n}>`];return e.forEach(i=>{o.push(` <${t}>`),o.push(ae(i," ")),o.push(` </${t}>`)}),o.push(`</${n}>`),o.join(`
3
- `)}function F(e){if(e==null)return"";if(e instanceof Date)return z(e);if(typeof e=="string"){let n=new Date(e);if(!isNaN(n.getTime())&&e.includes("T"))return z(n)}return String(e)}function z(e){return new Intl.DateTimeFormat(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(e)}function de(e,n){return n.map(t=>{if(t.width)return t.width;let o=t.header.length,i=e.reduce((r,s)=>{let a=F(s[t.key]);return Math.max(r,a.length)},0);return Math.max(o,i)})}function pe(e,n){let t=[],o=de(e,n),i="\u250C"+o.map(c=>"\u2500".repeat(c+2)).join("\u252C")+"\u2510",r="\u251C"+o.map(c=>"\u2500".repeat(c+2)).join("\u253C")+"\u2524",s="\u2514"+o.map(c=>"\u2500".repeat(c+2)).join("\u2534")+"\u2518";t.push(`
4
- `+i);let a="\u2502 "+n.map((c,p)=>c.header.padEnd(o[p])).join(" \u2502 ")+" \u2502";return t.push(a),t.push(r),e.forEach(c=>{let p=n.map((m,y)=>{let C=F(c[m.key]);return m.align==="right"?C.padStart(o[y]):C.padEnd(o[y])});t.push("\u2502 "+p.join(" \u2502 ")+" \u2502")}),t.push(s+`
5
- `),t.join(`
6
- `)}function L(e,n,t,o,i){switch(n){case"json":return se(e);case"xml":return ce(e,t,o);default:return pe(e,i)}}import{S3Client as Qe}from"@aws-sdk/client-s3";import{fromIni as ye}from"@aws-sdk/credential-providers";import{homedir as j}from"os";import{join as h}from"path";import{readFileSync as ue,writeFileSync as ge,existsSync as S,mkdirSync as le}from"fs";import{loadSharedConfigFiles as fe}from"@smithy/shared-ini-file-loader";import{chmod as me}from"fs/promises";var u="https://t3.storage.dev",k="https://iam.storageapi.dev";var E=h(j(),".tigris"),w=h(E,"config.json");function he(){S(E)||le(E,{recursive:!0,mode:448})}function d(){if(S(w))try{let e=ue(w,"utf8");return JSON.parse(e)}catch{return{}}return{}}async function A(e){he(),ge(w,JSON.stringify(e,null,2),{mode:384});try{await me(w,384)}catch{}}async function v(e){let n=d();n.tokens=e,await A(n)}async function T(){return d().tokens||null}async function O(){let e=d();delete e.tokens,await A(e)}async function G(e){let n=d();n.organizations=e,await A(n)}function $(){return d().organizations||[]}function P(){return d().selectedOrganization||null}function U(){if(process.env.TIGRIS_STORAGE_ACCESS_KEY_ID||process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY){let o=process.env.TIGRIS_STORAGE_ACCESS_KEY_ID,i=process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY;if(!o||!i)return null;let r=process.env.TIGRIS_STORAGE_ENDPOINT||u;return{accessKeyId:o,secretAccessKey:i,endpoint:r}}let e=process.env.AWS_ACCESS_KEY_ID,n=process.env.AWS_SECRET_ACCESS_KEY;if(!e||!n)return null;let t=process.env.AWS_ENDPOINT_URL_S3||u;return{accessKeyId:e,secretAccessKey:n,endpoint:t}}function B(){if(!process.env.AWS_PROFILE)return!1;let e=h(j(),".aws");return S(h(e,"credentials"))||S(h(e,"config"))}async function W(e){try{let{configFile:n}=await fe(),t=n[e];return t?{endpoint:t.endpoint_url_s3||t.endpoint_url,iamEndpoint:t.endpoint_url_iam,region:t.region}:{}}catch{return{}}}function M(){let e=d();return e.temporaryCredentials||e.credentials||null}async function V(e){let n=d();n.loginMethod=e,await A(n)}function Y(){return d().loginMethod||null}import I from"axios";import Te from"open";function _(){let e=process.env.TIGRIS_ENV==="development",n=process.env.AUTH0_DOMAIN||e?"auth-dev.tigris.dev":"auth.tigris.dev",t=process.env.AUTH0_CLIENT_ID||e?"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF":"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",o=process.env.AUTH0_AUDIENCE||e?"https://tigris-api-dev":"https://tigris-os-api";return{domain:n,clientId:t,audience:o}}var q=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function J(){return process.env.TIGRIS_STORAGE_ENDPOINT||process.env.TIGRIS_IAM_ENDPOINT?{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||u,iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||k}:{endpoint:process.env.AWS_ENDPOINT_URL_S3||u,iamEndpoint:process.env.AWS_ENDPOINT_URL_IAM||k}}var b=class{config;baseUrl;constructor(){this.config=_(),this.baseUrl=`https://${this.config.domain}`}async login(n){let o=(await I.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;n?.onDeviceCode?.(o.user_code,o.verification_uri),await this.sleep(2e3);try{await Te(o.verification_uri_complete)}catch{}n?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await v(i),V("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(n,t){let i=0;for(;i<60;){i++;try{let s=(await I.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:n,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(r){if(I.isAxiosError(r)&&r.response){let s=r.response.data?.error;if(s==="authorization_pending"){await this.sleep(t*1e3);continue}if(s==="slow_down"){t+=5,await this.sleep(t*1e3);continue}throw new Error(r.response.data?.error_description||"Authentication failed")}throw r}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let n=await T();if(!n)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let t=300*1e3;return Date.now()+t>=n.expiresAt&&(n=await this.refreshAccessToken(n)),n.accessToken}async refreshAccessToken(n){let t=null;if(n?.refreshToken?t=n:t=await T(),!t)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await I.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 v(r),r}catch{throw await O(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let n=await T();if(!n||!n.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let t=n.idToken.split(".")[1],o=Buffer.from(t,"base64").toString("utf8");return JSON.parse(o)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(n){if(n)try{let t=n.split(".")[1],o=Buffer.from(t,"base64").toString("utf8"),r=JSON.parse(o)[q];if(!r)return;let s=r?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;G(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),$()}async logout(){await O()}async isAuthenticated(){return await T()!==null}sleep(n){return new Promise(t=>setTimeout(t,n))}},N=null;function H(){return N||(N=new b),N}var x=J(),Ce=_();async function Se(){return Y()}async function X(){if(B()){let o=process.env.AWS_PROFILE||"default",i=await W(o),r=await ye({profile:o})();return{accessKeyId:r.accessKeyId,secretAccessKey:r.secretAccessKey,endpoint:i.endpoint||x.endpoint||u,iamEndpoint:i.iamEndpoint||x.iamEndpoint}}let e=await Se();if(e==="oauth"){let i=await H().getAccessToken();if(!P())throw new Error('No organization selected. Please run "tigris orgs select" first.');return{sessionToken:i,accessKeyId:"",secretAccessKey:"",endpoint:x.endpoint,organizationId:P()??void 0,iamEndpoint:x.iamEndpoint,authDomain:Ce.domain}}if(e==="credentials"){let o=M();if(o)return{accessKeyId:o.accessKeyId,secretAccessKey:o.secretAccessKey,endpoint:o.endpoint}}let n=U();if(n)return{accessKeyId:n.accessKeyId,secretAccessKey:n.secretAccessKey,endpoint:n.endpoint};let t=M();if(t)return{accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey,endpoint:t.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{put as Me}from"@tigrisdata/storage";import{readFileSync as we,existsSync as Ae}from"fs";import{join as Q,dirname as _e}from"path";import{fileURLToPath as Ie}from"url";import*as Z from"yaml";var xe=Ie(import.meta.url),ke=_e(xe),D=null;function Ee(){let e=ke;for(let n=0;n<5;n++){let t=Q(e,"specs.yaml");if(Ae(t))return t;e=Q(e,"..")}throw new Error("Could not find specs.yaml")}function ve(){if(!D){let e=Ee(),n=we(e,"utf8");D=Z.parse(n)}return D}function ee(e,n){let o=ve().commands.find(i=>i.name===e);return o?n&&o.operations?o.operations.find(i=>i.name===n)||null:o:null}var ne={success:"\u2714",failure:"\u2716",hint:"\u2192"};function te(){return process.stdout.isTTY===!0}function R(e){let n=ee(e.command,e.operation);if(n)return n.messages}function K(e,n){let t=e;return t=t.replace(/\\n/g,`
7
- `),n&&(t=t.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let r=n[i];return r!==void 0?String(r):`{{${i}}}`})),t}function oe(e,n){if(!te())return;let t=R(e);t?.onStart&&console.log(K(t.onStart,n))}function ie(e,n){if(!te())return;let t=R(e);t?.onSuccess&&console.log(`${ne.success} ${K(t.onSuccess,n)}`)}function f(e,n,t){let o=R(e);o?.onFailure&&console.error(`${ne.failure} ${K(o.onFailure,t)}`),n&&console.error(` ${n}`)}function re(e,n){return{command:e,operation:n}}var l=re("objects","put");async function Ne(e){oe(l);let n=g(e,["bucket"]),t=g(e,["key"]),o=g(e,["file"]),i=g(e,["access","a","A"],"private"),r=g(e,["content-type","contentType","t","T"]),s=g(e,["format","f","F"],"table");n||(f(l,"Bucket name is required"),process.exit(1)),t||(f(l,"Object key is required"),process.exit(1)),o||(f(l,"File path is required"),process.exit(1));try{Pe(o)}catch{f(l,`File not found: ${o}`),process.exit(1)}let a=await X(),c=Oe(o),{data:p,error:m}=await Me(t,c,{access:i==="public"?"public":"private",contentType:r,config:{...a,bucket:n}});m&&(f(l,m.message),process.exit(1));let y=[{path:p.path,size:be(p.size),contentType:p.contentType||"-",modified:p.modified}],C=L(y,s,"objects","object",[{key:"path",header:"Path"},{key:"size",header:"Size"},{key:"contentType",header:"Content-Type"},{key:"modified",header:"Modified"}]);console.log(C),ie(l,{key:t,bucket:n})}function be(e){if(e===0)return"0 B";let n=["B","KB","MB","GB","TB"],t=Math.floor(Math.log(e)/Math.log(1024));return`${(e/Math.pow(1024,t)).toFixed(t>0?1:0)} ${n[t]}`}export{Ne as default};
1
+ import{createReadStream as Ke,statSync as ze}from"fs";import{Readable as pe}from"stream";function f(e,t,n){for(let o of t)if(e[o]!==void 0)return e[o];return n}function fe(e){return JSON.stringify(e,null,2)}function ge(e,t=" "){return Object.entries(e).map(([n,o])=>`${t}<${n}>${o}</${n}>`).join(`
2
+ `)}function me(e,t,n){let o=[`<${t}>`];return e.forEach(i=>{o.push(` <${n}>`),o.push(ge(i," ")),o.push(` </${n}>`)}),o.push(`</${t}>`),o.join(`
3
+ `)}function G(e){if(e==null)return"";if(e instanceof Date)return j(e);if(typeof e=="string"){let t=new Date(e);if(!isNaN(t.getTime())&&e.includes("T"))return j(t)}return String(e)}function j(e){return new Intl.DateTimeFormat(void 0,{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(e)}function he(e,t){return t.map(n=>{if(n.width)return n.width;let o=n.header.length,i=e.reduce((r,s)=>{let a=G(s[n.key]);return Math.max(r,a.length)},0);return Math.max(o,i)})}function Te(e,t){let n=[],o=he(e,t),i="\u250C"+o.map(c=>"\u2500".repeat(c+2)).join("\u252C")+"\u2510",r="\u251C"+o.map(c=>"\u2500".repeat(c+2)).join("\u253C")+"\u2524",s="\u2514"+o.map(c=>"\u2500".repeat(c+2)).join("\u2534")+"\u2518";n.push(`
4
+ `+i);let a="\u2502 "+t.map((c,d)=>c.header.padEnd(o[d])).join(" \u2502 ")+" \u2502";return n.push(a),n.push(r),e.forEach(c=>{let d=t.map((y,C)=>{let l=G(c[y.key]);return y.align==="right"?l.padStart(o[C]):l.padEnd(o[C])});n.push("\u2502 "+d.join(" \u2502 ")+" \u2502")}),n.push(s+`
5
+ `),n.join(`
6
+ `)}function U(e,t,n,o,i){switch(t){case"json":return fe(e);case"xml":return me(e,n,o);default:return Te(e,i)}}import{S3Client as it}from"@aws-sdk/client-s3";import{fromIni as xe}from"@aws-sdk/credential-providers";import{homedir as W}from"os";import{join as h}from"path";import{readFileSync as ye,writeFileSync as Ce,existsSync as w,mkdirSync as Se}from"fs";import{loadSharedConfigFiles as we}from"@smithy/shared-ini-file-loader";import{chmod as Ae}from"fs/promises";var u="https://t3.storage.dev",v="https://iam.storageapi.dev";var O=h(W(),".tigris"),A=h(O,"config.json");function _e(){w(O)||Se(O,{recursive:!0,mode:448})}function p(){if(w(A))try{let e=ye(A,"utf8");return JSON.parse(e)}catch{return{}}return{}}async function _(e){_e(),Ce(A,JSON.stringify(e,null,2),{mode:384});try{await Ae(A,384)}catch{}}async function P(e){let t=p();t.tokens=e,await _(t)}async function T(){return p().tokens||null}async function b(){let e=p();delete e.tokens,await _(e)}async function B(e){let t=p();t.organizations=e,await _(t)}function V(){return p().organizations||[]}function M(){return p().selectedOrganization||null}function Y(){if(process.env.TIGRIS_STORAGE_ACCESS_KEY_ID||process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY){let o=process.env.TIGRIS_STORAGE_ACCESS_KEY_ID,i=process.env.TIGRIS_STORAGE_SECRET_ACCESS_KEY;if(!o||!i)return null;let r=process.env.TIGRIS_STORAGE_ENDPOINT||u;return{accessKeyId:o,secretAccessKey:i,endpoint:r}}let e=process.env.AWS_ACCESS_KEY_ID,t=process.env.AWS_SECRET_ACCESS_KEY;if(!e||!t)return null;let n=process.env.AWS_ENDPOINT_URL_S3||u;return{accessKeyId:e,secretAccessKey:t,endpoint:n}}function q(){if(!process.env.AWS_PROFILE)return!1;let e=h(W(),".aws");return w(h(e,"credentials"))||w(h(e,"config"))}async function J(e){try{let{configFile:t}=await we(),n=t[e];return n?{endpoint:n.endpoint_url_s3||n.endpoint_url,iamEndpoint:n.endpoint_url_iam,region:n.region}:{}}catch{return{}}}function N(){let e=p();return e.temporaryCredentials||e.credentials||null}async function H(e){let t=p();t.loginMethod=e,await _(t)}function X(){return p().loginMethod||null}import x from"axios";import Ie from"open";function I(){let e=process.env.TIGRIS_ENV==="development",t=process.env.AUTH0_DOMAIN||e?"auth-dev.tigris.dev":"auth.tigris.dev",n=process.env.AUTH0_CLIENT_ID||e?"JdJVYIyw0O1uHi5L5OJH903qaWBgd3gF":"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",o=process.env.AUTH0_AUDIENCE||e?"https://tigris-api-dev":"https://tigris-os-api";return{domain:t,clientId:n,audience:o}}var Q=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function Z(){return process.env.TIGRIS_STORAGE_ENDPOINT||process.env.TIGRIS_IAM_ENDPOINT?{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||u,iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||v}:{endpoint:process.env.AWS_ENDPOINT_URL_S3||u,iamEndpoint:process.env.AWS_ENDPOINT_URL_IAM||v}}var D=class{config;baseUrl;constructor(){this.config=I(),this.baseUrl=`https://${this.config.domain}`}async login(t){let o=(await x.post(`${this.baseUrl}/oauth/device/code`,{client_id:this.config.clientId,audience:this.config.audience,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data;t?.onDeviceCode?.(o.user_code,o.verification_uri),await this.sleep(2e3);try{await Ie(o.verification_uri_complete)}catch{}t?.onWaiting?.();let i=await this.pollForToken(o.device_code,o.interval||5);await P(i),H("oauth"),await this.extractAndStoreOrganizations(i.idToken)}async pollForToken(t,n){let i=0;for(;i<60;){i++;try{let s=(await x.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,device_code:t,grant_type:"urn:ietf:params:oauth:grant-type:device_code"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,a=Date.now()+(s.expires_in||3600)*1e3;return{accessToken:s.access_token,refreshToken:s.refresh_token,idToken:s.id_token,expiresAt:a}}catch(r){if(x.isAxiosError(r)&&r.response){let s=r.response.data?.error;if(s==="authorization_pending"){await this.sleep(n*1e3);continue}if(s==="slow_down"){n+=5,await this.sleep(n*1e3);continue}throw new Error(r.response.data?.error_description||"Authentication failed")}throw r}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let t=await T();if(!t)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let n=300*1e3;return Date.now()+n>=t.expiresAt&&(t=await this.refreshAccessToken(t)),t.accessToken}async refreshAccessToken(t){let n=null;if(t?.refreshToken?n=t:n=await T(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let i=(await x.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:n.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,r={accessToken:i.access_token,refreshToken:i.refresh_token||n.refreshToken,idToken:i.id_token||n.idToken,expiresAt:Date.now()+(i.expires_in||3600)*1e3};return await P(r),r}catch{throw await b(),new Error('Token refresh failed. Please run "tigris login" to re-authenticate.')}}async getIdTokenClaims(){let t=await T();if(!t||!t.idToken)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');try{let n=t.idToken.split(".")[1],o=Buffer.from(n,"base64").toString("utf8");return JSON.parse(o)}catch{throw new Error("Failed to decode ID token")}}async extractAndStoreOrganizations(t){if(t)try{let n=t.split(".")[1],o=Buffer.from(n,"base64").toString("utf8"),r=JSON.parse(o)[Q];if(!r)return;let s=r?.ns?.map(a=>typeof a=="object"&&a!==null?{id:a.id,name:a.name,displayName:a.name}:{id:a,name:a,displayName:a})||[];if(s.length===0)return;B(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),V()}async logout(){await b()}async isAuthenticated(){return await T()!==null}sleep(t){return new Promise(n=>setTimeout(n,t))}},R=null;function ee(){return R||(R=new D),R}var k=Z(),ke=I();async function Ee(){return X()}async function te(){if(q()){let o=process.env.AWS_PROFILE||"default",i=await J(o),r=await xe({profile:o})();return{accessKeyId:r.accessKeyId,secretAccessKey:r.secretAccessKey,endpoint:i.endpoint||k.endpoint||u,iamEndpoint:i.iamEndpoint||k.iamEndpoint}}let e=await Ee();if(e==="oauth"){let i=await ee().getAccessToken();if(!M())throw new Error('No organization selected. Please run "tigris orgs select" first.');return{sessionToken:i,accessKeyId:"",secretAccessKey:"",endpoint:k.endpoint,organizationId:M()??void 0,iamEndpoint:k.iamEndpoint,authDomain:ke.domain}}if(e==="credentials"){let o=N();if(o)return{accessKeyId:o.accessKeyId,secretAccessKey:o.secretAccessKey,endpoint:o.endpoint}}let t=Y();if(t)return{accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey,endpoint:t.endpoint};let n=N();if(n)return{accessKeyId:n.accessKeyId,secretAccessKey:n.secretAccessKey,endpoint:n.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}import{put as Fe}from"@tigrisdata/storage";import{readFileSync as ve,existsSync as Oe}from"fs";import{join as ne,dirname as Pe}from"path";import{fileURLToPath as be}from"url";import*as oe from"yaml";var Me=be(import.meta.url),Ne=Pe(Me),K=null;function Re(){let e=Ne;for(let t=0;t<5;t++){let n=ne(e,"specs.yaml");if(Oe(n))return n;e=ne(e,"..")}throw new Error("Could not find specs.yaml")}function De(){if(!K){let e=Re(),t=ve(e,"utf8");K=oe.parse(t)}return K}function ie(e,t){let o=De().commands.find(i=>i.name===e);return o?t&&o.operations?o.operations.find(i=>i.name===t)||null:o:null}var re={success:"\u2714",failure:"\u2716",hint:"\u2192"};function se(){return process.stdout.isTTY===!0}function z(e){let t=ie(e.command,e.operation);if(t)return t.messages}function F(e,t){let n=e;return n=n.replace(/\\n/g,`
7
+ `),t&&(n=n.replace(/\{\{(\w+)\}\}/g,(o,i)=>{let r=t[i];return r!==void 0?String(r):`{{${i}}}`})),n}function ae(e,t){if(!se())return;let n=z(e);n?.onStart&&console.log(F(n.onStart,t))}function ce(e,t){if(!se())return;let n=z(e);n?.onSuccess&&console.log(`${re.success} ${F(n.onSuccess,t)}`)}function m(e,t,n){let o=z(e);o?.onFailure&&console.error(`${re.failure} ${F(o.onFailure,n)}`),t&&console.error(` ${t}`)}function de(e,t){return{command:e,operation:t}}var g=de("objects","put");async function Le(e){ae(g);let t=f(e,["bucket"]),n=f(e,["key"]),o=f(e,["file"]),i=f(e,["access","a","A"],"private"),r=f(e,["content-type","contentType","t","T"]),s=f(e,["format","f","F"],"table");t||(m(g,"Bucket name is required"),process.exit(1)),n||(m(g,"Object key is required"),process.exit(1));let a=!process.stdin.isTTY;!o&&!a&&(m(g,"File path is required (or pipe data via stdin)"),process.exit(1));let c,d;if(o){try{d=ze(o).size}catch{m(g,`File not found: ${o}`),process.exit(1)}let S=Ke(o);c=pe.toWeb(S)}else c=pe.toWeb(process.stdin);let y=await te(),C=!o||d!==void 0&&d>100*1024*1024,{data:l,error:L}=await Fe(n,c,{access:i==="public"?"public":"private",contentType:r,multipart:C,onUploadProgress:({loaded:S,percentage:$})=>{d!==void 0&&d>0?process.stdout.write(`\rUploading: ${E(S)} / ${E(d)} (${$}%)`):process.stdout.write(`\rUploading: ${E(S)}`)},config:{...y,bucket:t}});process.stdout.write("\r"+" ".repeat(60)+"\r"),L&&(m(g,L.message),process.exit(1));let ue=[{path:l.path,size:E(l.size??d??0),contentType:l.contentType||"-",modified:l.modified}],le=U(ue,s,"objects","object",[{key:"path",header:"Path"},{key:"size",header:"Size"},{key:"contentType",header:"Content-Type"},{key:"modified",header:"Modified"}]);console.log(le),ce(g,{key:n,bucket:t})}function E(e){if(e===0)return"0 B";let t=["B","KB","MB","GB","TB"],n=Math.floor(Math.log(e)/Math.log(1024));return`${(e/Math.pow(1024,n)).toFixed(n>0?1:0)} ${t[n]}`}export{Le as default};
package/dist/specs.yaml CHANGED
@@ -680,7 +680,6 @@ commands:
680
680
  - name: file
681
681
  description: Path to the file to upload
682
682
  type: positional
683
- required: true
684
683
  examples:
685
684
  - ./my-file.txt
686
685
  - name: access
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tigrisdata/cli",
3
- "version": "2.5.0",
3
+ "version": "2.6.0",
4
4
  "description": "Command line interface for Tigris object storage",
5
5
  "type": "module",
6
6
  "exports": {
@@ -81,7 +81,7 @@
81
81
  "@aws-sdk/credential-providers": "^3.981.0",
82
82
  "@smithy/shared-ini-file-loader": "^4.4.3",
83
83
  "@tigrisdata/iam": "^1.1.0",
84
- "@tigrisdata/storage": "^2.12.0",
84
+ "@tigrisdata/storage": "^2.12.2",
85
85
  "axios": "^1.12.2",
86
86
  "commander": "^11.0.0",
87
87
  "enquirer": "^2.4.1",