@tigrisdata/cli 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +381 -1
- package/dist/auth/client.js +1 -1
- package/dist/auth/config.js +1 -1
- package/dist/auth/s3-client.js +1 -1
- package/dist/auth/storage.js +1 -1
- package/dist/cli.js +11 -8
- package/dist/index.js +11 -8
- package/dist/lib/buckets/create.js +2 -2
- package/dist/lib/buckets/delete.js +2 -0
- package/dist/lib/buckets/get.js +7 -0
- package/dist/lib/buckets/list.js +6 -6
- package/dist/lib/configure/index.js +2 -2
- package/dist/lib/cp.js +1 -1
- package/dist/lib/forks/create.js +2 -0
- package/dist/lib/forks/list.js +7 -0
- package/dist/lib/login/credentials.js +2 -2
- package/dist/lib/login/oauth.js +5 -0
- package/dist/lib/login/select.js +5 -5
- package/dist/lib/logout.js +2 -2
- package/dist/lib/ls.js +6 -1
- package/dist/lib/mk.js +1 -1
- package/dist/lib/mv.js +1 -1
- package/dist/lib/objects/delete.js +2 -0
- package/dist/lib/objects/get.js +2 -0
- package/dist/lib/objects/list.js +7 -0
- package/dist/lib/objects/put.js +7 -0
- package/dist/lib/organizations/create.js +5 -0
- package/dist/lib/organizations/list.js +10 -0
- package/dist/lib/organizations/select.js +9 -0
- package/dist/lib/rm.js +1 -1
- package/dist/lib/snapshots/list.js +7 -0
- package/dist/lib/snapshots/take.js +2 -0
- package/dist/lib/touch.js +1 -0
- package/dist/lib/whoami.js +3 -3
- package/dist/specs.yaml +260 -259
- package/dist/utils/messages.js +2 -2
- package/dist/utils/path.js +1 -1
- package/package.json +13 -4
- package/dist/lib/login/ui.js +0 -5
- package/dist/lib/orgs/create.js +0 -2
- package/dist/lib/orgs/list.js +0 -7
- package/dist/lib/orgs/select.js +0 -6
- /package/dist/lib/{stat.js → _stat.js} +0 -0
package/README.md
CHANGED
|
@@ -10,7 +10,387 @@ npm install -g @tigrisdata/cli
|
|
|
10
10
|
|
|
11
11
|
## Usage
|
|
12
12
|
|
|
13
|
-
|
|
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
|
|
package/dist/auth/client.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
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 O}from"fs";import{chmod as P}from"fs/promises";var p=C(x(),".tigris"),g=C(p,"config.json");function E(){y(p)||O(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 P(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};
|
package/dist/auth/config.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
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};
|
package/dist/auth/s3-client.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{S3Client as
|
|
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 G}from"fs/promises";var h=v(b(),".tigris"),g=v(h,"config.json");function U(){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){U(),R(g,JSON.stringify(n,null,2),{mode:384});try{await G(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 F 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_STORAGE_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 F(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};
|
package/dist/auth/storage.js
CHANGED
|
@@ -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"),
|
|
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
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
${
|
|
6
|
-
|
|
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.2.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:"),
|
|
9
|
-
Use "${
|
|
10
|
-
`);console.log(
|
|
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.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
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
${
|
|
5
|
-
|
|
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.2.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 x(){console.log(`Tigris CLI Version: ${b}
|
|
6
9
|
`),console.log(`Usage: tigris [command] [options]
|
|
7
|
-
`),console.log("Commands:"),
|
|
8
|
-
Use "${
|
|
9
|
-
`);console.log(
|
|
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.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 v=s.replace(/\\n/g,`
|
|
12
|
+
`);console.log(v)}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(()=>{x()});f.action(()=>{x()});f.parse();
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function f(
|
|
2
|
-
`),e&&(
|
|
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_STORAGE_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};
|