@internxt/cli 1.5.3 → 1.5.4
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/.env +2 -6
- package/README.md +46 -26
- package/bin/dev.js +1 -1
- package/bin/run.js +1 -1
- package/dist/commands/create-folder.js +1 -1
- package/dist/commands/delete-permanently-file.js +1 -1
- package/dist/commands/delete-permanently-folder.js +1 -1
- package/dist/commands/logout.js +2 -0
- package/dist/commands/upload-file.js +2 -2
- package/dist/services/auth.service.d.ts +1 -0
- package/dist/services/auth.service.js +13 -1
- package/dist/services/crypto.service.d.ts +1 -1
- package/dist/services/crypto.service.js +2 -2
- package/dist/services/drive/drive-file.service.d.ts +1 -1
- package/dist/services/drive/drive-file.service.js +7 -7
- package/dist/services/drive/drive-folder.service.js +7 -7
- package/dist/services/drive/trash.service.d.ts +6 -4
- package/dist/services/drive/trash.service.js +6 -6
- package/dist/services/sdk-manager.service.d.ts +3 -5
- package/dist/services/sdk-manager.service.js +14 -34
- package/dist/services/thumbnail.service.d.ts +2 -2
- package/dist/services/thumbnail.service.js +6 -6
- package/dist/services/usage.service.d.ts +2 -2
- package/dist/services/usage.service.js +2 -2
- package/dist/types/config.types.d.ts +1 -4
- package/dist/utils/pm2.utils.d.ts +1 -1
- package/dist/utils/thumbnail.utils.js +3 -3
- package/dist/utils/webdav.utils.d.ts +2 -3
- package/dist/utils/webdav.utils.js +6 -18
- package/dist/webdav/handlers/DELETE.handler.js +5 -1
- package/dist/webdav/handlers/GET.handler.js +6 -2
- package/dist/webdav/handlers/HEAD.handler.js +7 -2
- package/dist/webdav/handlers/MKCOL.handler.js +10 -8
- package/dist/webdav/handlers/MOVE.handler.js +10 -3
- package/dist/webdav/handlers/OPTIONS.handler.js +2 -5
- package/dist/webdav/handlers/PROPFIND.handler.js +20 -21
- package/dist/webdav/handlers/PUT.handler.js +8 -4
- package/dist/webdav/index.js +1 -1
- package/oclif.manifest.json +1 -1
- package/package.json +29 -28
- package/scripts/restart-webdav.js +2 -1
package/.env
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
DRIVE_API_URL=https://drive.internxt.com/api
|
|
1
|
+
DRIVE_WEB_URL=https://drive.internxt.com
|
|
3
2
|
DRIVE_NEW_API_URL=https://api.internxt.com/drive
|
|
4
|
-
PAYMENTS_API_URL=https://api.internxt.com/payments
|
|
5
3
|
NETWORK_URL=https://api.internxt.com
|
|
6
4
|
APP_CRYPTO_SECRET=6KYQBP847D4ATSFA
|
|
7
|
-
APP_CRYPTO_SECRET2=8Q8VMUE3BJZV87GT
|
|
8
5
|
APP_MAGIC_IV=d139cb9a2cd17092e79e1861cf9d7023
|
|
9
|
-
APP_MAGIC_SALT=38dce0391b49efba88dbc8c39ebf868f0267eb110bb0012ab27dc52a528d61b1d1ed9d76f400ff58e3240028442b1eab9bb84e111d9dadd997982dbde9dbd25e
|
|
10
|
-
NODE_ENV=production
|
|
6
|
+
APP_MAGIC_SALT=38dce0391b49efba88dbc8c39ebf868f0267eb110bb0012ab27dc52a528d61b1d1ed9d76f400ff58e3240028442b1eab9bb84e111d9dadd997982dbde9dbd25e
|
package/README.md
CHANGED
|
@@ -7,17 +7,37 @@ A CLI tool to interact with your Internxt encrypted files
|
|
|
7
7
|
|
|
8
8
|
<!-- toc -->
|
|
9
9
|
* [Internxt CLI](#internxt-cli)
|
|
10
|
+
* [Project Maintenance](#project-maintenance)
|
|
10
11
|
* [Installation](#installation)
|
|
11
12
|
* [Usage](#usage)
|
|
12
13
|
* [Commands](#commands)
|
|
13
14
|
* [Current Limitations](#current-limitations)
|
|
14
15
|
<!-- tocstop -->
|
|
15
16
|
|
|
17
|
+
# Project Maintenance
|
|
18
|
+
|
|
19
|
+
<!-- maintenance -->
|
|
20
|
+
[](https://sonarcloud.io/summary/new_code?id=internxt_cli)
|
|
21
|
+
[](https://sonarcloud.io/summary/new_code?id=internxt_cli)
|
|
22
|
+
[](https://sonarcloud.io/summary/new_code?id=internxt_cli)
|
|
23
|
+
[](https://sonarcloud.io/summary/new_code?id=internxt_cli)
|
|
24
|
+
[](https://sonarcloud.io/summary/new_code?id=internxt_cli)
|
|
25
|
+
[](https://sonarcloud.io/summary/new_code?id=internxt_cli)
|
|
26
|
+
[](https://sonarcloud.io/summary/new_code?id=internxt_cli)
|
|
27
|
+
|
|
28
|
+
We aim to achieve:
|
|
29
|
+
|
|
30
|
+
- An 'A' rating in Maintainability
|
|
31
|
+
- An 'A' rating in Security
|
|
32
|
+
- Less than 3% duplicated lines
|
|
33
|
+
- At least 80% test coverage
|
|
34
|
+
<!-- maintenancestop -->
|
|
35
|
+
|
|
16
36
|
# Installation
|
|
17
37
|
|
|
18
38
|
You can install the Internxt CLI by using NPM:
|
|
19
39
|
|
|
20
|
-
Requires Node >=
|
|
40
|
+
Requires Node >= 22.12.0
|
|
21
41
|
|
|
22
42
|
`npm i -g @internxt/cli`
|
|
23
43
|
|
|
@@ -31,7 +51,7 @@ $ npm install -g @internxt/cli
|
|
|
31
51
|
$ internxt COMMAND
|
|
32
52
|
running command...
|
|
33
53
|
$ internxt (--version)
|
|
34
|
-
@internxt/cli/1.5.
|
|
54
|
+
@internxt/cli/1.5.4 linux-x64 node-v22.17.0
|
|
35
55
|
$ internxt --help [COMMAND]
|
|
36
56
|
USAGE
|
|
37
57
|
$ internxt COMMAND
|
|
@@ -99,7 +119,7 @@ EXAMPLES
|
|
|
99
119
|
$ internxt add-cert
|
|
100
120
|
```
|
|
101
121
|
|
|
102
|
-
_See code: [src/commands/add-cert.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
122
|
+
_See code: [src/commands/add-cert.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/add-cert.ts)_
|
|
103
123
|
|
|
104
124
|
## `internxt config`
|
|
105
125
|
|
|
@@ -119,7 +139,7 @@ EXAMPLES
|
|
|
119
139
|
$ internxt config
|
|
120
140
|
```
|
|
121
141
|
|
|
122
|
-
_See code: [src/commands/config.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
142
|
+
_See code: [src/commands/config.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/config.ts)_
|
|
123
143
|
|
|
124
144
|
## `internxt create-folder`
|
|
125
145
|
|
|
@@ -148,7 +168,7 @@ EXAMPLES
|
|
|
148
168
|
$ internxt create-folder
|
|
149
169
|
```
|
|
150
170
|
|
|
151
|
-
_See code: [src/commands/create-folder.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
171
|
+
_See code: [src/commands/create-folder.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/create-folder.ts)_
|
|
152
172
|
|
|
153
173
|
## `internxt delete-permanently-file`
|
|
154
174
|
|
|
@@ -178,7 +198,7 @@ EXAMPLES
|
|
|
178
198
|
$ internxt delete-permanently-file
|
|
179
199
|
```
|
|
180
200
|
|
|
181
|
-
_See code: [src/commands/delete-permanently-file.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
201
|
+
_See code: [src/commands/delete-permanently-file.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/delete-permanently-file.ts)_
|
|
182
202
|
|
|
183
203
|
## `internxt delete-permanently-folder`
|
|
184
204
|
|
|
@@ -208,7 +228,7 @@ EXAMPLES
|
|
|
208
228
|
$ internxt delete-permanently-folder
|
|
209
229
|
```
|
|
210
230
|
|
|
211
|
-
_See code: [src/commands/delete-permanently-folder.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
231
|
+
_See code: [src/commands/delete-permanently-folder.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/delete-permanently-folder.ts)_
|
|
212
232
|
|
|
213
233
|
## `internxt delete permanently file`
|
|
214
234
|
|
|
@@ -297,7 +317,7 @@ EXAMPLES
|
|
|
297
317
|
$ internxt download-file
|
|
298
318
|
```
|
|
299
319
|
|
|
300
|
-
_See code: [src/commands/download-file.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
320
|
+
_See code: [src/commands/download-file.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/download-file.ts)_
|
|
301
321
|
|
|
302
322
|
## `internxt download file`
|
|
303
323
|
|
|
@@ -356,7 +376,7 @@ EXAMPLES
|
|
|
356
376
|
$ internxt list
|
|
357
377
|
```
|
|
358
378
|
|
|
359
|
-
_See code: [src/commands/list.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
379
|
+
_See code: [src/commands/list.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/list.ts)_
|
|
360
380
|
|
|
361
381
|
## `internxt login`
|
|
362
382
|
|
|
@@ -385,7 +405,7 @@ EXAMPLES
|
|
|
385
405
|
$ internxt login
|
|
386
406
|
```
|
|
387
407
|
|
|
388
|
-
_See code: [src/commands/login.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
408
|
+
_See code: [src/commands/login.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/login.ts)_
|
|
389
409
|
|
|
390
410
|
## `internxt logout`
|
|
391
411
|
|
|
@@ -405,7 +425,7 @@ EXAMPLES
|
|
|
405
425
|
$ internxt logout
|
|
406
426
|
```
|
|
407
427
|
|
|
408
|
-
_See code: [src/commands/logout.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
428
|
+
_See code: [src/commands/logout.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/logout.ts)_
|
|
409
429
|
|
|
410
430
|
## `internxt logs`
|
|
411
431
|
|
|
@@ -425,7 +445,7 @@ EXAMPLES
|
|
|
425
445
|
$ internxt logs
|
|
426
446
|
```
|
|
427
447
|
|
|
428
|
-
_See code: [src/commands/logs.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
448
|
+
_See code: [src/commands/logs.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/logs.ts)_
|
|
429
449
|
|
|
430
450
|
## `internxt move-file`
|
|
431
451
|
|
|
@@ -457,7 +477,7 @@ EXAMPLES
|
|
|
457
477
|
$ internxt move-file
|
|
458
478
|
```
|
|
459
479
|
|
|
460
|
-
_See code: [src/commands/move-file.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
480
|
+
_See code: [src/commands/move-file.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/move-file.ts)_
|
|
461
481
|
|
|
462
482
|
## `internxt move-folder`
|
|
463
483
|
|
|
@@ -489,7 +509,7 @@ EXAMPLES
|
|
|
489
509
|
$ internxt move-folder
|
|
490
510
|
```
|
|
491
511
|
|
|
492
|
-
_See code: [src/commands/move-folder.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
512
|
+
_See code: [src/commands/move-folder.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/move-folder.ts)_
|
|
493
513
|
|
|
494
514
|
## `internxt move file`
|
|
495
515
|
|
|
@@ -580,7 +600,7 @@ EXAMPLES
|
|
|
580
600
|
$ internxt rename-file
|
|
581
601
|
```
|
|
582
602
|
|
|
583
|
-
_See code: [src/commands/rename-file.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
603
|
+
_See code: [src/commands/rename-file.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/rename-file.ts)_
|
|
584
604
|
|
|
585
605
|
## `internxt rename-folder`
|
|
586
606
|
|
|
@@ -611,7 +631,7 @@ EXAMPLES
|
|
|
611
631
|
$ internxt rename-folder
|
|
612
632
|
```
|
|
613
633
|
|
|
614
|
-
_See code: [src/commands/rename-folder.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
634
|
+
_See code: [src/commands/rename-folder.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/rename-folder.ts)_
|
|
615
635
|
|
|
616
636
|
## `internxt rename file`
|
|
617
637
|
|
|
@@ -699,7 +719,7 @@ EXAMPLES
|
|
|
699
719
|
$ internxt trash-clear
|
|
700
720
|
```
|
|
701
721
|
|
|
702
|
-
_See code: [src/commands/trash-clear.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
722
|
+
_See code: [src/commands/trash-clear.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/trash-clear.ts)_
|
|
703
723
|
|
|
704
724
|
## `internxt trash-file`
|
|
705
725
|
|
|
@@ -729,7 +749,7 @@ EXAMPLES
|
|
|
729
749
|
$ internxt trash-file
|
|
730
750
|
```
|
|
731
751
|
|
|
732
|
-
_See code: [src/commands/trash-file.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
752
|
+
_See code: [src/commands/trash-file.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/trash-file.ts)_
|
|
733
753
|
|
|
734
754
|
## `internxt trash-folder`
|
|
735
755
|
|
|
@@ -759,7 +779,7 @@ EXAMPLES
|
|
|
759
779
|
$ internxt trash-folder
|
|
760
780
|
```
|
|
761
781
|
|
|
762
|
-
_See code: [src/commands/trash-folder.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
782
|
+
_See code: [src/commands/trash-folder.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/trash-folder.ts)_
|
|
763
783
|
|
|
764
784
|
## `internxt trash-list`
|
|
765
785
|
|
|
@@ -785,7 +805,7 @@ EXAMPLES
|
|
|
785
805
|
$ internxt trash-list
|
|
786
806
|
```
|
|
787
807
|
|
|
788
|
-
_See code: [src/commands/trash-list.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
808
|
+
_See code: [src/commands/trash-list.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/trash-list.ts)_
|
|
789
809
|
|
|
790
810
|
## `internxt trash-restore-file`
|
|
791
811
|
|
|
@@ -816,7 +836,7 @@ EXAMPLES
|
|
|
816
836
|
$ internxt trash-restore-file
|
|
817
837
|
```
|
|
818
838
|
|
|
819
|
-
_See code: [src/commands/trash-restore-file.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
839
|
+
_See code: [src/commands/trash-restore-file.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/trash-restore-file.ts)_
|
|
820
840
|
|
|
821
841
|
## `internxt trash-restore-folder`
|
|
822
842
|
|
|
@@ -847,7 +867,7 @@ EXAMPLES
|
|
|
847
867
|
$ internxt trash-restore-folder
|
|
848
868
|
```
|
|
849
869
|
|
|
850
|
-
_See code: [src/commands/trash-restore-folder.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
870
|
+
_See code: [src/commands/trash-restore-folder.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/trash-restore-folder.ts)_
|
|
851
871
|
|
|
852
872
|
## `internxt trash clear`
|
|
853
873
|
|
|
@@ -1044,7 +1064,7 @@ EXAMPLES
|
|
|
1044
1064
|
$ internxt upload-file
|
|
1045
1065
|
```
|
|
1046
1066
|
|
|
1047
|
-
_See code: [src/commands/upload-file.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
1067
|
+
_See code: [src/commands/upload-file.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/upload-file.ts)_
|
|
1048
1068
|
|
|
1049
1069
|
## `internxt upload file`
|
|
1050
1070
|
|
|
@@ -1099,7 +1119,7 @@ EXAMPLES
|
|
|
1099
1119
|
$ internxt webdav status
|
|
1100
1120
|
```
|
|
1101
1121
|
|
|
1102
|
-
_See code: [src/commands/webdav.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
1122
|
+
_See code: [src/commands/webdav.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/webdav.ts)_
|
|
1103
1123
|
|
|
1104
1124
|
## `internxt webdav-config`
|
|
1105
1125
|
|
|
@@ -1125,7 +1145,7 @@ EXAMPLES
|
|
|
1125
1145
|
$ internxt webdav-config
|
|
1126
1146
|
```
|
|
1127
1147
|
|
|
1128
|
-
_See code: [src/commands/webdav-config.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
1148
|
+
_See code: [src/commands/webdav-config.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/webdav-config.ts)_
|
|
1129
1149
|
|
|
1130
1150
|
## `internxt whoami`
|
|
1131
1151
|
|
|
@@ -1145,7 +1165,7 @@ EXAMPLES
|
|
|
1145
1165
|
$ internxt whoami
|
|
1146
1166
|
```
|
|
1147
1167
|
|
|
1148
|
-
_See code: [src/commands/whoami.ts](https://github.com/internxt/cli/blob/v1.5.
|
|
1168
|
+
_See code: [src/commands/whoami.ts](https://github.com/internxt/cli/blob/v1.5.4/src/commands/whoami.ts)_
|
|
1149
1169
|
<!-- commandsstop -->
|
|
1150
1170
|
|
|
1151
1171
|
# Current Limitations
|
package/bin/dev.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node_modules/.bin/ts-node
|
|
2
2
|
/* eslint-disable */
|
|
3
|
-
require('dotenv').config({ path: __dirname + '/../.env' });
|
|
3
|
+
require('dotenv').config({ path: __dirname + '/../.env', quiet: true });
|
|
4
4
|
(async () => {
|
|
5
5
|
const oclif = await import('@oclif/core');
|
|
6
6
|
await oclif.execute({ development: true, dir: __dirname });
|
package/bin/run.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/* eslint-disable */
|
|
3
|
-
require('dotenv').config({ path: __dirname + '/../.env' });
|
|
3
|
+
require('dotenv').config({ path: __dirname + '/../.env', quiet: true });
|
|
4
4
|
(async () => {
|
|
5
5
|
const oclif = await import('@oclif/core');
|
|
6
6
|
await oclif.execute({ development: false, dir: __dirname });
|
|
@@ -48,7 +48,7 @@ class CreateFolder extends core_1.Command {
|
|
|
48
48
|
});
|
|
49
49
|
const newFolder = await createNewFolder;
|
|
50
50
|
cli_utils_1.CLIUtils.done(flags['json']);
|
|
51
|
-
const message = `Folder ${newFolder.plainName} created successfully, view it at ${config_service_1.ConfigService.instance.get('
|
|
51
|
+
const message = `Folder ${newFolder.plainName} created successfully, view it at ${config_service_1.ConfigService.instance.get('DRIVE_WEB_URL')}/folder/${newFolder.uuid}`;
|
|
52
52
|
cli_utils_1.CLIUtils.success(this.log.bind(this), message);
|
|
53
53
|
return { success: true, message, folder: newFolder };
|
|
54
54
|
};
|
|
@@ -32,7 +32,7 @@ class DeletePermanentlyFile extends core_1.Command {
|
|
|
32
32
|
if (!driveFile) {
|
|
33
33
|
throw new Error('File not found');
|
|
34
34
|
}
|
|
35
|
-
await trash_service_1.TrashService.instance.deleteFile(
|
|
35
|
+
await trash_service_1.TrashService.instance.deleteFile(driveFile.uuid);
|
|
36
36
|
const message = 'File permanently deleted successfully';
|
|
37
37
|
cli_utils_1.CLIUtils.success(this.log.bind(this), message);
|
|
38
38
|
return { success: true, message };
|
|
@@ -32,7 +32,7 @@ class DeletePermanentlyFolder extends core_1.Command {
|
|
|
32
32
|
if (!driveFolder) {
|
|
33
33
|
throw new Error('Folder not found');
|
|
34
34
|
}
|
|
35
|
-
await trash_service_1.TrashService.instance.deleteFolder(driveFolder.
|
|
35
|
+
await trash_service_1.TrashService.instance.deleteFolder(driveFolder.uuid);
|
|
36
36
|
const message = 'Folder permanently deleted successfully';
|
|
37
37
|
cli_utils_1.CLIUtils.success(this.log.bind(this), message);
|
|
38
38
|
return { success: true, message };
|
package/dist/commands/logout.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const core_1 = require("@oclif/core");
|
|
4
4
|
const config_service_1 = require("../services/config.service");
|
|
5
5
|
const cli_utils_1 = require("../utils/cli.utils");
|
|
6
|
+
const auth_service_1 = require("../services/auth.service");
|
|
6
7
|
class Logout extends core_1.Command {
|
|
7
8
|
static args = {};
|
|
8
9
|
static description = 'Logs out the current internxt user that is logged into the Internxt CLI.';
|
|
@@ -13,6 +14,7 @@ class Logout extends core_1.Command {
|
|
|
13
14
|
run = async () => {
|
|
14
15
|
const user = await config_service_1.ConfigService.instance.readUser();
|
|
15
16
|
if (user) {
|
|
17
|
+
await auth_service_1.AuthService.instance.logout();
|
|
16
18
|
await config_service_1.ConfigService.instance.clearUser();
|
|
17
19
|
const message = 'User logged out successfully.';
|
|
18
20
|
cli_utils_1.CLIUtils.success(this.log.bind(this), message);
|
|
@@ -117,7 +117,7 @@ class UploadFile extends core_1.Command {
|
|
|
117
117
|
if (isThumbnailable && bufferStream) {
|
|
118
118
|
const thumbnailBuffer = bufferStream.getBuffer();
|
|
119
119
|
if (thumbnailBuffer) {
|
|
120
|
-
await thumbnail_service_1.ThumbnailService.instance.uploadThumbnail(thumbnailBuffer, fileType, user.bucket, createdDriveFile.
|
|
120
|
+
await thumbnail_service_1.ThumbnailService.instance.uploadThumbnail(thumbnailBuffer, fileType, user.bucket, createdDriveFile.uuid, networkFacade);
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
123
|
}
|
|
@@ -128,7 +128,7 @@ class UploadFile extends core_1.Command {
|
|
|
128
128
|
progressBar?.stop();
|
|
129
129
|
const uploadTime = timer.stop();
|
|
130
130
|
this.log('\n');
|
|
131
|
-
const message = `File uploaded in ${uploadTime}ms, view it at ${config_service_1.ConfigService.instance.get('
|
|
131
|
+
const message = `File uploaded in ${uploadTime}ms, view it at ${config_service_1.ConfigService.instance.get('DRIVE_WEB_URL')}/file/${createdDriveFile.uuid}`;
|
|
132
132
|
cli_utils_1.CLIUtils.success(this.log.bind(this), message);
|
|
133
133
|
return { success: true, message, file: createdDriveFile };
|
|
134
134
|
};
|
|
@@ -73,7 +73,7 @@ class AuthService {
|
|
|
73
73
|
token: oldCreds.token,
|
|
74
74
|
newToken: oldCreds.newToken,
|
|
75
75
|
});
|
|
76
|
-
const usersClient = sdk_manager_service_1.SdkManager.instance.getUsers(
|
|
76
|
+
const usersClient = sdk_manager_service_1.SdkManager.instance.getUsers();
|
|
77
77
|
const newCreds = await usersClient.getUserData({ userUuid: oldCreds.user.uuid });
|
|
78
78
|
const loginCreds = {
|
|
79
79
|
user: {
|
|
@@ -92,5 +92,17 @@ class AuthService {
|
|
|
92
92
|
});
|
|
93
93
|
return loginCreds;
|
|
94
94
|
};
|
|
95
|
+
logout = async () => {
|
|
96
|
+
try {
|
|
97
|
+
const user = await config_service_1.ConfigService.instance.readUser();
|
|
98
|
+
if (!user || !user.newToken) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const authClient = sdk_manager_service_1.SdkManager.instance.getAuth();
|
|
102
|
+
return authClient.logout(user.newToken);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
}
|
|
106
|
+
};
|
|
95
107
|
}
|
|
96
108
|
exports.AuthService = AuthService;
|
|
@@ -14,5 +14,5 @@ export declare class CryptoService {
|
|
|
14
14
|
encryptTextWithKey: (textToEncrypt: string, secret: string) => string;
|
|
15
15
|
decryptTextWithKey: (encryptedText: string, secret: string) => string;
|
|
16
16
|
decryptStream: (inputSlices: ReadableStream<Uint8Array>[], key: Buffer, iv: Buffer, startOffsetByte?: number) => ReadableStream<any>;
|
|
17
|
-
private getKeyAndIvFrom;
|
|
17
|
+
private readonly getKeyAndIvFrom;
|
|
18
18
|
}
|
|
@@ -8,7 +8,7 @@ const stream_utils_1 = require("../utils/stream.utils");
|
|
|
8
8
|
class CryptoService {
|
|
9
9
|
static instance = new CryptoService();
|
|
10
10
|
static cryptoProvider = {
|
|
11
|
-
|
|
11
|
+
encryptPasswordHash(password, encryptedSalt) {
|
|
12
12
|
const salt = CryptoService.instance.decryptText(encryptedSalt);
|
|
13
13
|
const hashObj = CryptoService.instance.passToHash({ password, salt });
|
|
14
14
|
return CryptoService.instance.encryptText(hashObj.hash);
|
|
@@ -32,7 +32,7 @@ class CryptoService {
|
|
|
32
32
|
},
|
|
33
33
|
};
|
|
34
34
|
passToHash = (passObject) => {
|
|
35
|
-
const salt = passObject.salt
|
|
35
|
+
const salt = passObject.salt ?? (0, node_crypto_1.randomBytes)(128 / 8).toString('hex');
|
|
36
36
|
const hash = (0, node_crypto_1.pbkdf2Sync)(passObject.password, Buffer.from(salt, 'hex'), 10000, 256 / 8, 'sha1').toString('hex');
|
|
37
37
|
const hashedObjetc = {
|
|
38
38
|
salt,
|
|
@@ -10,5 +10,5 @@ export declare class DriveFileService {
|
|
|
10
10
|
type?: string | null;
|
|
11
11
|
}) => Promise<void>;
|
|
12
12
|
getFileMetadataByPath: (path: string) => Promise<DriveFileItem>;
|
|
13
|
-
createThumbnail: (payload: StorageTypes.
|
|
13
|
+
createThumbnail: (payload: StorageTypes.CreateThumbnailEntryPayload) => Promise<StorageTypes.Thumbnail>;
|
|
14
14
|
}
|
|
@@ -6,7 +6,7 @@ const drive_utils_1 = require("../../utils/drive.utils");
|
|
|
6
6
|
class DriveFileService {
|
|
7
7
|
static instance = new DriveFileService();
|
|
8
8
|
createFile = async (payload) => {
|
|
9
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
9
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
10
10
|
const driveFile = await storageClient.createFileEntryByUuid(payload);
|
|
11
11
|
return {
|
|
12
12
|
name: payload.plain_name,
|
|
@@ -25,27 +25,27 @@ class DriveFileService {
|
|
|
25
25
|
};
|
|
26
26
|
};
|
|
27
27
|
getFileMetadata = async (uuid) => {
|
|
28
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
28
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
29
29
|
const [getFileMetadata] = storageClient.getFile(uuid);
|
|
30
30
|
const fileMetadata = await getFileMetadata;
|
|
31
31
|
return drive_utils_1.DriveUtils.driveFileMetaToItem(fileMetadata);
|
|
32
32
|
};
|
|
33
33
|
moveFile = (payload) => {
|
|
34
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
34
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
35
35
|
return storageClient.moveFileByUuid(payload);
|
|
36
36
|
};
|
|
37
37
|
renameFile = (fileUuid, payload) => {
|
|
38
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
38
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
39
39
|
return storageClient.updateFileMetaByUUID(fileUuid, payload);
|
|
40
40
|
};
|
|
41
41
|
getFileMetadataByPath = async (path) => {
|
|
42
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
42
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
43
43
|
const fileMetadata = await storageClient.getFileByPath(encodeURIComponent(path));
|
|
44
44
|
return drive_utils_1.DriveUtils.driveFileMetaToItem(fileMetadata);
|
|
45
45
|
};
|
|
46
46
|
createThumbnail = (payload) => {
|
|
47
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
48
|
-
return storageClient.
|
|
47
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
48
|
+
return storageClient.createThumbnailEntryWithUUID(payload);
|
|
49
49
|
};
|
|
50
50
|
}
|
|
51
51
|
exports.DriveFileService = DriveFileService;
|
|
@@ -6,17 +6,17 @@ const drive_utils_1 = require("../../utils/drive.utils");
|
|
|
6
6
|
class DriveFolderService {
|
|
7
7
|
static instance = new DriveFolderService();
|
|
8
8
|
getFolderMetaByUuid = async (uuid) => {
|
|
9
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
9
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
10
10
|
const folderMeta = await storageClient.getFolderMeta(uuid);
|
|
11
11
|
return drive_utils_1.DriveUtils.driveFolderMetaToItem(folderMeta);
|
|
12
12
|
};
|
|
13
13
|
getFolderMetaById = async (id) => {
|
|
14
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
14
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
15
15
|
const folderMeta = await storageClient.getFolderMetaById(id);
|
|
16
16
|
return drive_utils_1.DriveUtils.driveFolderMetaToItem(folderMeta);
|
|
17
17
|
};
|
|
18
18
|
getFolderContent = async (folderUuid) => {
|
|
19
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
19
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
20
20
|
const folders = await this.getAllSubfolders(storageClient, folderUuid, 0);
|
|
21
21
|
const files = await this.getAllSubfiles(storageClient, folderUuid, 0);
|
|
22
22
|
return { folders, files };
|
|
@@ -42,19 +42,19 @@ class DriveFolderService {
|
|
|
42
42
|
}
|
|
43
43
|
};
|
|
44
44
|
moveFolder = (payload) => {
|
|
45
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
45
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
46
46
|
return storageClient.moveFolderByUuid(payload);
|
|
47
47
|
};
|
|
48
48
|
createFolder(payload) {
|
|
49
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
49
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
50
50
|
return storageClient.createFolderByUuid(payload);
|
|
51
51
|
}
|
|
52
52
|
renameFolder = (payload) => {
|
|
53
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
53
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
54
54
|
return storageClient.updateFolderNameWithUUID(payload);
|
|
55
55
|
};
|
|
56
56
|
getFolderMetadataByPath = async (path) => {
|
|
57
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
57
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
58
58
|
const folderMeta = await storageClient.getFolderByPath(encodeURIComponent(path));
|
|
59
59
|
return drive_utils_1.DriveUtils.driveFolderMetaToItem({
|
|
60
60
|
...folderMeta,
|
|
@@ -2,13 +2,15 @@ import { StorageTypes } from '@internxt/sdk/dist/drive';
|
|
|
2
2
|
export declare class TrashService {
|
|
3
3
|
static readonly instance: TrashService;
|
|
4
4
|
trashItems: (payload: StorageTypes.AddItemsToTrashPayload) => Promise<void>;
|
|
5
|
-
deleteFile: (
|
|
6
|
-
|
|
5
|
+
deleteFile: (fileId: string) => Promise<{
|
|
6
|
+
deleted: boolean;
|
|
7
|
+
}>;
|
|
8
|
+
deleteFolder: (folderId: string) => Promise<void>;
|
|
7
9
|
clearTrash: () => Promise<void>;
|
|
8
10
|
getTrashFolderContent: () => Promise<{
|
|
9
11
|
folders: StorageTypes.FetchPaginatedFolder[];
|
|
10
12
|
files: StorageTypes.FetchPaginatedFile[];
|
|
11
13
|
}>;
|
|
12
|
-
private getAllTrashSubfolders;
|
|
13
|
-
private getAllTrashSubfiles;
|
|
14
|
+
private readonly getAllTrashSubfolders;
|
|
15
|
+
private readonly getAllTrashSubfiles;
|
|
14
16
|
}
|
|
@@ -5,16 +5,16 @@ const sdk_manager_service_1 = require("../sdk-manager.service");
|
|
|
5
5
|
class TrashService {
|
|
6
6
|
static instance = new TrashService();
|
|
7
7
|
trashItems = (payload) => {
|
|
8
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
8
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
9
9
|
return storageClient.addItemsToTrash(payload);
|
|
10
10
|
};
|
|
11
|
-
deleteFile = (
|
|
12
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
13
|
-
return storageClient.
|
|
11
|
+
deleteFile = (fileId) => {
|
|
12
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
13
|
+
return storageClient.deleteFileByUuid(fileId);
|
|
14
14
|
};
|
|
15
15
|
deleteFolder = (folderId) => {
|
|
16
|
-
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(
|
|
17
|
-
return storageClient.
|
|
16
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
17
|
+
return storageClient.deleteFolderByUuid(folderId);
|
|
18
18
|
};
|
|
19
19
|
clearTrash = () => {
|
|
20
20
|
const storageClient = sdk_manager_service_1.SdkManager.instance.getTrash();
|
|
@@ -12,11 +12,9 @@ export declare class SdkManager {
|
|
|
12
12
|
throwErrorOnMissingCredentials: boolean;
|
|
13
13
|
}) => SdkManagerApiSecurity;
|
|
14
14
|
static readonly getAppDetails: () => AppDetails;
|
|
15
|
-
getAuth(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
getReferrals(): Drive.Referrals;
|
|
19
|
-
getStorage(useNewApi?: boolean): Drive.Storage;
|
|
15
|
+
getAuth(): Auth;
|
|
16
|
+
getUsers(): Drive.Users;
|
|
17
|
+
getStorage(): Drive.Storage;
|
|
20
18
|
getTrash(): Drive.Trash;
|
|
21
19
|
getShare(): Drive.Share;
|
|
22
20
|
getNetwork(credentials: {
|
|
@@ -25,68 +25,48 @@ class SdkManager {
|
|
|
25
25
|
};
|
|
26
26
|
static getAppDetails = () => {
|
|
27
27
|
return {
|
|
28
|
-
clientName: package_json_1.default.
|
|
28
|
+
clientName: package_json_1.default.clientName,
|
|
29
29
|
clientVersion: package_json_1.default.version,
|
|
30
30
|
};
|
|
31
31
|
};
|
|
32
|
-
getAuth(
|
|
33
|
-
const DRIVE_API_URL =
|
|
34
|
-
? config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL')
|
|
35
|
-
: config_service_1.ConfigService.instance.get('DRIVE_API_URL');
|
|
32
|
+
getAuth() {
|
|
33
|
+
const DRIVE_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
|
|
36
34
|
const apiSecurity = SdkManager.getApiSecurity({ throwErrorOnMissingCredentials: false });
|
|
37
35
|
const appDetails = SdkManager.getAppDetails();
|
|
38
36
|
return sdk_1.Auth.client(DRIVE_API_URL, appDetails, {
|
|
39
|
-
token:
|
|
37
|
+
token: apiSecurity?.newToken,
|
|
40
38
|
});
|
|
41
39
|
}
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
const newToken = SdkManager.getApiSecurity().newToken;
|
|
45
|
-
const appDetails = SdkManager.getAppDetails();
|
|
46
|
-
return sdk_1.Drive.Payments.client(PAYMENTS_API_URL, appDetails, {
|
|
47
|
-
token: newToken,
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
getUsers(useNewApi = false) {
|
|
51
|
-
const DRIVE_API_URL = useNewApi
|
|
52
|
-
? config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL')
|
|
53
|
-
: config_service_1.ConfigService.instance.get('DRIVE_API_URL');
|
|
40
|
+
getUsers() {
|
|
41
|
+
const DRIVE_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
|
|
54
42
|
const apiSecurity = SdkManager.getApiSecurity({ throwErrorOnMissingCredentials: false });
|
|
55
43
|
const appDetails = SdkManager.getAppDetails();
|
|
56
44
|
return sdk_1.Drive.Users.client(DRIVE_API_URL, appDetails, {
|
|
57
|
-
token:
|
|
45
|
+
token: apiSecurity.newToken,
|
|
58
46
|
});
|
|
59
47
|
}
|
|
60
|
-
|
|
61
|
-
const DRIVE_API_URL = config_service_1.ConfigService.instance.get('
|
|
62
|
-
const apiSecurity = SdkManager.getApiSecurity();
|
|
63
|
-
const appDetails = SdkManager.getAppDetails();
|
|
64
|
-
return sdk_1.Drive.Referrals.client(DRIVE_API_URL, appDetails, apiSecurity);
|
|
65
|
-
}
|
|
66
|
-
getStorage(useNewApi = false) {
|
|
67
|
-
const DRIVE_API_URL = useNewApi
|
|
68
|
-
? config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL')
|
|
69
|
-
: config_service_1.ConfigService.instance.get('DRIVE_API_URL');
|
|
48
|
+
getStorage() {
|
|
49
|
+
const DRIVE_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
|
|
70
50
|
const apiSecurity = SdkManager.getApiSecurity();
|
|
71
51
|
const appDetails = SdkManager.getAppDetails();
|
|
72
52
|
return sdk_1.Drive.Storage.client(DRIVE_API_URL, appDetails, {
|
|
73
|
-
token:
|
|
53
|
+
token: apiSecurity.newToken,
|
|
74
54
|
});
|
|
75
55
|
}
|
|
76
56
|
getTrash() {
|
|
77
57
|
const DRIVE_NEW_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
|
|
78
|
-
const
|
|
58
|
+
const apiSecurity = SdkManager.getApiSecurity();
|
|
79
59
|
const appDetails = SdkManager.getAppDetails();
|
|
80
60
|
return drive_1.Trash.client(DRIVE_NEW_API_URL, appDetails, {
|
|
81
|
-
token: newToken,
|
|
61
|
+
token: apiSecurity.newToken,
|
|
82
62
|
});
|
|
83
63
|
}
|
|
84
64
|
getShare() {
|
|
85
65
|
const DRIVE_NEW_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
|
|
86
|
-
const
|
|
66
|
+
const apiSecurity = SdkManager.getApiSecurity();
|
|
87
67
|
const appDetails = SdkManager.getAppDetails();
|
|
88
68
|
return sdk_1.Drive.Share.client(DRIVE_NEW_API_URL, appDetails, {
|
|
89
|
-
token: newToken,
|
|
69
|
+
token: apiSecurity.newToken,
|
|
90
70
|
});
|
|
91
71
|
}
|
|
92
72
|
getNetwork(credentials) {
|
|
@@ -2,6 +2,6 @@ import { StorageTypes } from '@internxt/sdk/dist/drive';
|
|
|
2
2
|
import { NetworkFacade } from './network/network-facade.service';
|
|
3
3
|
export declare class ThumbnailService {
|
|
4
4
|
static readonly instance: ThumbnailService;
|
|
5
|
-
uploadThumbnail: (fileContent: Buffer, fileType: string, userBucket: string, file_id:
|
|
6
|
-
private getThumbnailFromImageBuffer;
|
|
5
|
+
uploadThumbnail: (fileContent: Buffer, fileType: string, userBucket: string, file_id: string, networkFacade: NetworkFacade) => Promise<StorageTypes.Thumbnail | undefined>;
|
|
6
|
+
private readonly getThumbnailFromImageBuffer;
|
|
7
7
|
}
|
|
@@ -27,14 +27,14 @@ class ThumbnailService {
|
|
|
27
27
|
}, () => { });
|
|
28
28
|
});
|
|
29
29
|
const createdThumbnailFile = await drive_file_service_1.DriveFileService.instance.createThumbnail({
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
fileUuid: file_id,
|
|
31
|
+
maxWidth: thumbnail_utils_1.ThumbnailConfig.MaxWidth,
|
|
32
|
+
maxHeight: thumbnail_utils_1.ThumbnailConfig.MaxHeight,
|
|
33
33
|
type: thumbnail_utils_1.ThumbnailConfig.Type,
|
|
34
34
|
size: size,
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
bucketId: userBucket,
|
|
36
|
+
bucketFile: fileId,
|
|
37
|
+
encryptVersion: drive_1.StorageTypes.EncryptionVersion.Aes03,
|
|
38
38
|
});
|
|
39
39
|
return createdThumbnailFile;
|
|
40
40
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { UsageResponseV2 } from '@internxt/sdk/dist/drive/storage/types';
|
|
2
2
|
export declare class UsageService {
|
|
3
3
|
static readonly instance: UsageService;
|
|
4
4
|
static readonly INFINITE_LIMIT: number;
|
|
5
|
-
fetchUsage: () => Promise<
|
|
5
|
+
fetchUsage: () => Promise<UsageResponseV2>;
|
|
6
6
|
fetchSpaceLimit: () => Promise<number>;
|
|
7
7
|
}
|
|
@@ -7,12 +7,12 @@ class UsageService {
|
|
|
7
7
|
static INFINITE_LIMIT = 99 * Math.pow(1024, 4);
|
|
8
8
|
fetchUsage = async () => {
|
|
9
9
|
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
10
|
-
const driveUsage = await storageClient.
|
|
10
|
+
const driveUsage = await storageClient.spaceUsageV2();
|
|
11
11
|
return driveUsage;
|
|
12
12
|
};
|
|
13
13
|
fetchSpaceLimit = async () => {
|
|
14
14
|
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
15
|
-
const spaceLimit = await storageClient.
|
|
15
|
+
const spaceLimit = await storageClient.spaceLimitV2();
|
|
16
16
|
return spaceLimit.maxSpaceBytes;
|
|
17
17
|
};
|
|
18
18
|
}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
export interface ConfigKeys {
|
|
2
|
-
readonly
|
|
3
|
-
readonly DRIVE_API_URL: string;
|
|
2
|
+
readonly DRIVE_WEB_URL: string;
|
|
4
3
|
readonly DRIVE_NEW_API_URL: string;
|
|
5
|
-
readonly PAYMENTS_API_URL: string;
|
|
6
4
|
readonly APP_CRYPTO_SECRET: string;
|
|
7
|
-
readonly APP_CRYPTO_SECRET2: string;
|
|
8
5
|
readonly APP_MAGIC_IV: string;
|
|
9
6
|
readonly APP_MAGIC_SALT: string;
|
|
10
7
|
readonly NETWORK_URL: string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import pm2 from 'pm2';
|
|
2
2
|
export type WebDavProcessStatus = 'online' | 'stopping' | 'stopped' | 'launching' | 'errored' | 'one-launch-status' | 'offline' | 'unknown';
|
|
3
3
|
export declare class PM2Utils {
|
|
4
|
-
private static WEBDAV_APP_NAME;
|
|
4
|
+
private static readonly WEBDAV_APP_NAME;
|
|
5
5
|
static connect(): Promise<void>;
|
|
6
6
|
static disconnect(): void;
|
|
7
7
|
static clean(): Promise<void>;
|
|
@@ -31,14 +31,14 @@ const thumbnailableImageExtension = [
|
|
|
31
31
|
const thumbnailablePdfExtension = pdfExtensions['pdf'];
|
|
32
32
|
const thumbnailableExtension = [...thumbnailableImageExtension];
|
|
33
33
|
const isFileThumbnailable = (fileType) => {
|
|
34
|
-
return fileType.trim().length > 0 && thumbnailableExtension.includes(fileType);
|
|
34
|
+
return fileType.trim().length > 0 && thumbnailableExtension.includes(fileType.trim().toLowerCase());
|
|
35
35
|
};
|
|
36
36
|
exports.isFileThumbnailable = isFileThumbnailable;
|
|
37
37
|
const isPDFThumbnailable = (fileType) => {
|
|
38
|
-
return fileType.trim().length > 0 && thumbnailablePdfExtension.includes(fileType);
|
|
38
|
+
return fileType.trim().length > 0 && thumbnailablePdfExtension.includes(fileType.trim().toLowerCase());
|
|
39
39
|
};
|
|
40
40
|
exports.isPDFThumbnailable = isPDFThumbnailable;
|
|
41
41
|
const isImageThumbnailable = (fileType) => {
|
|
42
|
-
return fileType.trim().length > 0 && thumbnailableImageExtension.includes(fileType);
|
|
42
|
+
return fileType.trim().length > 0 && thumbnailableImageExtension.includes(fileType.trim().toLowerCase());
|
|
43
43
|
};
|
|
44
44
|
exports.isImageThumbnailable = isImageThumbnailable;
|
|
@@ -7,10 +7,9 @@ export declare class WebDavUtils {
|
|
|
7
7
|
static joinURL(...pathComponents: string[]): string;
|
|
8
8
|
static removeHostFromURL(completeURL: string): string;
|
|
9
9
|
static getRequestedResource(urlObject: string | Request, decodeUri?: boolean): Promise<WebDavRequestedResource>;
|
|
10
|
-
static getDriveItemFromResource(resource
|
|
11
|
-
static getAndSearchItemFromResource({ resource, driveFolderService, driveFileService, }: {
|
|
10
|
+
static getDriveItemFromResource({ resource, driveFolderService, driveFileService, }: {
|
|
12
11
|
resource: WebDavRequestedResource;
|
|
13
12
|
driveFolderService?: DriveFolderService;
|
|
14
13
|
driveFileService?: DriveFileService;
|
|
15
|
-
}): Promise<DriveFileItem | DriveFolderItem>;
|
|
14
|
+
}): Promise<DriveFileItem | DriveFolderItem | undefined>;
|
|
16
15
|
}
|
|
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.WebDavUtils = void 0;
|
|
7
7
|
const node_path_1 = __importDefault(require("node:path"));
|
|
8
|
-
const errors_utils_1 = require("./errors.utils");
|
|
9
8
|
class WebDavUtils {
|
|
10
9
|
static joinURL(...pathComponents) {
|
|
11
10
|
return node_path_1.default.posix.join(...pathComponents);
|
|
@@ -55,30 +54,19 @@ class WebDavUtils {
|
|
|
55
54
|
};
|
|
56
55
|
}
|
|
57
56
|
}
|
|
58
|
-
static async getDriveItemFromResource(resource, driveFolderService, driveFileService) {
|
|
57
|
+
static async getDriveItemFromResource({ resource, driveFolderService, driveFileService, }) {
|
|
59
58
|
let item = undefined;
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
try {
|
|
60
|
+
if (resource.type === 'folder') {
|
|
62
61
|
item = await driveFolderService?.getFolderMetadataByPath(resource.url);
|
|
63
62
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
throw new errors_utils_1.ConflictError(`Resource not found on Internxt Drive at ${resource.url}`);
|
|
67
|
-
}
|
|
68
|
-
throw error;
|
|
63
|
+
if (resource.type === 'file') {
|
|
64
|
+
item = await driveFileService?.getFileMetadataByPath(resource.url);
|
|
69
65
|
}
|
|
70
66
|
}
|
|
71
|
-
|
|
72
|
-
item = await driveFileService?.getFileMetadataByPath(resource.url);
|
|
67
|
+
catch {
|
|
73
68
|
}
|
|
74
69
|
return item;
|
|
75
70
|
}
|
|
76
|
-
static async getAndSearchItemFromResource({ resource, driveFolderService, driveFileService, }) {
|
|
77
|
-
const driveItem = await this.getDriveItemFromResource(resource, driveFolderService, driveFileService);
|
|
78
|
-
if (!driveItem) {
|
|
79
|
-
throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
|
|
80
|
-
}
|
|
81
|
-
return driveItem;
|
|
82
|
-
}
|
|
83
71
|
}
|
|
84
72
|
exports.WebDavUtils = WebDavUtils;
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.DELETERequestHandler = void 0;
|
|
4
4
|
const webdav_utils_1 = require("../../utils/webdav.utils");
|
|
5
5
|
const logger_utils_1 = require("../../utils/logger.utils");
|
|
6
|
+
const errors_utils_1 = require("../../utils/errors.utils");
|
|
6
7
|
class DELETERequestHandler {
|
|
7
8
|
dependencies;
|
|
8
9
|
constructor(dependencies) {
|
|
@@ -12,11 +13,14 @@ class DELETERequestHandler {
|
|
|
12
13
|
const { driveFileService, driveFolderService, trashService } = this.dependencies;
|
|
13
14
|
const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req);
|
|
14
15
|
logger_utils_1.webdavLogger.info(`[DELETE] Request received for ${resource.type} at ${resource.url}`);
|
|
15
|
-
const driveItem = await webdav_utils_1.WebDavUtils.
|
|
16
|
+
const driveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
|
|
16
17
|
resource,
|
|
17
18
|
driveFolderService,
|
|
18
19
|
driveFileService: driveFileService,
|
|
19
20
|
});
|
|
21
|
+
if (!driveItem) {
|
|
22
|
+
throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
|
|
23
|
+
}
|
|
20
24
|
logger_utils_1.webdavLogger.info(`[DELETE] [${driveItem.uuid}] Trashing ${resource.type}`);
|
|
21
25
|
await trashService.trashItems({
|
|
22
26
|
items: [{ type: resource.type, uuid: driveItem.uuid }],
|
|
@@ -18,10 +18,14 @@ class GETRequestHandler {
|
|
|
18
18
|
if (resource.type === 'folder')
|
|
19
19
|
throw new errors_utils_1.NotFoundError('Folders cannot be listed with GET. Use PROPFIND instead.');
|
|
20
20
|
logger_utils_1.webdavLogger.info(`[GET] Request received for ${resource.type} at ${resource.url}`);
|
|
21
|
-
const
|
|
21
|
+
const driveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
|
|
22
22
|
resource,
|
|
23
23
|
driveFileService,
|
|
24
|
-
})
|
|
24
|
+
});
|
|
25
|
+
if (!driveItem) {
|
|
26
|
+
throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
|
|
27
|
+
}
|
|
28
|
+
const driveFile = driveItem;
|
|
25
29
|
logger_utils_1.webdavLogger.info(`[GET] [${driveFile.uuid}] Found Drive File`);
|
|
26
30
|
const { user } = await authService.getAuthDetails();
|
|
27
31
|
logger_utils_1.webdavLogger.info(`[GET] [${driveFile.uuid}] Network ready for download`);
|
|
@@ -4,6 +4,7 @@ exports.HEADRequestHandler = void 0;
|
|
|
4
4
|
const webdav_utils_1 = require("../../utils/webdav.utils");
|
|
5
5
|
const logger_utils_1 = require("../../utils/logger.utils");
|
|
6
6
|
const network_utils_1 = require("../../utils/network.utils");
|
|
7
|
+
const errors_utils_1 = require("../../utils/errors.utils");
|
|
7
8
|
class HEADRequestHandler {
|
|
8
9
|
dependencies;
|
|
9
10
|
constructor(dependencies) {
|
|
@@ -18,10 +19,14 @@ class HEADRequestHandler {
|
|
|
18
19
|
}
|
|
19
20
|
logger_utils_1.webdavLogger.info(`[HEAD] Request received for ${resource.type} at ${resource.url}`);
|
|
20
21
|
try {
|
|
21
|
-
const
|
|
22
|
+
const driveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
|
|
22
23
|
resource,
|
|
23
24
|
driveFileService,
|
|
24
|
-
})
|
|
25
|
+
});
|
|
26
|
+
if (!driveItem) {
|
|
27
|
+
throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
|
|
28
|
+
}
|
|
29
|
+
const driveFile = driveItem;
|
|
25
30
|
logger_utils_1.webdavLogger.info(`[HEAD] [${driveFile.uuid}] Found Drive File`);
|
|
26
31
|
const range = req.headers['range'];
|
|
27
32
|
const rangeOptions = network_utils_1.NetworkUtils.parseRangeHeader({
|
|
@@ -16,17 +16,19 @@ class MKCOLRequestHandler {
|
|
|
16
16
|
const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req);
|
|
17
17
|
logger_utils_1.webdavLogger.info(`[MKCOL] Request received for ${resource.type} at ${resource.url}`);
|
|
18
18
|
const parentResource = await webdav_utils_1.WebDavUtils.getRequestedResource(resource.parentPath, false);
|
|
19
|
-
const
|
|
19
|
+
const parentDriveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
|
|
20
20
|
resource: parentResource,
|
|
21
21
|
driveFolderService,
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
await driveFolderService.getFolderMetadataByPath(resource.url);
|
|
26
|
-
}
|
|
27
|
-
catch {
|
|
28
|
-
folderAlreadyExists = false;
|
|
22
|
+
});
|
|
23
|
+
if (!parentDriveItem) {
|
|
24
|
+
throw new errors_utils_1.ConflictError(`Parent folders not found on Internxt Drive at ${resource.url}`);
|
|
29
25
|
}
|
|
26
|
+
const parentFolderItem = parentDriveItem;
|
|
27
|
+
const driveFolderItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
|
|
28
|
+
resource,
|
|
29
|
+
driveFolderService,
|
|
30
|
+
});
|
|
31
|
+
const folderAlreadyExists = !!driveFolderItem;
|
|
30
32
|
if (folderAlreadyExists) {
|
|
31
33
|
logger_utils_1.webdavLogger.info(`[MKCOL] ❌ Folder '${resource.url}' already exists`);
|
|
32
34
|
throw new errors_utils_1.MethodNotAllowed('Folder already exists');
|
|
@@ -20,11 +20,14 @@ class MOVERequestHandler {
|
|
|
20
20
|
const destinationPath = webdav_utils_1.WebDavUtils.removeHostFromURL(destinationUrl);
|
|
21
21
|
const destinationResource = await webdav_utils_1.WebDavUtils.getRequestedResource(destinationPath);
|
|
22
22
|
logger_utils_1.webdavLogger.info('[MOVE] Destination resource found', { destinationResource });
|
|
23
|
-
const originalDriveItem = await webdav_utils_1.WebDavUtils.
|
|
23
|
+
const originalDriveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
|
|
24
24
|
resource,
|
|
25
25
|
driveFolderService,
|
|
26
26
|
driveFileService,
|
|
27
27
|
});
|
|
28
|
+
if (!originalDriveItem) {
|
|
29
|
+
throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
|
|
30
|
+
}
|
|
28
31
|
if (destinationResource.path.dir === resource.path.dir) {
|
|
29
32
|
logger_utils_1.webdavLogger.info(`[MOVE] Renaming ${resource.type} with UUID ${originalDriveItem.uuid} to ${destinationResource.name}`);
|
|
30
33
|
const newName = destinationResource.name;
|
|
@@ -47,10 +50,14 @@ class MOVERequestHandler {
|
|
|
47
50
|
else {
|
|
48
51
|
logger_utils_1.webdavLogger.info(`[MOVE] Moving ${resource.type} with UUID ${originalDriveItem.uuid} to ${destinationPath}`);
|
|
49
52
|
const destinationFolderResource = await webdav_utils_1.WebDavUtils.getRequestedResource(destinationResource.parentPath);
|
|
50
|
-
const
|
|
53
|
+
const destinationDriveFolderItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
|
|
51
54
|
resource: destinationFolderResource,
|
|
52
55
|
driveFolderService,
|
|
53
|
-
})
|
|
56
|
+
});
|
|
57
|
+
if (!destinationDriveFolderItem) {
|
|
58
|
+
throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
|
|
59
|
+
}
|
|
60
|
+
const destinationFolderItem = destinationDriveFolderItem;
|
|
54
61
|
if (resource.type === 'folder') {
|
|
55
62
|
const folder = originalDriveItem;
|
|
56
63
|
await driveFolderService.moveFolder({
|
|
@@ -13,23 +13,20 @@ class OPTIONSRequestHandler {
|
|
|
13
13
|
res.header('Allow', 'DELETE, GET, HEAD, MKCOL, MOVE, OPTIONS, PROPFIND, PUT');
|
|
14
14
|
res.header('DAV', '1, 2, ordered-collections');
|
|
15
15
|
res.status(200).send();
|
|
16
|
-
return;
|
|
17
16
|
}
|
|
18
|
-
if (resource.type === 'folder') {
|
|
17
|
+
else if (resource.type === 'folder') {
|
|
19
18
|
const allowedMethods = 'DELETE, HEAD, MKCOL, MOVE, OPTIONS, PROPFIND';
|
|
20
19
|
logger_utils_1.webdavLogger.info(`[OPTIONS] Returning Allowed Options: ${allowedMethods}`);
|
|
21
20
|
res.header('Allow', allowedMethods);
|
|
22
21
|
res.header('DAV', '1, 2, ordered-collections');
|
|
23
22
|
res.status(200).send();
|
|
24
|
-
return;
|
|
25
23
|
}
|
|
26
|
-
|
|
24
|
+
else {
|
|
27
25
|
const allowedMethods = 'DELETE, GET, HEAD, MOVE, OPTIONS, PROPFIND, PUT';
|
|
28
26
|
logger_utils_1.webdavLogger.info(`[OPTIONS] Returning Allowed Options: ${allowedMethods}`);
|
|
29
27
|
res.header('Allow', allowedMethods);
|
|
30
28
|
res.header('DAV', '1, 2, ordered-collections');
|
|
31
29
|
res.status(200).send();
|
|
32
|
-
return;
|
|
33
30
|
}
|
|
34
31
|
};
|
|
35
32
|
}
|
|
@@ -20,27 +20,12 @@ class PROPFINDRequestHandler {
|
|
|
20
20
|
const { driveFolderService, driveFileService } = this.dependencies;
|
|
21
21
|
const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req);
|
|
22
22
|
logger_utils_1.webdavLogger.info(`[PROPFIND] Request received for ${resource.type} at ${resource.url}`);
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
switch (resource.type) {
|
|
30
|
-
case 'file': {
|
|
31
|
-
const fileMetaXML = await this.getFileMetaXML(resource, driveItem);
|
|
32
|
-
res.status(207).send(fileMetaXML);
|
|
33
|
-
break;
|
|
34
|
-
}
|
|
35
|
-
case 'folder': {
|
|
36
|
-
const depth = req.header('depth') ?? '1';
|
|
37
|
-
const folderMetaXML = await this.getFolderContentXML(resource, driveItem, depth);
|
|
38
|
-
res.status(207).send(folderMetaXML);
|
|
39
|
-
break;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
23
|
+
const driveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
|
|
24
|
+
resource,
|
|
25
|
+
driveFolderService,
|
|
26
|
+
driveFileService,
|
|
27
|
+
});
|
|
28
|
+
if (!driveItem) {
|
|
44
29
|
res.status(207).send(xml_utils_1.XMLUtils.toWebDavXML({
|
|
45
30
|
[xml_utils_1.XMLUtils.addDefaultNamespace('response')]: {
|
|
46
31
|
[xml_utils_1.XMLUtils.addDefaultNamespace('href')]: xml_utils_1.XMLUtils.encodeWebDavUri(resource.url),
|
|
@@ -53,6 +38,20 @@ class PROPFINDRequestHandler {
|
|
|
53
38
|
ignoreAttributes: false,
|
|
54
39
|
suppressEmptyNode: true,
|
|
55
40
|
}));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
switch (resource.type) {
|
|
44
|
+
case 'file': {
|
|
45
|
+
const fileMetaXML = await this.getFileMetaXML(resource, driveItem);
|
|
46
|
+
res.status(207).send(fileMetaXML);
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
case 'folder': {
|
|
50
|
+
const depth = req.header('depth') ?? '1';
|
|
51
|
+
const folderMetaXML = await this.getFolderContentXML(resource, driveItem, depth);
|
|
52
|
+
res.status(207).send(folderMetaXML);
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
56
55
|
}
|
|
57
56
|
};
|
|
58
57
|
getFileMetaXML = async (resource, driveFileItem) => {
|
|
@@ -27,12 +27,16 @@ class PUTRequestHandler {
|
|
|
27
27
|
logger_utils_1.webdavLogger.info(`[PUT] Request received for ${resource.type} at ${resource.url}`);
|
|
28
28
|
logger_utils_1.webdavLogger.info(`[PUT] Uploading '${resource.name}' to '${resource.parentPath}'`);
|
|
29
29
|
const parentResource = await webdav_utils_1.WebDavUtils.getRequestedResource(resource.parentPath, false);
|
|
30
|
-
const
|
|
30
|
+
const parentDriveFolderItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
|
|
31
31
|
resource: parentResource,
|
|
32
32
|
driveFolderService,
|
|
33
|
-
})
|
|
33
|
+
});
|
|
34
|
+
if (!parentDriveFolderItem) {
|
|
35
|
+
throw new errors_utils_1.ConflictError(`Parent folders not found on Internxt Drive at ${resource.url}`);
|
|
36
|
+
}
|
|
37
|
+
const parentFolderItem = parentDriveFolderItem;
|
|
34
38
|
try {
|
|
35
|
-
const driveFileItem = (await webdav_utils_1.WebDavUtils.
|
|
39
|
+
const driveFileItem = (await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
|
|
36
40
|
resource: resource,
|
|
37
41
|
driveFileService,
|
|
38
42
|
}));
|
|
@@ -93,7 +97,7 @@ class PUTRequestHandler {
|
|
|
93
97
|
if (isThumbnailable && bufferStream) {
|
|
94
98
|
const thumbnailBuffer = bufferStream.getBuffer();
|
|
95
99
|
if (thumbnailBuffer) {
|
|
96
|
-
await thumbnail_service_1.ThumbnailService.instance.uploadThumbnail(thumbnailBuffer, fileType, user.bucket, file.
|
|
100
|
+
await thumbnail_service_1.ThumbnailService.instance.uploadThumbnail(thumbnailBuffer, fileType, user.bucket, file.uuid, networkFacade);
|
|
97
101
|
}
|
|
98
102
|
}
|
|
99
103
|
}
|
package/dist/webdav/index.js
CHANGED
|
@@ -15,7 +15,7 @@ const crypto_service_1 = require("../services/crypto.service");
|
|
|
15
15
|
const trash_service_1 = require("../services/drive/trash.service");
|
|
16
16
|
const logger_utils_1 = require("../utils/logger.utils");
|
|
17
17
|
const sdk_manager_service_1 = require("../services/sdk-manager.service");
|
|
18
|
-
dotenv_1.default.config();
|
|
18
|
+
dotenv_1.default.config({ quiet: true });
|
|
19
19
|
const init = async () => {
|
|
20
20
|
await config_service_1.ConfigService.instance.ensureInternxtCliDataDirExists();
|
|
21
21
|
await config_service_1.ConfigService.instance.ensureWebdavCertsDirExists();
|
package/oclif.manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"author": "Internxt <hello@internxt.com>",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.4",
|
|
4
4
|
"description": "Internxt CLI to manage your encrypted storage",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "yarn clean && tsc",
|
|
7
|
-
"clean": "rimraf dist tsconfig.tsbuildinfo oclif.manifest.json",
|
|
7
|
+
"clean": "rimraf dist coverage tsconfig.tsbuildinfo oclif.manifest.json",
|
|
8
8
|
"lint": "eslint .",
|
|
9
9
|
"pretty": "prettier --write **/*.{js,jsx,tsx,ts}",
|
|
10
10
|
"postpack": "rimraf oclif.manifest.json",
|
|
@@ -17,13 +17,14 @@
|
|
|
17
17
|
"dev:webdav": "nodemon -e ts --exec ts-node src/webdav/index.ts",
|
|
18
18
|
"pack:win": "oclif pack win",
|
|
19
19
|
"publish:npm": "npm run build && npm publish --scope=@internxt --registry=https://registry.npmjs.org/ --access public",
|
|
20
|
-
"publish:github": "npm run build && npm publish --scope=@internxt --registry=https://npm.pkg.github.com",
|
|
20
|
+
"publish:github": "npm run build && npm publish --scope=@internxt --registry=https://npm.pkg.github.com --tag latest",
|
|
21
21
|
"postinstall": "node ./scripts/restart-webdav.js"
|
|
22
22
|
},
|
|
23
23
|
"homepage": "https://github.com/internxt/cli",
|
|
24
24
|
"license": "MIT",
|
|
25
25
|
"main": "",
|
|
26
26
|
"name": "@internxt/cli",
|
|
27
|
+
"clientName": "internxt-cli",
|
|
27
28
|
"repository": "https://github.com/internxt/cli",
|
|
28
29
|
"bugs": "https://github.com/internxt/cli",
|
|
29
30
|
"types": "dist/index.d.ts",
|
|
@@ -35,61 +36,61 @@
|
|
|
35
36
|
"/oclif.manifest.json"
|
|
36
37
|
],
|
|
37
38
|
"dependencies": {
|
|
38
|
-
"@inquirer/prompts": "7.
|
|
39
|
-
"@internxt/inxt-js": "2.
|
|
40
|
-
"@internxt/lib": "1.
|
|
41
|
-
"@internxt/sdk": "1.
|
|
42
|
-
"@oclif/core": "4.
|
|
43
|
-
"@types/validator": "13.15.
|
|
39
|
+
"@inquirer/prompts": "7.6.0",
|
|
40
|
+
"@internxt/inxt-js": "2.2.2",
|
|
41
|
+
"@internxt/lib": "1.3.1",
|
|
42
|
+
"@internxt/sdk": "1.10.5",
|
|
43
|
+
"@oclif/core": "4.4.1",
|
|
44
|
+
"@types/validator": "13.15.2",
|
|
44
45
|
"async": "3.2.6",
|
|
45
|
-
"axios": "1.
|
|
46
|
+
"axios": "1.10.0",
|
|
46
47
|
"bip39": "3.1.0",
|
|
47
48
|
"body-parser": "2.2.0",
|
|
48
49
|
"cli-progress": "3.12.0",
|
|
49
50
|
"dayjs": "1.11.13",
|
|
50
|
-
"dotenv": "
|
|
51
|
+
"dotenv": "17.0.1",
|
|
51
52
|
"express": "5.1.0",
|
|
52
53
|
"express-async-handler": "1.2.0",
|
|
53
54
|
"express-basic-auth": "1.2.1",
|
|
54
|
-
"fast-xml-parser": "5.2.
|
|
55
|
+
"fast-xml-parser": "5.2.5",
|
|
55
56
|
"mime-types": "3.0.1",
|
|
56
|
-
"openpgp": "5.11.
|
|
57
|
-
"pm2": "6.0.
|
|
57
|
+
"openpgp": "5.11.3",
|
|
58
|
+
"pm2": "6.0.8",
|
|
58
59
|
"range-parser": "1.2.1",
|
|
59
60
|
"reflect-metadata": "0.2.2",
|
|
60
61
|
"selfsigned": "2.4.1",
|
|
61
|
-
"sharp": "0.34.
|
|
62
|
+
"sharp": "0.34.2",
|
|
62
63
|
"tty-table": "4.2.3",
|
|
63
64
|
"winston": "3.17.0"
|
|
64
65
|
},
|
|
65
66
|
"devDependencies": {
|
|
66
67
|
"@internxt/eslint-config-internxt": "2.0.0",
|
|
67
68
|
"@internxt/prettier-config": "internxt/prettier-config#v1.0.2",
|
|
68
|
-
"@oclif/test": "4.1.
|
|
69
|
+
"@oclif/test": "4.1.13",
|
|
69
70
|
"@openpgp/web-stream-tools": "0.0.11-patch-1",
|
|
70
71
|
"@types/async": "3.2.24",
|
|
71
72
|
"@types/cli-progress": "3.11.6",
|
|
72
|
-
"@types/express": "5.0.
|
|
73
|
-
"@types/mime-types": "
|
|
74
|
-
"@types/node": "22.
|
|
73
|
+
"@types/express": "5.0.3",
|
|
74
|
+
"@types/mime-types": "3.0.1",
|
|
75
|
+
"@types/node": "22.16.0",
|
|
75
76
|
"@types/range-parser": "1.2.7",
|
|
76
|
-
"@vitest/coverage-istanbul": "3.
|
|
77
|
-
"@vitest/spy": "3.
|
|
78
|
-
"eslint": "9.
|
|
77
|
+
"@vitest/coverage-istanbul": "3.2.4",
|
|
78
|
+
"@vitest/spy": "3.2.4",
|
|
79
|
+
"eslint": "9.30.1",
|
|
79
80
|
"husky": "9.1.7",
|
|
80
|
-
"lint-staged": "
|
|
81
|
-
"nock": "14.0.
|
|
81
|
+
"lint-staged": "16.1.2",
|
|
82
|
+
"nock": "14.0.5",
|
|
82
83
|
"nodemon": "3.1.10",
|
|
83
|
-
"oclif": "4.
|
|
84
|
-
"prettier": "3.
|
|
84
|
+
"oclif": "4.20.1",
|
|
85
|
+
"prettier": "3.6.2",
|
|
85
86
|
"rimraf": "6.0.1",
|
|
86
87
|
"ts-node": "10.9.2",
|
|
87
88
|
"typescript": "5.8.3",
|
|
88
|
-
"vitest": "3.
|
|
89
|
+
"vitest": "3.2.4",
|
|
89
90
|
"vitest-mock-express": "2.2.0"
|
|
90
91
|
},
|
|
91
92
|
"engines": {
|
|
92
|
-
"node": ">=
|
|
93
|
+
"node": ">=22.12.0"
|
|
93
94
|
},
|
|
94
95
|
"bin": {
|
|
95
96
|
"internxt": "./bin/run.js"
|