@tigrisdata/cli 2.1.1 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +381 -1
  2. package/dist/auth/client.js +1 -1
  3. package/dist/auth/config.js +1 -1
  4. package/dist/auth/s3-client.js +1 -1
  5. package/dist/auth/storage.js +1 -1
  6. package/dist/cli.js +11 -8
  7. package/dist/index.js +11 -8
  8. package/dist/lib/buckets/create.js +2 -2
  9. package/dist/lib/buckets/delete.js +2 -0
  10. package/dist/lib/buckets/get.js +7 -0
  11. package/dist/lib/buckets/list.js +6 -6
  12. package/dist/lib/buckets/set.js +2 -0
  13. package/dist/lib/configure/index.js +2 -2
  14. package/dist/lib/cp.js +1 -1
  15. package/dist/lib/credentials/test.js +2 -0
  16. package/dist/lib/forks/create.js +2 -0
  17. package/dist/lib/forks/list.js +7 -0
  18. package/dist/lib/login/credentials.js +2 -2
  19. package/dist/lib/login/oauth.js +5 -0
  20. package/dist/lib/login/select.js +5 -5
  21. package/dist/lib/logout.js +2 -2
  22. package/dist/lib/ls.js +6 -1
  23. package/dist/lib/mk.js +1 -1
  24. package/dist/lib/mv.js +1 -1
  25. package/dist/lib/objects/delete.js +2 -0
  26. package/dist/lib/objects/get.js +2 -0
  27. package/dist/lib/objects/list.js +7 -0
  28. package/dist/lib/objects/put.js +7 -0
  29. package/dist/lib/organizations/create.js +5 -0
  30. package/dist/lib/organizations/list.js +10 -0
  31. package/dist/lib/organizations/select.js +9 -0
  32. package/dist/lib/rm.js +1 -1
  33. package/dist/lib/snapshots/list.js +7 -0
  34. package/dist/lib/snapshots/take.js +2 -0
  35. package/dist/lib/touch.js +1 -0
  36. package/dist/lib/whoami.js +3 -3
  37. package/dist/specs.yaml +311 -259
  38. package/dist/utils/messages.js +2 -2
  39. package/dist/utils/options.js +1 -1
  40. package/dist/utils/path.js +1 -1
  41. package/package.json +14 -4
  42. package/dist/lib/login/ui.js +0 -5
  43. package/dist/lib/orgs/create.js +0 -2
  44. package/dist/lib/orgs/list.js +0 -7
  45. package/dist/lib/orgs/select.js +0 -6
  46. /package/dist/lib/{stat.js → _stat.js} +0 -0
package/README.md CHANGED
@@ -10,7 +10,387 @@ npm install -g @tigrisdata/cli
10
10
 
11
11
  ## Usage
12
12
 
13
- WIP
13
+ ```
14
+ tigris <command> [flags]
15
+ ```
16
+
17
+ Run `tigris help` to see all available commands, or `tigris <command> help` for details on a specific command.
18
+
19
+ ### Core Commands
20
+
21
+ - `tigris ls [path]` - List buckets or objects in a bucket or path
22
+ - `tigris mk <path>` - Create a bucket or a folder in a bucket
23
+ - `tigris touch <path>` - Create an empty object in a bucket
24
+ - `tigris cp <src> <dest>` - Copy a folder or an object
25
+ - `tigris mv <src> <dest>` - Move a folder or an object
26
+ - `tigris rm <path>` - Remove a bucket or a folder in a bucket or an object in a bucket or path
27
+
28
+ ### Authentication
29
+
30
+ - `tigris login` - Start a session. Use OAuth (default) or temporary credentials that override your saved config
31
+ - `tigris logout` - End your session. Clears login state but keeps credentials from 'configure'
32
+ - `tigris whoami` - Show information about the current user
33
+ - `tigris configure` - Save credentials permanently. After running this, all commands work automatically
34
+
35
+ ### Resources
36
+
37
+ - `tigris organizations` - Manage organizations
38
+ - `tigris buckets` - Manage buckets
39
+ - `tigris forks` - Manage forks
40
+ - `tigris snapshots` - Manage snapshots
41
+ - `tigris objects` - Manage objects
42
+
43
+ ---
44
+
45
+ ## Core Commands
46
+
47
+ ### `ls` | `list`
48
+
49
+ List buckets or objects in a bucket or path
50
+
51
+ ```
52
+ tigris ls [path]
53
+ ```
54
+
55
+ **Examples:**
56
+ ```bash
57
+ tigris ls my-bucket
58
+ tigris ls my-bucket/my-path
59
+ ```
60
+
61
+ ### `mk` | `create`
62
+
63
+ Create a bucket or a folder in a bucket
64
+
65
+ ```
66
+ tigris mk <path>
67
+ ```
68
+
69
+ **Examples:**
70
+ ```bash
71
+ tigris mk my-bucket
72
+ tigris mk my-bucket/my-path
73
+ ```
74
+
75
+ ### `touch`
76
+
77
+ Create an empty object in a bucket
78
+
79
+ ```
80
+ tigris touch <path>
81
+ ```
82
+
83
+ **Examples:**
84
+ ```bash
85
+ tigris touch my-bucket/my-file.txt
86
+ ```
87
+
88
+ ### `cp` | `copy`
89
+
90
+ Copy a folder or an object
91
+
92
+ ```
93
+ tigris cp <src> <dest>
94
+ ```
95
+
96
+ **Examples:**
97
+ ```bash
98
+ tigris cp bucket/file.txt bucket/copy.txt
99
+ tigris cp bucket/folder/ other-bucket/folder/
100
+ ```
101
+
102
+ ### `mv` | `move`
103
+
104
+ Move a folder or an object
105
+
106
+ ```
107
+ tigris mv <src> <dest> [flags]
108
+ ```
109
+
110
+ | Flag | Description |
111
+ |------|-------------|
112
+ | `-f, --force` | Skip confirmation prompt |
113
+
114
+ **Examples:**
115
+ ```bash
116
+ tigris mv bucket/file.txt bucket/copy.txt
117
+ tigris mv bucket/folder/ other-bucket/folder/
118
+ ```
119
+
120
+ ### `rm` | `remove`
121
+
122
+ Remove a bucket or a folder in a bucket or an object in a bucket or path
123
+
124
+ ```
125
+ tigris rm <path> [flags]
126
+ ```
127
+
128
+ | Flag | Description |
129
+ |------|-------------|
130
+ | `-f, --force` | Skip confirmation prompt |
131
+
132
+ **Examples:**
133
+ ```bash
134
+ tigris rm my-bucket
135
+ tigris rm my-bucket/my-path
136
+ tigris rm my-bucket/my-path/*
137
+ ```
138
+
139
+ ## Authentication
140
+
141
+ ### `login` | `l`
142
+
143
+ Start a session. Use OAuth (default) or temporary credentials that override your saved config
144
+
145
+ | Command | Description |
146
+ |---------|-------------|
147
+ | `login select` | Choose how to login - OAuth (browser) or credentials (access key) |
148
+ | `login oauth` (o) | Login via browser (OAuth2 device flow). Best for interactive use |
149
+ | `login credentials` (c) | Login with access key + secret. Creates a temporary session (cleared on logout) |
150
+
151
+ #### `login select`
152
+
153
+ ```
154
+ tigris login select
155
+ ```
156
+
157
+ #### `login oauth`
158
+
159
+ ```
160
+ tigris login oauth
161
+ ```
162
+
163
+ #### `login credentials`
164
+
165
+ ```
166
+ tigris login credentials [flags]
167
+ ```
168
+
169
+ | Flag | Description |
170
+ |------|-------------|
171
+ | `-key, --access-key` | Your access key ID (will prompt if not provided) |
172
+ | `-secret, --access-secret` | Your secret access key (will prompt if not provided) |
173
+
174
+ ### `logout`
175
+
176
+ End your session. Clears login state but keeps credentials from 'configure'
177
+
178
+ ```
179
+ tigris logout
180
+ ```
181
+
182
+ ### `whoami` | `w`
183
+
184
+ Show information about the current user
185
+
186
+ ```
187
+ tigris whoami
188
+ ```
189
+
190
+ ### `configure` | `c`
191
+
192
+ Save credentials permanently. After running this, all commands work automatically
193
+
194
+ ```
195
+ tigris configure [flags]
196
+ ```
197
+
198
+ | Flag | Description |
199
+ |------|-------------|
200
+ | `-key, --access-key` | Your Tigris access key ID |
201
+ | `-secret, --access-secret` | Your Tigris secret access key |
202
+ | `-e, --endpoint` | Tigris API endpoint (default: https://t3.storage.dev) |
203
+
204
+ ## Resources
205
+
206
+ ### `organizations` | `orgs`
207
+
208
+ Manage organizations
209
+
210
+ | Command | Description |
211
+ |---------|-------------|
212
+ | `organizations list` (l) | List organizations |
213
+ | `organizations create` (c) | Create organization |
214
+ | `organizations select` (s) | Select the organization to use |
215
+
216
+ #### `organizations list`
217
+
218
+ ```
219
+ tigris organizations list [flags]
220
+ ```
221
+
222
+ | Flag | Description |
223
+ |------|-------------|
224
+ | `-f, --format` | Format (default: select) |
225
+ | `-i, --select` | Interactive selection mode |
226
+
227
+ #### `organizations create`
228
+
229
+ ```
230
+ tigris organizations create <name>
231
+ ```
232
+
233
+ #### `organizations select`
234
+
235
+ ```
236
+ tigris organizations select <name>
237
+ ```
238
+
239
+ ### Buckets
240
+
241
+ Buckets are containers for objects. You can also create forks and snapshots of buckets.
242
+
243
+ #### `buckets` | `b`
244
+
245
+ Manage buckets
246
+
247
+ | Command | Description |
248
+ |---------|-------------|
249
+ | `buckets list` (l) | List buckets |
250
+ | `buckets create` (c) | Create bucket |
251
+ | `buckets get` (g) | Get bucket details |
252
+ | `buckets delete` (d) | Delete bucket |
253
+
254
+ ##### `buckets list`
255
+
256
+ ```
257
+ tigris buckets list [flags]
258
+ ```
259
+
260
+ | Flag | Description |
261
+ |------|-------------|
262
+ | `-f, --format` | Format (default: table) |
263
+
264
+ ##### `buckets create`
265
+
266
+ ```
267
+ tigris buckets create [name] [flags]
268
+ ```
269
+
270
+ | Flag | Description |
271
+ |------|-------------|
272
+ | `-a, --access` | Access level (default: private) |
273
+ | `-s, --enable-snapshots` | Enable snapshots for the bucket (default: false) |
274
+ | `-t, --default-tier` | Choose the default tier for the bucket (default: STANDARD) |
275
+ | `-c, --consistency` | Choose the consistency level for the bucket (default: default) |
276
+ | `-r, --region` | Region (default: global) |
277
+
278
+ ##### `buckets get`
279
+
280
+ ```
281
+ tigris buckets get <name>
282
+ ```
283
+
284
+ ##### `buckets delete`
285
+
286
+ ```
287
+ tigris buckets delete <name>
288
+ ```
289
+
290
+ #### `forks` | `f`
291
+
292
+ Manage forks
293
+
294
+ | Command | Description |
295
+ |---------|-------------|
296
+ | `forks list` (l) | List forks of a bucket |
297
+ | `forks create` (c) | Create a fork of a bucket |
298
+
299
+ ##### `forks list`
300
+
301
+ ```
302
+ tigris forks list <name> [flags]
303
+ ```
304
+
305
+ | Flag | Description |
306
+ |------|-------------|
307
+ | `-f, --format` | Output format (default: table) |
308
+
309
+ ##### `forks create`
310
+
311
+ ```
312
+ tigris forks create <name> <fork-name> [flags]
313
+ ```
314
+
315
+ | Flag | Description |
316
+ |------|-------------|
317
+ | `-s, --snapshot` | Create fork from a specific snapshot |
318
+
319
+ #### `snapshots` | `s`
320
+
321
+ Manage snapshots
322
+
323
+ | Command | Description |
324
+ |---------|-------------|
325
+ | `snapshots list` (l) | List snapshots of a bucket |
326
+ | `snapshots take` (t) | Take a snapshot of a bucket |
327
+
328
+ ##### `snapshots list`
329
+
330
+ ```
331
+ tigris snapshots list <name> [flags]
332
+ ```
333
+
334
+ | Flag | Description |
335
+ |------|-------------|
336
+ | `-f, --format` | Output format (default: table) |
337
+
338
+ ##### `snapshots take`
339
+
340
+ ```
341
+ tigris snapshots take <name> [snapshot-name]
342
+ ```
343
+
344
+ ### `objects` | `o`
345
+
346
+ Manage objects
347
+
348
+ | Command | Description |
349
+ |---------|-------------|
350
+ | `objects list` (l) | List objects in a bucket |
351
+ | `objects get` (g) | Get an object |
352
+ | `objects put` (p) | Upload an object |
353
+ | `objects delete` (d) | Delete an object |
354
+
355
+ #### `objects list`
356
+
357
+ ```
358
+ tigris objects list <bucket> [flags]
359
+ ```
360
+
361
+ | Flag | Description |
362
+ |------|-------------|
363
+ | `-p, --prefix` | Filter objects by prefix |
364
+ | `-f, --format` | Output format (default: table) |
365
+
366
+ #### `objects get`
367
+
368
+ ```
369
+ tigris objects get <bucket> <key> [flags]
370
+ ```
371
+
372
+ | Flag | Description |
373
+ |------|-------------|
374
+ | `-o, --output` | Output file path (if not specified, prints to stdout) |
375
+ | `-m, --mode` | Response mode (auto-detected from extension if not specified) |
376
+
377
+ #### `objects put`
378
+
379
+ ```
380
+ tigris objects put <bucket> <key> <file> [flags]
381
+ ```
382
+
383
+ | Flag | Description |
384
+ |------|-------------|
385
+ | `-a, --access` | Access level (default: private) |
386
+ | `-t, --content-type` | Content type |
387
+ | `-f, --format` | Output format (default: table) |
388
+
389
+ #### `objects delete`
390
+
391
+ ```
392
+ tigris objects delete <bucket> <key>
393
+ ```
14
394
 
15
395
  ## License
16
396
 
@@ -1 +1 @@
1
- import l from"axios";import N from"open";function k(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var w=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";import{homedir as A}from"os";import{join as C}from"path";import{readFileSync as x,writeFileSync as S,existsSync as y,mkdirSync as O}from"fs";import{chmod as P}from"fs/promises";var p=C(A(),".tigris"),g=C(p,"config.json");function E(){y(p)||O(p,{recursive:!0,mode:448})}function c(){if(y(g))try{let n=x(g,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function f(n){E(),S(g,JSON.stringify(n,null,2),{mode:384});try{await P(g,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 I(n){let e=c();e.loginMethod=n,await f(e)}var T=class{config;baseUrl;constructor(){this.config=k(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(await l.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),I("oauth"),await this.extractAndStoreOrganizations(r.idToken)}async pollForToken(e,t){let r=0;for(;r<60;){r++;try{let s=(await l.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(l.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 l.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)[w];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 J(){return h||(h=new T),h}export{T as TigrisAuthClient,J as getAuthClient};
1
+ import f from"axios";import N from"open";function k(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var w=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";import{homedir as x}from"os";import{join as C}from"path";import{readFileSync as A,writeFileSync as S,existsSync as y,mkdirSync as P}from"fs";import{chmod as O}from"fs/promises";var p=C(x(),".tigris"),g=C(p,"config.json");function E(){y(p)||P(p,{recursive:!0,mode:448})}function c(){if(y(g))try{let t=A(g,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function l(t){E(),S(g,JSON.stringify(t,null,2),{mode:384});try{await O(g,384)}catch{}}async function u(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 _(t){let e=c();e.organizations=t,await l(e)}function v(){return c().organizations||[]}async function I(t){let e=c();e.loginMethod=t,await l(e)}var T=class{config;baseUrl;constructor(){this.config=k(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(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?.(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),I("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(o){if(f.isAxiosError(o)&&o.response){let s=o.response.data?.error;if(s==="authorization_pending"){await this.sleep(n*1e3);continue}if(s==="slow_down"){n+=5,await this.sleep(n*1e3);continue}throw new Error(o.response.data?.error_description||"Authentication failed")}throw o}}throw new Error("Authentication timed out. Please try again.")}async getAccessToken(){let e=await d();if(!e)throw new Error('Not authenticated. Please run "tigris login" to authenticate.');let n=300*1e3;return Date.now()+n>=e.expiresAt&&(e=await this.refreshAccessToken(e)),e.accessToken}async refreshAccessToken(e){let n=null;if(e?.refreshToken?n=e:n=await d(),!n)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let r=(await 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,o={accessToken:r.access_token,refreshToken:r.refresh_token||n.refreshToken,idToken:r.id_token||n.idToken,expiresAt:Date.now()+(r.expires_in||3600)*1e3};return await 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 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)[w];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(n=>setTimeout(n,e))}},h=null;function J(){return h||(h=new T),h}export{T as TigrisAuthClient,J as getAuthClient};
@@ -1 +1 @@
1
- function i(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var t=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function e(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_STORAGE_IAM_ENDPOINT||"https://iam.storageapi.dev"}}export{t as TIGRIS_CLAIMS_NAMESPACE,i as getAuth0Config,e as getTigrisConfig};
1
+ function i(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var t=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function e(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||"https://iam.storageapi.dev"}}export{t as TIGRIS_CLAIMS_NAMESPACE,i as getAuth0Config,e as getTigrisConfig};
@@ -1 +1 @@
1
- import{S3Client as z}from"@aws-sdk/client-s3";import{homedir as D}from"os";import{join as I}from"path";import{readFileSync as b,writeFileSync as K,existsSync as v,mkdirSync as R}from"fs";import{chmod as L}from"fs/promises";var m=I(D(),".tigris"),g=I(m,"config.json");function G(){v(m)||R(m,{recursive:!0,mode:448})}function c(){if(v(g))try{let t=b(g,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function l(t){G(),K(g,JSON.stringify(t,null,2),{mode:384});try{await L(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 w(){let t=c();delete t.tokens,await l(t)}async function x(t){let e=c();e.organizations=t,await l(e)}function S(){return c().organizations||[]}function f(){return c().selectedOrganization||null}function T(){let t=c();return t.temporaryCredentials||t.credentials||null}async function P(t){let e=c();e.loginMethod=t,await l(e)}function O(){return c().loginMethod||null}import p from"axios";import U from"open";function u(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var E=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function N(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_STORAGE_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var k=class{config;baseUrl;constructor(){this.config=u(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(await p.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 U(i.verification_uri_complete)}catch{}e?.onWaiting?.();let s=await this.pollForToken(i.device_code,i.interval||5);await h(s),P("oauth"),await this.extractAndStoreOrganizations(s.idToken)}async pollForToken(e,n){let s=0;for(;s<60;){s++;try{let a=(await p.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(p.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 p.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 w(),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)[E];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;x(a)}catch{}}async getOrganizations(){return await this.getAccessToken(),S()}async logout(){await w()}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},y=null;function C(){return y||(y=new k),y}var _=N(),F=u();async function A(){return O()}async function oe(){let t=await A();if(!t)throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.');if(t==="oauth"){let i=await C().getAccessToken();if(!f())throw new Error('No organization selected. Please run "tigris orgs select" first.');let o=_.endpoint,a=_.iamEndpoint,r=F.domain;return{sessionToken:i,accessKeyId:"",secretAccessKey:"",endpoint:o,organizationId:f()??void 0,iamEndpoint:a,authDomain:r}}let e=T();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 re(){let t=await A();if(!t)throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.');if(t==="oauth"){let n=await C().getAccessToken(),i=f();if(!i)throw new Error('No organization selected. Please run "tigris orgs select" first.');let s=_.endpoint,o=new z({region:"auto",endpoint:s,credentials:{sessionToken:n,accessKeyId:"",secretAccessKey:""}});return o.middlewareStack.add(a=>async r=>{let M=r.request;return M.headers["x-Tigris-Namespace"]=i,await a(r)},{name:"x-Tigris-Namespace-Middleware",step:"build",override:!0}),o}else{let e=T();if(!e)throw new Error('No credentials found. Please run "tigris configure" first.');return new z({region:"auto",endpoint:e.endpoint,credentials:{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey}})}}async function se(){return await A()!==null}export{A as getLoginMethod,re as getS3Client,oe as getStorageConfig,se as isAuthenticated};
1
+ import{S3Client as M}from"@aws-sdk/client-s3";import{homedir as b}from"os";import{join as v}from"path";import{readFileSync as K,writeFileSync as R,existsSync as x,mkdirSync as L}from"fs";import{chmod as U}from"fs/promises";var h=v(b(),".tigris"),g=v(h,"config.json");function F(){x(h)||L(h,{recursive:!0,mode:448})}function c(){if(x(g))try{let n=K(g,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function l(n){F(),R(g,JSON.stringify(n,null,2),{mode:384});try{await U(g,384)}catch{}}async function T(n){let e=c();e.tokens=n,await l(e)}async function d(){return c().tokens||null}async function w(){let n=c();delete n.tokens,await l(n)}async function S(n){let e=c();e.organizations=n,await l(e)}function P(){return c().organizations||[]}function f(){return c().selectedOrganization||null}function u(){let n=c();return n.temporaryCredentials||n.credentials||null}async function O(n){let e=c();e.loginMethod=n,await l(e)}function E(){return c().loginMethod||null}import m from"axios";import G from"open";function p(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var N=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function z(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var C=class{config;baseUrl;constructor(){this.config=p(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(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?.(i.user_code,i.verification_uri),await this.sleep(2e3);try{await G(i.verification_uri_complete)}catch{}e?.onWaiting?.();let r=await this.pollForToken(i.device_code,i.interval||5);await T(r),O("oauth"),await this.extractAndStoreOrganizations(r.idToken)}async pollForToken(e,t){let r=0;for(;r<60;){r++;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(o){if(m.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 m.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:t.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,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 T(o),o}catch{throw await w(),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)[N];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(s)}catch{}}async getOrganizations(){return await this.getAccessToken(),P()}async logout(){await w()}async isAuthenticated(){return await d()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},y=null;function k(){return y||(y=new C),y}var _=z(),j=p();async function A(){return E()}async function re(){if(await A()==="oauth"){let i=await k().getAccessToken();if(!f())throw new Error('No organization selected. Please run "tigris orgs select" first.');let o=_.endpoint,s=_.iamEndpoint,a=j.domain;return{sessionToken:i,accessKeyId:"",secretAccessKey:"",endpoint:o,organizationId:f()??void 0,iamEndpoint:s,authDomain:a}}let e=u();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}async function se(){if(await A()==="oauth"){let i=await k().getAccessToken(),r=f();if(!r)throw new Error('No organization selected. Please run "tigris orgs select" first.');let o=_.endpoint,s=new M({region:"auto",endpoint:o,credentials:{sessionToken:i,accessKeyId:"",secretAccessKey:""}});return s.middlewareStack.add(a=>async I=>{let D=I.request;return D.headers["x-Tigris-Namespace"]=r,await a(I)},{name:"x-Tigris-Namespace-Middleware",step:"build",override:!0}),s}let e=u();if(e)return new M({region:"auto",endpoint:e.endpoint,credentials:{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey}});throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}async function ae(){return await A()!==null?!0:u()!==null}export{A as getLoginMethod,se as getS3Client,re as getStorageConfig,ae as isAuthenticated};
@@ -1 +1 @@
1
- import{homedir as c}from"os";import{join as s}from"path";import{readFileSync as g,writeFileSync as f,existsSync as a,mkdirSync as l}from"fs";import{chmod as d}from"fs/promises";var r=s(c(),".tigris"),t=s(r,"config.json");function u(){a(r)||l(r,{recursive:!0,mode:448})}function e(){if(a(t))try{let n=g(t,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function i(n){u(),f(t,JSON.stringify(n,null,2),{mode:384});try{await d(t,384)}catch{}}async function x(n){let o=e();o.tokens=n,await i(o)}async function O(){return e().tokens||null}async function v(){let n=e();delete n.tokens,await i(n)}async function z(n){let o=e();o.organizations=n,await i(o)}function w(){return e().organizations||[]}async function h(n){let o=e();o.selectedOrganization=n,await i(o)}function k(){return e().selectedOrganization||null}function P(){let n=e();return n.temporaryCredentials||n.credentials||null}async function S(n){let o=e();o.credentials=n,await i(o)}async function T(n){let o=e();o.temporaryCredentials=n,await i(o)}async function I(){let n=e();delete n.temporaryCredentials,await i(n)}async function F(){let n=e();delete n.credentials,await i(n)}async function M(n){let o=e();o.loginMethod=n,await i(o)}function N(){return e().loginMethod||null}async function j(){let o=e().credentials;await i({credentials:o})}export{j as clearAllData,F as clearCredentials,I as clearTemporaryCredentials,v as clearTokens,P as getCredentials,N as getLoginMethod,w as getOrganizations,k as getSelectedOrganization,O as getTokens,S as storeCredentials,M as storeLoginMethod,z as storeOrganizations,h as storeSelectedOrganization,T as storeTemporaryCredentials,x as storeTokens};
1
+ import{homedir as c}from"os";import{join as s}from"path";import{readFileSync as g,writeFileSync as f,existsSync as a,mkdirSync as l}from"fs";import{chmod as d}from"fs/promises";var r=s(c(),".tigris"),i=s(r,"config.json");function u(){a(r)||l(r,{recursive:!0,mode:448})}function e(){if(a(i))try{let n=g(i,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function t(n){u(),f(i,JSON.stringify(n,null,2),{mode:384});try{await d(i,384)}catch{}}async function x(n){let o=e();o.tokens=n,await t(o)}async function v(){return e().tokens||null}async function O(){let n=e();delete n.tokens,await t(n)}async function z(n){let o=e();o.organizations=n,await t(o)}function w(){return e().organizations||[]}async function S(n){let o=e();o.selectedOrganization=n,await t(o)}function h(){return e().selectedOrganization||null}function k(){let n=e();return n.temporaryCredentials||n.credentials||null}function P(){return e().credentials||null}async function T(n){let o=e();o.credentials=n,await t(o)}async function I(n){let o=e();o.temporaryCredentials=n,await t(o)}async function F(){let n=e();delete n.temporaryCredentials,await t(n)}async function M(){let n=e();delete n.credentials,await t(n)}async function N(n){let o=e();o.loginMethod=n,await t(o)}function j(){return e().loginMethod||null}async function D(){let o=e().credentials;await t({credentials:o})}export{D as clearAllData,M as clearCredentials,F as clearTemporaryCredentials,O as clearTokens,k as getCredentials,j as getLoginMethod,w as getOrganizations,P as getSavedCredentials,h as getSelectedOrganization,v as getTokens,T as storeCredentials,N as storeLoginMethod,z as storeOrganizations,S as storeSelectedOrganization,I as storeTemporaryCredentials,x as storeTokens};
package/dist/cli.js CHANGED
@@ -1,10 +1,13 @@
1
1
  #!/usr/bin/env node
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.1";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}
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.3.0";process.on("unhandledRejection",e=>{(e===""||e===void 0)&&(console.error(`
3
+ Operation cancelled`),process.exit(1)),console.error(`
4
+ Error:`,e instanceof Error?e.message:e),process.exit(1)});process.on("uncaughtException",e=>{console.error(`
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 A(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(`
6
+ ${l.name} ${e.name} - ${e.description}
7
+ `),e.operations&&e.operations.length>0){let t=e.operations.filter(n=>y(e.name,n.name));t.length>0&&(console.log("Operations:"),t.forEach(n=>{let i=` ${n.name}`;if(n.alias){let o=Array.isArray(n.alias)?n.alias:[n.alias];i+=` (${o.join(", ")})`}let s=i.padEnd(24);console.log(`${s}${n.description}`)}),console.log())}e.arguments&&e.arguments.length>0&&(console.log("Arguments:"),e.arguments.forEach(t=>{console.log(A(t))}),console.log()),console.log(`Use "${l.name} ${e.name} <operation> help" for more information about an operation.`)}function U(e,t){console.log(`
8
+ ${l.name} ${e.name} ${t.name} - ${t.description}
9
+ `),t.arguments&&t.arguments.length>0&&(console.log("Arguments:"),t.arguments.forEach(n=>{console.log(A(n))}),console.log())}function T(e){return y(e.name)?!0:e.operations?e.operations.some(t=>y(e.name,t.name)):!1}function v(){console.log(`Tigris CLI Version: ${b}
7
10
  `),console.log(`Usage: tigris [command] [options]
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();
11
+ `),console.log("Commands:"),l.commands.filter(T).forEach(t=>{let n=` ${t.name}`;t.alias&&(n+=` (${t.alias})`);let i=n.padEnd(24);console.log(`${i}${t.description}`)}),console.log(`
12
+ Use "${l.name} <command> help" for more information about a command.`)}function m(e,t=[]){t.forEach(n=>{if(n.type==="positional"){let i=n.required?`<${n.name}>`:`[${n.name}]`;e.argument(i,n.description)}else{let s=n.alias&&n.alias.length===1?`-${n.alias}, --${n.name}`:`--${n.name}`;n.type==="flag"||(n.type==="boolean"?s+=" [value]":n.options?s+=" <value>":s+=n.required||n["required-when"]?" <value>":" [value]"),e.option(s,n.description,n.default)}})}function g(e,t){for(let n of e){if(n["required-when"]){let[i,s]=n["required-when"].split("="),o=h(t,i,e),r=h(t,n.name,e);if(o===s&&!r)return console.error(`--${n.name} is required when --${i} is ${s}`),!1}if(n.required&&!h(t,n.name,e))return console.error(`--${n.name} is required`),!1}return!0}function h(e,t,n){if(n){let s=n.find(o=>o.name===t);if(s&&s.alias){let o=s.alias.charAt(0).toUpperCase()+s.alias.slice(1);if(e[o]!==void 0)return e[o]}}let i=[t,t.replace(/-/g,""),t.replace(/-/g,"").toLowerCase(),t.charAt(0).toUpperCase(),_(t)];for(let s of i)if(e[s]!==void 0)return e[s]}function _(e){return e.replace(/-([a-z])/g,(t,n)=>n.toUpperCase())}async function H(e,t){let n=t?[`./lib/${e}/${t}.js`,`./lib/${e}/${t}/index.js`]:[`./lib/${e}.js`,`./lib/${e}/index.js`];for(let s of n){let o=await import(s).catch(()=>null);if(o)return{module:o,error:null}}return{module:null,error:`Command not found: ${t?`${e} ${t}`:e}`}}async function $(e,t,n=[],i={},s){if(s){let x=s.replace(/\\n/g,`
13
+ `);console.log(x)}let{module:o,error:r}=await H(e,t);(r||!o)&&(console.error(r),process.exit(1));let a=t||e,d=o.default||o[a];typeof d!="function"&&(console.error(`Command not implemented: ${a}`),process.exit(1)),await d({...i,_positional:n})}var f=new E;f.name(l.name).description(l.description).version(l.version);function c(e,t,n){let i;"optsWithGlobals"in n&&typeof n.optsWithGlobals=="function"?i=n.optsWithGlobals():"opts"in n&&typeof n.opts=="function"?i=n.opts():i=n;let s={...i};return e.filter(r=>r.type==="positional").forEach((r,a)=>{t[a]!==void 0&&(r.multiple?s[r.name]=t[a].split(",").map(d=>d.trim()):s[r.name]=t[a])}),e.forEach(r=>{r.multiple&&r.type!=="positional"&&s[r.name]&&typeof s[r.name]=="string"&&(s[r.name]=s[r.name].split(",").map(a=>a.trim()))}),s}l.commands.forEach(e=>{let t=f.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(o=>i.alias(o)),m(i,n.arguments),i.action(async(...s)=>{let o=s.pop(),r=s;n.arguments&&!g(n.arguments,c(n.arguments,r,o))||await $(e.name,n.name,r,c(n.arguments||[],r,o),n.message)}),i.command("help").description("Show help for this operation").action(()=>{U(e,n)})}),e.default){let n=e.operations?.find(i=>i.name===e.default);if(n){m(t,e.arguments),m(t,n.arguments);let i=[...e.arguments||[],...n.arguments||[]];t.action(async(...s)=>{let o=s.pop(),r=s;i.length>0&&!g(i,c(i,r,o))||await $(e.name,n.name,r,c(i,r,o),e.message||n.message)})}}else t.action(()=>{w(e)});else m(t,e.arguments),t.action(async(...n)=>{let i=n.pop(),s=n;e.arguments&&!g(e.arguments,c(e.arguments,s,i))||await $(e.name,void 0,s,c(e.arguments||[],s,i),e.message)});t.command("help").description("Show help for this command").action(()=>{w(e)})});f.command("help").description("Show general help").action(()=>{v()});f.action(()=>{v()});f.parse();
package/dist/index.js CHANGED
@@ -1,9 +1,12 @@
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.1";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}
1
+ 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.3.0";process.on("unhandledRejection",e=>{(e===""||e===void 0)&&(console.error(`
2
+ Operation cancelled`),process.exit(1)),console.error(`
3
+ Error:`,e instanceof Error?e.message:e),process.exit(1)});process.on("uncaughtException",e=>{console.error(`
4
+ 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 A(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(`
5
+ ${l.name} ${e.name} - ${e.description}
6
+ `),e.operations&&e.operations.length>0){let t=e.operations.filter(n=>y(e.name,n.name));t.length>0&&(console.log("Operations:"),t.forEach(n=>{let i=` ${n.name}`;if(n.alias){let o=Array.isArray(n.alias)?n.alias:[n.alias];i+=` (${o.join(", ")})`}let s=i.padEnd(24);console.log(`${s}${n.description}`)}),console.log())}e.arguments&&e.arguments.length>0&&(console.log("Arguments:"),e.arguments.forEach(t=>{console.log(A(t))}),console.log()),console.log(`Use "${l.name} ${e.name} <operation> help" for more information about an operation.`)}function U(e,t){console.log(`
7
+ ${l.name} ${e.name} ${t.name} - ${t.description}
8
+ `),t.arguments&&t.arguments.length>0&&(console.log("Arguments:"),t.arguments.forEach(n=>{console.log(A(n))}),console.log())}function T(e){return y(e.name)?!0:e.operations?e.operations.some(t=>y(e.name,t.name)):!1}function v(){console.log(`Tigris CLI Version: ${b}
6
9
  `),console.log(`Usage: tigris [command] [options]
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();
10
+ `),console.log("Commands:"),l.commands.filter(T).forEach(t=>{let n=` ${t.name}`;t.alias&&(n+=` (${t.alias})`);let i=n.padEnd(24);console.log(`${i}${t.description}`)}),console.log(`
11
+ Use "${l.name} <command> help" for more information about a command.`)}function m(e,t=[]){t.forEach(n=>{if(n.type==="positional"){let i=n.required?`<${n.name}>`:`[${n.name}]`;e.argument(i,n.description)}else{let s=n.alias&&n.alias.length===1?`-${n.alias}, --${n.name}`:`--${n.name}`;n.type==="flag"||(n.type==="boolean"?s+=" [value]":n.options?s+=" <value>":s+=n.required||n["required-when"]?" <value>":" [value]"),e.option(s,n.description,n.default)}})}function g(e,t){for(let n of e){if(n["required-when"]){let[i,s]=n["required-when"].split("="),o=h(t,i,e),r=h(t,n.name,e);if(o===s&&!r)return console.error(`--${n.name} is required when --${i} is ${s}`),!1}if(n.required&&!h(t,n.name,e))return console.error(`--${n.name} is required`),!1}return!0}function h(e,t,n){if(n){let s=n.find(o=>o.name===t);if(s&&s.alias){let o=s.alias.charAt(0).toUpperCase()+s.alias.slice(1);if(e[o]!==void 0)return e[o]}}let i=[t,t.replace(/-/g,""),t.replace(/-/g,"").toLowerCase(),t.charAt(0).toUpperCase(),_(t)];for(let s of i)if(e[s]!==void 0)return e[s]}function _(e){return e.replace(/-([a-z])/g,(t,n)=>n.toUpperCase())}async function H(e,t){let n=t?[`./lib/${e}/${t}.js`,`./lib/${e}/${t}/index.js`]:[`./lib/${e}.js`,`./lib/${e}/index.js`];for(let s of n){let o=await import(s).catch(()=>null);if(o)return{module:o,error:null}}return{module:null,error:`Command not found: ${t?`${e} ${t}`:e}`}}async function $(e,t,n=[],i={},s){if(s){let x=s.replace(/\\n/g,`
12
+ `);console.log(x)}let{module:o,error:r}=await H(e,t);(r||!o)&&(console.error(r),process.exit(1));let a=t||e,d=o.default||o[a];typeof d!="function"&&(console.error(`Command not implemented: ${a}`),process.exit(1)),await d({...i,_positional:n})}var f=new E;f.name(l.name).description(l.description).version(l.version);function c(e,t,n){let i;"optsWithGlobals"in n&&typeof n.optsWithGlobals=="function"?i=n.optsWithGlobals():"opts"in n&&typeof n.opts=="function"?i=n.opts():i=n;let s={...i};return e.filter(r=>r.type==="positional").forEach((r,a)=>{t[a]!==void 0&&(r.multiple?s[r.name]=t[a].split(",").map(d=>d.trim()):s[r.name]=t[a])}),e.forEach(r=>{r.multiple&&r.type!=="positional"&&s[r.name]&&typeof s[r.name]=="string"&&(s[r.name]=s[r.name].split(",").map(a=>a.trim()))}),s}l.commands.forEach(e=>{let t=f.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(o=>i.alias(o)),m(i,n.arguments),i.action(async(...s)=>{let o=s.pop(),r=s;n.arguments&&!g(n.arguments,c(n.arguments,r,o))||await $(e.name,n.name,r,c(n.arguments||[],r,o),n.message)}),i.command("help").description("Show help for this operation").action(()=>{U(e,n)})}),e.default){let n=e.operations?.find(i=>i.name===e.default);if(n){m(t,e.arguments),m(t,n.arguments);let i=[...e.arguments||[],...n.arguments||[]];t.action(async(...s)=>{let o=s.pop(),r=s;i.length>0&&!g(i,c(i,r,o))||await $(e.name,n.name,r,c(i,r,o),e.message||n.message)})}}else t.action(()=>{w(e)});else m(t,e.arguments),t.action(async(...n)=>{let i=n.pop(),s=n;e.arguments&&!g(e.arguments,c(e.arguments,s,i))||await $(e.name,void 0,s,c(e.arguments||[],s,i),e.message)});t.command("help").description("Show help for this command").action(()=>{w(e)})});f.command("help").description("Show general help").action(()=>{v()});f.action(()=>{v()});f.parse();
@@ -1,2 +1,2 @@
1
- function f(t,e,n){for(let i of e)if(t[i]!==void 0)return t[i];return n}import he from"enquirer";import{readFileSync as Z,existsSync as ee}from"fs";import{join as D,dirname as te}from"path";import{fileURLToPath as ne}from"url";import*as R from"yaml";var ie=ne(import.meta.url),oe=te(ie),A=null;function se(){let t=oe;for(let e=0;e<5;e++){let n=D(t,"specs.yaml");if(ee(n))return n;t=D(t,"..")}throw new Error("Could not find specs.yaml")}function re(){if(!A){let t=se(),e=Z(t,"utf8");A=R.parse(e)}return A}function v(t,e){let i=re().commands.find(o=>o.name===t);return i?e&&i.operations?i.operations.find(o=>o.name===e)||null:i:null}function m(t,e,n){let i=v(t,n);return!i||!i.arguments?null:i.arguments.find(o=>o.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 ye}from"@tigrisdata/storage";import{S3Client as Ke}from"@aws-sdk/client-s3";import{homedir as ae}from"os";import{join as K}from"path";import{readFileSync as ce,writeFileSync as de,existsSync as L,mkdirSync as ge}from"fs";import{chmod as le}from"fs/promises";var I=K(ae(),".tigris"),T=K(I,"config.json");function ue(){L(I)||ge(I,{recursive:!0,mode:448})}function l(){if(L(T))try{let t=ce(T,"utf8");return JSON.parse(t)}catch{return{}}return{}}async function w(t){ue(),de(T,JSON.stringify(t,null,2),{mode:384});try{await le(T,384)}catch{}}async function _(t){let e=l();e.tokens=t,await w(e)}async function y(){return l().tokens||null}async function P(){let t=l();delete t.tokens,await w(t)}async function $(t){let e=l();e.organizations=t,await w(e)}function F(){return l().organizations||[]}function b(){return l().selectedOrganization||null}function j(){let t=l();return t.temporaryCredentials||t.credentials||null}async function q(t){let e=l();e.loginMethod=t,await w(e)}function U(){return l().loginMethod||null}import k from"axios";import fe from"open";function S(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var G=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function V(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_STORAGE_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var O=class{config;baseUrl;constructor(){this.config=S(),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 fe(i.verification_uri_complete)}catch{}e?.onWaiting?.();let o=await this.pollForToken(i.device_code,i.interval||5);await _(o),q("oauth"),await this.extractAndStoreOrganizations(o.idToken)}async pollForToken(e,n){let o=0;for(;o<60;){o++;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(s){if(k.isAxiosError(s)&&s.response){let c=s.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(s.response.data?.error_description||"Authentication failed")}throw s}}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 o=(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,s={accessToken:o.access_token,refreshToken:o.refresh_token||n.refreshToken,idToken:o.id_token||n.idToken,expiresAt:Date.now()+(o.expires_in||3600)*1e3};return await _(s),s}catch{throw await P(),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"),s=JSON.parse(i)[G];if(!s)return;let c=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(c.length===0)return;$(c)}catch{}}async getOrganizations(){return await this.getAccessToken(),F()}async logout(){await P()}async isAuthenticated(){return await y()!==null}sleep(e){return new Promise(n=>setTimeout(n,e))}},M=null;function B(){return M||(M=new O),M}var H=V(),pe=S();async function me(){return U()}async function J(){let t=await me();if(!t)throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.');if(t==="oauth"){let i=await B().getAccessToken();if(!b())throw new Error('No organization selected. Please run "tigris orgs select" first.');let s=H.endpoint,c=H.iamEndpoint,r=pe.domain;return{sessionToken:i,accessKeyId:"",secretAccessKey:"",endpoint:s,organizationId:b()??void 0,iamEndpoint:c,authDomain:r}}let e=j();if(!e)throw new Error('No credentials found. Please run "tigris configure" first.');return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint}}var W={success:"\u2714",failure:"\u2716",hint:"\u2192"};function E(t){let e=v(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,o)=>{let s=e[o];return s!==void 0?String(s):`{{${o}}}`})),n}function Y(t,e){let n=E(t);n?.onStart&&console.log(N(n.onStart,e))}function Q(t,e){let n=E(t);n?.onSuccess&&console.log(`${W.success} ${N(n.onSuccess,e)}`)}function x(t,e,n){let i=E(t);i?.onFailure&&console.error(`${W.failure} ${N(i.onFailure,n)}`),e&&console.error(` ${e}`)}function X(t,e){return{command:t,operation:e}}var{prompt:Ce}=he,C=X("buckets","create");async function Te(t){Y(C);let e=!f(t,["name"]),n=f(t,["name"]),i=e?void 0:f(t,["access","a","A"]),o=e?void 0:f(t,["enable-snapshots","s","S"]),s=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"),g=h(a),d=g?.findIndex(p=>p.value===a?.default);u.push({type:"select",name:"access",message:"Access level:",choices:g||[],initial:d!==void 0&&d>=0?d:0})}if(!s||e){let a=m("buckets","default-tier","create"),g=h(a),d=g?.findIndex(p=>p.value===a?.default);u.push({type:"select",name:"defaultTier",message:"Default storage tier:",choices:g||[],initial:d!==void 0&&d>=0?d:0})}if(!c||e){let a=m("buckets","consistency","create"),g=h(a),d=g?.findIndex(p=>p.value===a?.default);u.push({type:"select",name:"consistency",message:"Consistency level:",choices:g||[],initial:d!==void 0&&d>=0?d:0})}if(!r||e){let a=m("buckets","region","create"),g=h(a),d=g?.findIndex(p=>p.value===a?.default);u.push({type:"select",name:"region",message:"Region:",choices:g||[],initial:d!==void 0&&d>=0?d:0})}if((o===void 0||e)&&u.push({type:"confirm",name:"enableSnapshots",message:"Enable snapshots?",initial:!0}),u.length>0)try{let a=await Ce(u);n=n||a.name,i=i||a.access,o=o!==void 0?o:a.enableSnapshots,s=s||a.defaultTier,c=c||a.consistency,r=r!==void 0?r:a.region}catch{x(C,"Operation cancelled"),process.exit(1)}n||(x(C,"Bucket name is required"),process.exit(1));let{error:z}=await ye(n,{defaultTier:s??"STANDARD",consistency:c==="strict"?"strict":"default",enableSnapshot:o===!0,region:r!=="global"&&r!==void 0?r.split(","):void 0,config:await J()});z&&(x(C,z.message),process.exit(1)),Q(C,{name:n})}export{Te as default};
1
+ function f(n,e,t){for(let i of e)if(n[i]!==void 0)return n[i];return t}import ye from"enquirer";import{readFileSync as ee,existsSync as ne}from"fs";import{join as D,dirname as te}from"path";import{fileURLToPath as ie}from"url";import*as R from"yaml";var oe=ie(import.meta.url),se=te(oe),x=null;function re(){let n=se;for(let e=0;e<5;e++){let t=D(n,"specs.yaml");if(ne(t))return t;n=D(n,"..")}throw new Error("Could not find specs.yaml")}function ae(){if(!x){let n=re(),e=ee(n,"utf8");x=R.parse(e)}return x}function A(n,e){let i=ae().commands.find(o=>o.name===n);return i?e&&i.operations?i.operations.find(o=>o.name===e)||null:i:null}function m(n,e,t){let i=A(n,t);return!i||!i.arguments?null:i.arguments.find(o=>o.name===e)||null}function h(n){return n.options?Array.isArray(n.options)&&typeof n.options[0]=="string"?n.options.map(e=>({name:e,message:e.charAt(0).toUpperCase()+e.slice(1),value:e})):Array.isArray(n.options)&&typeof n.options[0]=="object"?n.options.map(e=>({name:e.value,message:e.description?`${e.name} - ${e.description}`:e.name,value:e.value})):null:null}import{createBucket as Ce}from"@tigrisdata/storage";import{S3Client as Le}from"@aws-sdk/client-s3";import{homedir as ce}from"os";import{join as K}from"path";import{readFileSync as de,writeFileSync as le,existsSync as L,mkdirSync as ge}from"fs";import{chmod as ue}from"fs/promises";var v=K(ce(),".tigris"),C=K(v,"config.json");function fe(){L(v)||ge(v,{recursive:!0,mode:448})}function g(){if(L(C))try{let n=de(C,"utf8");return JSON.parse(n)}catch{return{}}return{}}async function T(n){fe(),le(C,JSON.stringify(n,null,2),{mode:384});try{await ue(C,384)}catch{}}async function I(n){let e=g();e.tokens=n,await T(e)}async function y(){return g().tokens||null}async function _(){let n=g();delete n.tokens,await T(n)}async function $(n){let e=g();e.organizations=n,await T(e)}function F(){return g().organizations||[]}function b(){return g().selectedOrganization||null}function j(){let n=g();return n.temporaryCredentials||n.credentials||null}async function q(n){let e=g();e.loginMethod=n,await T(e)}function U(){return g().loginMethod||null}import S from"axios";import pe from"open";function w(){return{domain:process.env.AUTH0_DOMAIN||"auth.tigris.dev",clientId:process.env.AUTH0_CLIENT_ID||"DMejqeM3CQ4IqTjEcd3oA9eEiT40hn8D",audience:process.env.AUTH0_AUDIENCE||"https://tigris-os-api"}}var G=process.env.TIGRIS_CLAIMS_NAMESPACE||"https://tigris";function V(){return{endpoint:process.env.TIGRIS_STORAGE_ENDPOINT||"https://t3.storage.dev",iamEndpoint:process.env.TIGRIS_IAM_ENDPOINT||"https://iam.storageapi.dev"}}var P=class{config;baseUrl;constructor(){this.config=w(),this.baseUrl=`https://${this.config.domain}`}async login(e){let i=(await S.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 pe(i.verification_uri_complete)}catch{}e?.onWaiting?.();let o=await this.pollForToken(i.device_code,i.interval||5);await I(o),q("oauth"),await this.extractAndStoreOrganizations(o.idToken)}async pollForToken(e,t){let o=0;for(;o<60;){o++;try{let c=(await S.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(s){if(S.isAxiosError(s)&&s.response){let c=s.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(s.response.data?.error_description||"Authentication failed")}throw s}}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 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 y(),!t)throw new Error('No refresh token available. Please run "tigris login" to re-authenticate.');try{let o=(await S.post(`${this.baseUrl}/oauth/token`,{client_id:this.config.clientId,grant_type:"refresh_token",refresh_token:t.refreshToken,scope:"openid profile email offline_access"},{headers:{"Content-Type":"application/x-www-form-urlencoded"}})).data,s={accessToken: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 I(s),s}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 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"),s=JSON.parse(i)[G];if(!s)return;let c=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(c.length===0)return;$(c)}catch{}}async getOrganizations(){return await this.getAccessToken(),F()}async logout(){await _()}async isAuthenticated(){return await y()!==null}sleep(e){return new Promise(t=>setTimeout(t,e))}},M=null;function B(){return M||(M=new P),M}var H=V(),me=w();async function he(){return U()}async function J(){if(await he()==="oauth"){let i=await B().getAccessToken();if(!b())throw new Error('No organization selected. Please run "tigris orgs select" first.');let s=H.endpoint,c=H.iamEndpoint,r=me.domain;return{sessionToken:i,accessKeyId:"",secretAccessKey:"",endpoint:s,organizationId:b()??void 0,iamEndpoint:c,authDomain:r}}let e=j();if(e)return{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,endpoint:e.endpoint};throw new Error('Not authenticated. Please run "tigris login" or "tigris configure" first.')}var Y={success:"\u2714",failure:"\u2716",hint:"\u2192"};function W(){return process.stdout.isTTY===!0}function O(n){let e=A(n.command,n.operation);if(e)return e.messages}function E(n,e){let t=n;return t=t.replace(/\\n/g,`
2
+ `),e&&(t=t.replace(/\{\{(\w+)\}\}/g,(i,o)=>{let s=e[o];return s!==void 0?String(s):`{{${o}}}`})),t}function Q(n,e){if(!W())return;let t=O(n);t?.onStart&&console.log(E(t.onStart,e))}function X(n,e){if(!W())return;let t=O(n);t?.onSuccess&&console.log(`${Y.success} ${E(t.onSuccess,e)}`)}function N(n,e,t){let i=O(n);i?.onFailure&&console.error(`${Y.failure} ${E(i.onFailure,t)}`),e&&console.error(` ${e}`)}function Z(n,e){return{command:n,operation:e}}var{prompt:Te}=ye,k=Z("buckets","create");async function we(n){Q(k);let e=!f(n,["name"]),t=f(n,["name"]),i=e?void 0:f(n,["access","a","A"]),o=e?void 0:f(n,["enable-snapshots","s","S"]),s=e?void 0:f(n,["default-tier","t","T"]),c=e?void 0:f(n,["consistency","c","C"]),r=e?void 0:f(n,["region","r","R"]),u=[];if((!t||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(!s||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((o===void 0||e)&&u.push({type:"confirm",name:"enableSnapshots",message:"Enable snapshots?",initial:!0}),u.length>0){let a=await Te(u);t=t||a.name,i=i||a.access,o=o!==void 0?o:a.enableSnapshots,s=s||a.defaultTier,c=c||a.consistency,r=r!==void 0?r:a.region}t||(N(k,"Bucket name is required"),process.exit(1));let{error:z}=await Ce(t,{defaultTier:s??"STANDARD",consistency:c==="strict"?"strict":"default",enableSnapshot:o===!0,region:r!=="global"&&r!==void 0?r.split(","):void 0,config:await J()});z&&(N(k,z.message),process.exit(1)),X(k,{name:t})}export{we as default};