@internxt/cli 1.5.8 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +187 -95
  2. package/dist/commands/create-folder.d.ts +3 -3
  3. package/dist/commands/delete-permanently-file.d.ts +2 -2
  4. package/dist/commands/delete-permanently-folder.d.ts +2 -2
  5. package/dist/commands/download-file.d.ts +4 -5
  6. package/dist/commands/download-file.js +22 -37
  7. package/dist/commands/list.d.ts +4 -4
  8. package/dist/commands/login-legacy.d.ts +24 -0
  9. package/dist/commands/login-legacy.js +175 -0
  10. package/dist/commands/login.d.ts +3 -9
  11. package/dist/commands/login.js +18 -132
  12. package/dist/commands/move-file.d.ts +4 -4
  13. package/dist/commands/move-folder.d.ts +3 -3
  14. package/dist/commands/rename-file.d.ts +3 -3
  15. package/dist/commands/rename-folder.d.ts +3 -3
  16. package/dist/commands/trash-clear.d.ts +2 -2
  17. package/dist/commands/trash-file.d.ts +2 -2
  18. package/dist/commands/trash-file.js +1 -1
  19. package/dist/commands/trash-folder.d.ts +2 -2
  20. package/dist/commands/trash-folder.js +1 -1
  21. package/dist/commands/trash-list.d.ts +2 -2
  22. package/dist/commands/trash-restore-file.d.ts +4 -4
  23. package/dist/commands/trash-restore-folder.d.ts +3 -3
  24. package/dist/commands/upload-file.d.ts +8 -8
  25. package/dist/commands/upload-file.js +7 -40
  26. package/dist/commands/upload-folder.d.ts +16 -0
  27. package/dist/commands/upload-folder.js +87 -0
  28. package/dist/commands/webdav-config.d.ts +6 -6
  29. package/dist/commands/webdav.d.ts +1 -1
  30. package/dist/commands/whoami.js +1 -1
  31. package/dist/hooks/prerun/auth_check.js +2 -1
  32. package/dist/services/auth.service.d.ts +1 -2
  33. package/dist/services/auth.service.js +11 -26
  34. package/dist/services/crypto.service.js +1 -1
  35. package/dist/services/database/drive-file/drive-file.domain.js +1 -0
  36. package/dist/services/database/drive-folder/drive-folder.domain.js +1 -0
  37. package/dist/services/drive/drive-file.service.js +1 -0
  38. package/dist/services/drive/drive-folder.service.d.ts +1 -1
  39. package/dist/services/drive/trash.service.d.ts +1 -1
  40. package/dist/services/local-filesystem/local-filesystem.service.d.ts +6 -0
  41. package/dist/services/local-filesystem/local-filesystem.service.js +57 -0
  42. package/dist/services/local-filesystem/local-filesystem.types.d.ts +13 -0
  43. package/dist/services/local-filesystem/local-filesystem.types.js +2 -0
  44. package/dist/services/network/upload/upload-facade.service.d.ts +9 -0
  45. package/dist/services/network/upload/upload-facade.service.js +53 -0
  46. package/dist/services/network/upload/upload-file.service.d.ts +7 -0
  47. package/dist/services/network/upload/upload-file.service.js +112 -0
  48. package/dist/services/network/upload/upload-folder.service.d.ts +6 -0
  49. package/dist/services/network/upload/upload-folder.service.js +62 -0
  50. package/dist/services/network/upload/upload.types.d.ts +53 -0
  51. package/dist/services/network/upload/upload.types.js +6 -0
  52. package/dist/services/thumbnail.service.js +1 -34
  53. package/dist/services/universal-link.service.d.ts +10 -0
  54. package/dist/services/universal-link.service.js +85 -0
  55. package/dist/types/command.types.d.ts +3 -2
  56. package/dist/types/command.types.js +8 -1
  57. package/dist/types/drive.types.d.ts +2 -0
  58. package/dist/types/fast-xml-parser.types.d.ts +59 -0
  59. package/dist/types/fast-xml-parser.types.js +2 -0
  60. package/dist/types/webdav.types.d.ts +0 -1
  61. package/dist/utils/cli.utils.d.ts +13 -2
  62. package/dist/utils/cli.utils.js +47 -0
  63. package/dist/utils/drive.utils.js +3 -0
  64. package/dist/utils/errors.utils.d.ts +1 -0
  65. package/dist/utils/errors.utils.js +5 -0
  66. package/dist/utils/logger.utils.js +10 -0
  67. package/dist/utils/network.utils.d.ts +2 -2
  68. package/dist/utils/network.utils.js +7 -5
  69. package/dist/utils/thumbnail.utils.d.ts +17 -0
  70. package/dist/utils/thumbnail.utils.js +29 -1
  71. package/dist/utils/webdav.utils.d.ts +12 -10
  72. package/dist/utils/webdav.utils.js +39 -29
  73. package/dist/utils/xml.utils.d.ts +1 -1
  74. package/dist/webdav/handlers/DELETE.handler.js +5 -5
  75. package/dist/webdav/handlers/GET.handler.js +43 -33
  76. package/dist/webdav/handlers/HEAD.handler.js +5 -10
  77. package/dist/webdav/handlers/MKCOL.handler.js +4 -4
  78. package/dist/webdav/handlers/MOVE.handler.js +19 -17
  79. package/dist/webdav/handlers/OPTIONS.handler.js +3 -3
  80. package/dist/webdav/handlers/PROPFIND.handler.js +7 -31
  81. package/dist/webdav/handlers/PUT.handler.d.ts +2 -0
  82. package/dist/webdav/handlers/PUT.handler.js +10 -8
  83. package/dist/webdav/services/webdav-folder.service.js +5 -4
  84. package/dist/webdav/webdav-server.js +1 -0
  85. package/oclif.manifest.json +121 -3
  86. package/package.json +33 -32
@@ -5,8 +5,8 @@ const webdav_utils_1 = require("../../utils/webdav.utils");
5
5
  const logger_utils_1 = require("../../utils/logger.utils");
6
6
  class OPTIONSRequestHandler {
7
7
  handle = async (req, res) => {
8
- const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req);
9
- logger_utils_1.webdavLogger.info(`[OPTIONS] Request received for ${resource.type} at ${resource.url}`);
8
+ const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req.url);
9
+ logger_utils_1.webdavLogger.info(`[OPTIONS] Request received for item at ${resource.url}`);
10
10
  if (resource.url === '/' || resource.url === '') {
11
11
  const allowedMethods = 'DELETE, GET, HEAD, MKCOL, MOVE, OPTIONS, PROPFIND, PUT';
12
12
  logger_utils_1.webdavLogger.info(`[OPTIONS] Returning Allowed Options: ${allowedMethods}`);
@@ -14,7 +14,7 @@ class OPTIONSRequestHandler {
14
14
  res.header('DAV', '1, 2, ordered-collections');
15
15
  res.status(200).send();
16
16
  }
17
- else if (resource.type === 'folder') {
17
+ else if (resource.url.endsWith('/')) {
18
18
  const allowedMethods = 'DELETE, HEAD, MKCOL, MOVE, OPTIONS, PROPFIND';
19
19
  logger_utils_1.webdavLogger.info(`[OPTIONS] Returning Allowed Options: ${allowedMethods}`);
20
20
  res.header('Allow', allowedMethods);
@@ -18,29 +18,18 @@ class PROPFINDRequestHandler {
18
18
  }
19
19
  handle = async (req, res) => {
20
20
  const { driveFolderService, driveFileService } = this.dependencies;
21
- const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req);
22
- logger_utils_1.webdavLogger.info(`[PROPFIND] Request received for ${resource.type} at ${resource.url}`);
21
+ const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req.url);
22
+ logger_utils_1.webdavLogger.info(`[PROPFIND] Request received for item at ${resource.url}`);
23
23
  const driveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
24
24
  resource,
25
25
  driveFolderService,
26
26
  driveFileService,
27
27
  });
28
28
  if (!driveItem) {
29
- res.status(207).send(xml_utils_1.XMLUtils.toWebDavXML({
30
- [xml_utils_1.XMLUtils.addDefaultNamespace('response')]: {
31
- [xml_utils_1.XMLUtils.addDefaultNamespace('href')]: xml_utils_1.XMLUtils.encodeWebDavUri(resource.url),
32
- [xml_utils_1.XMLUtils.addDefaultNamespace('propstat')]: {
33
- [xml_utils_1.XMLUtils.addDefaultNamespace('status')]: 'HTTP/1.1 404 Not Found',
34
- [xml_utils_1.XMLUtils.addDefaultNamespace('prop')]: {},
35
- },
36
- },
37
- }, {
38
- ignoreAttributes: false,
39
- suppressEmptyNode: true,
40
- }));
29
+ res.status(404).send();
41
30
  return;
42
31
  }
43
- switch (resource.type) {
32
+ switch (driveItem.itemType) {
44
33
  case 'file': {
45
34
  const fileMetaXML = await this.getFileMetaXML(resource, driveItem);
46
35
  res.status(207).send(fileMetaXML);
@@ -55,22 +44,7 @@ class PROPFINDRequestHandler {
55
44
  }
56
45
  };
57
46
  getFileMetaXML = async (resource, driveFileItem) => {
58
- const driveFile = this.driveFileItemToXMLNode({
59
- name: driveFileItem.name,
60
- type: driveFileItem.type,
61
- bucket: driveFileItem.bucket,
62
- id: driveFileItem.id,
63
- uuid: driveFileItem.uuid,
64
- fileId: driveFileItem.fileId,
65
- size: driveFileItem.size,
66
- createdAt: driveFileItem.createdAt,
67
- updatedAt: driveFileItem.updatedAt,
68
- status: driveFileItem.status,
69
- folderId: driveFileItem.folderId,
70
- folderUuid: driveFileItem.folderUuid,
71
- creationTime: driveFileItem.creationTime,
72
- modificationTime: driveFileItem.modificationTime,
73
- }, resource.url);
47
+ const driveFile = this.driveFileItemToXMLNode(driveFileItem, resource.url);
74
48
  const xml = xml_utils_1.XMLUtils.toWebDavXML([driveFile], {
75
49
  arrayNodeName: xml_utils_1.XMLUtils.addDefaultNamespace('response'),
76
50
  });
@@ -114,6 +88,7 @@ class PROPFINDRequestHandler {
114
88
  const foldersXML = folderContent.folders.map((folder) => {
115
89
  const folderRelativePath = webdav_utils_1.WebDavUtils.joinURL(relativePath, folder.plainName, '/');
116
90
  return this.driveFolderItemToXMLNode({
91
+ itemType: 'folder',
117
92
  name: folder.plainName,
118
93
  bucket: folder.bucket,
119
94
  status: folder.deleted || folder.removed ? 'TRASHED' : 'EXISTS',
@@ -129,6 +104,7 @@ class PROPFINDRequestHandler {
129
104
  const filesXML = folderContent.files.map((file) => {
130
105
  const fileRelativePath = webdav_utils_1.WebDavUtils.joinURL(relativePath, file.type ? `${file.plainName}.${file.type}` : file.plainName);
131
106
  return this.driveFileItemToXMLNode({
107
+ itemType: 'file',
132
108
  name: file.plainName,
133
109
  bucket: file.bucket,
134
110
  id: file.id,
@@ -5,10 +5,12 @@ import { AuthService } from '../../services/auth.service';
5
5
  import { WebDavMethodHandler } from '../../types/webdav.types';
6
6
  import { TrashService } from '../../services/drive/trash.service';
7
7
  import { WebDavFolderService } from '../services/webdav-folder.service';
8
+ import { DriveFolderService } from '../../services/drive/drive-folder.service';
8
9
  export declare class PUTRequestHandler implements WebDavMethodHandler {
9
10
  private readonly dependencies;
10
11
  constructor(dependencies: {
11
12
  driveFileService: DriveFileService;
13
+ driveFolderService: DriveFolderService;
12
14
  webDavFolderService: WebDavFolderService;
13
15
  trashService: TrashService;
14
16
  authService: AuthService;
@@ -21,22 +21,24 @@ class PUTRequestHandler {
21
21
  if (!contentLength || isNaN(contentLength) || contentLength <= 0) {
22
22
  throw new errors_utils_1.UnsupportedMediaTypeError('Empty files are not supported');
23
23
  }
24
- const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req);
25
- if (resource.type === 'folder')
24
+ const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req.url);
25
+ const driveFileItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
26
+ resource: resource,
27
+ driveFileService: this.dependencies.driveFileService,
28
+ driveFolderService: this.dependencies.driveFolderService,
29
+ });
30
+ if (driveFileItem?.itemType === 'folder') {
26
31
  throw new errors_utils_1.NotFoundError('Folders cannot be created with PUT. Use MKCOL instead.');
27
- logger_utils_1.webdavLogger.info(`[PUT] Request received for ${resource.type} at ${resource.url}`);
32
+ }
33
+ logger_utils_1.webdavLogger.info(`[PUT] Request received for file at ${resource.url}`);
28
34
  logger_utils_1.webdavLogger.info(`[PUT] Uploading '${resource.name}' to '${resource.parentPath}'`);
29
35
  const parentDriveFolderItem = (await this.dependencies.webDavFolderService.getDriveFolderItemFromPath(resource.parentPath)) ??
30
36
  (await this.dependencies.webDavFolderService.createParentPathOrThrow(resource.parentPath));
31
37
  try {
32
- const driveFileItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
33
- resource: resource,
34
- driveFileService: this.dependencies.driveFileService,
35
- });
36
38
  if (driveFileItem && driveFileItem.status === 'EXISTS') {
37
39
  logger_utils_1.webdavLogger.info(`[PUT] File '${resource.name}' already exists in '${resource.path.dir}', trashing it...`);
38
40
  await this.dependencies.trashService.trashItems({
39
- items: [{ type: resource.type, uuid: driveFileItem.uuid, id: null }],
41
+ items: [{ type: driveFileItem.itemType, uuid: driveFileItem.uuid }],
40
42
  });
41
43
  }
42
44
  }
@@ -12,9 +12,9 @@ class WebDavFolderService {
12
12
  this.dependencies = dependencies;
13
13
  }
14
14
  getDriveFolderItemFromPath = async (path) => {
15
- const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(path, false);
16
- return await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
17
- resource,
15
+ const { url } = await webdav_utils_1.WebDavUtils.getRequestedResource(path, false);
16
+ return await webdav_utils_1.WebDavUtils.getDriveFolderFromResource({
17
+ url,
18
18
  driveFolderService: this.dependencies.driveFolderService,
19
19
  });
20
20
  };
@@ -30,7 +30,8 @@ class WebDavFolderService {
30
30
  createParentPathOrThrow = async (parentPath) => {
31
31
  const { createFullPath } = await this.dependencies.configService.readWebdavConfig();
32
32
  if (!createFullPath) {
33
- throw new errors_utils_1.ConflictError(`Parent folders not found on Internxt Drive at ${webdav_utils_1.WebDavUtils.decodeUrl(parentPath, false)}`);
33
+ throw new errors_utils_1.ConflictError(`Parent folders not found on Internxt Drive at ${webdav_utils_1.WebDavUtils.decodeUrl(parentPath, false)},
34
+ createFullPath flag is set to: ${createFullPath}`);
34
35
  }
35
36
  const folders = parentPath.split('/').filter((f) => f.length > 0);
36
37
  const { user } = await auth_service_1.AuthService.instance.getAuthDetails();
@@ -104,6 +104,7 @@ class WebDavServer {
104
104
  }).handle));
105
105
  this.app.put(serverListenPath, (0, express_async_handler_1.default)(new PUT_handler_1.PUTRequestHandler({
106
106
  driveFileService: this.driveFileService,
107
+ driveFolderService: this.driveFolderService,
107
108
  webDavFolderService: webDavFolderService,
108
109
  authService: this.authService,
109
110
  trashService: this.trashService,
@@ -351,10 +351,10 @@
351
351
  "list.js"
352
352
  ]
353
353
  },
354
- "login": {
354
+ "login-legacy": {
355
355
  "aliases": [],
356
356
  "args": {},
357
- "description": "Logs into an Internxt account. If the account is two-factor protected, then an extra code will be required.",
357
+ "description": "[Legacy] Logs into an Internxt account using user and password. If the account is two-factor protected, then an extra code will be required.",
358
358
  "examples": [
359
359
  "<%= config.bin %> <%= command.id %>"
360
360
  ],
@@ -435,6 +435,63 @@
435
435
  },
436
436
  "hasDynamicHelp": false,
437
437
  "hiddenAliases": [],
438
+ "id": "login-legacy",
439
+ "pluginAlias": "@internxt/cli",
440
+ "pluginName": "@internxt/cli",
441
+ "pluginType": "core",
442
+ "strict": true,
443
+ "enableJsonFlag": true,
444
+ "isESM": false,
445
+ "relativePath": [
446
+ "dist",
447
+ "commands",
448
+ "login-legacy.js"
449
+ ]
450
+ },
451
+ "login": {
452
+ "aliases": [],
453
+ "args": {},
454
+ "description": "Logs into your Internxt account using the web-based login flow. A temporary local server is started to securely receive the authentication response.",
455
+ "examples": [
456
+ "<%= config.bin %> <%= command.id %>"
457
+ ],
458
+ "flags": {
459
+ "json": {
460
+ "description": "Format output as json.",
461
+ "helpGroup": "GLOBAL",
462
+ "name": "json",
463
+ "allowNo": false,
464
+ "type": "boolean"
465
+ },
466
+ "host": {
467
+ "aliases": [
468
+ "host"
469
+ ],
470
+ "char": "h",
471
+ "description": "IP address of the machine where the CLI is running. If you are opening the login page in a browser on another device, set this to the IP address of the machine running the CLI. Defaults to 127.0.0.1.",
472
+ "env": "INXT_LOGIN_SERVER_HOST",
473
+ "name": "host",
474
+ "required": false,
475
+ "hasDynamicHelp": false,
476
+ "multiple": false,
477
+ "type": "option"
478
+ },
479
+ "port": {
480
+ "aliases": [
481
+ "port"
482
+ ],
483
+ "char": "p",
484
+ "description": "Port used by the temporary local server to handle the login callback. If not specified, a random available port will be used automatically.",
485
+ "env": "INXT_LOGIN_SERVER_PORT",
486
+ "name": "port",
487
+ "required": false,
488
+ "hasDynamicHelp": false,
489
+ "multiple": false,
490
+ "type": "option"
491
+ }
492
+ },
493
+ "hasDynamicHelp": false,
494
+ "hiddenAliases": [],
438
495
  "id": "login",
439
496
  "pluginAlias": "@internxt/cli",
440
497
  "pluginName": "@internxt/cli",
@@ -1133,6 +1190,67 @@
1133
1190
  "upload-file.js"
1134
1191
  ]
1135
1192
  },
1193
+ "upload-folder": {
1194
+ "aliases": [
1195
+ "upload:folder"
1196
+ ],
1197
+ "args": {},
1198
+ "description": "Upload a folder to Internxt Drive",
1199
+ "examples": [
1200
+ "<%= config.bin %> <%= command.id %>"
1201
+ ],
1202
+ "flags": {
1203
+ "json": {
1204
+ "description": "Format output as json.",
1205
+ "helpGroup": "GLOBAL",
1206
+ "name": "json",
1207
+ "allowNo": false,
1208
+ "type": "boolean"
1209
+ },
1210
+ "non-interactive": {
1211
+ "char": "x",
1212
+ "description": "Prevents the CLI from being interactive. When enabled, the CLI will not request input through the console and will throw errors directly.",
1213
+ "env": "INXT_NONINTERACTIVE",
1214
+ "helpGroup": "helper",
1215
+ "name": "non-interactive",
1216
+ "required": false,
1217
+ "allowNo": false,
1218
+ "type": "boolean"
1219
+ },
1220
+ "folder": {
1221
+ "char": "f",
1222
+ "description": "The path to the folder on your system.",
1223
+ "name": "folder",
1224
+ "required": false,
1225
+ "hasDynamicHelp": false,
1226
+ "multiple": false,
1227
+ "type": "option"
1228
+ },
1229
+ "destination": {
1230
+ "char": "i",
1231
+ "description": "The folder id where the folder is going to be uploaded to. Leave empty for the root folder.",
1232
+ "name": "destination",
1233
+ "required": false,
1234
+ "hasDynamicHelp": false,
1235
+ "multiple": false,
1236
+ "type": "option"
1237
+ }
1238
+ },
1239
+ "hasDynamicHelp": false,
1240
+ "hiddenAliases": [],
1241
+ "id": "upload-folder",
1242
+ "pluginAlias": "@internxt/cli",
1243
+ "pluginName": "@internxt/cli",
1244
+ "pluginType": "core",
1245
+ "strict": true,
1246
+ "enableJsonFlag": true,
1247
+ "isESM": false,
1248
+ "relativePath": [
1249
+ "dist",
1250
+ "commands",
1251
+ "upload-folder.js"
1252
+ ]
1253
+ },
1136
1254
  "webdav-config": {
1137
1255
  "aliases": [],
1138
1256
  "args": {},
@@ -1298,5 +1416,5 @@
1298
1416
  ]
1299
1417
  }
1300
1418
  },
1301
- "version": "1.5.8"
1419
+ "version": "1.6.1"
1302
1420
  }
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "author": "Internxt <hello@internxt.com>",
3
- "version": "1.5.8",
3
+ "version": "1.6.1",
4
4
  "description": "Internxt CLI to manage your encrypted storage",
5
5
  "scripts": {
6
6
  "build": "yarn clean && tsc",
7
7
  "clean": "rimraf dist coverage tsconfig.tsbuildinfo oclif.manifest.json",
8
8
  "lint": "eslint .",
9
- "pretty": "prettier --write **/*.{js,jsx,tsx,ts}",
9
+ "format": "prettier --write **/*.{js,jsx,tsx,ts}",
10
10
  "postpack": "rimraf oclif.manifest.json",
11
11
  "posttest": "yarn lint",
12
12
  "prepack": "yarn build && oclif manifest && oclif readme",
@@ -36,58 +36,59 @@
36
36
  "/oclif.manifest.json"
37
37
  ],
38
38
  "dependencies": {
39
- "@inquirer/prompts": "7.8.6",
39
+ "@inquirer/prompts": "8.1.0",
40
40
  "@internxt/inxt-js": "2.2.9",
41
- "@internxt/lib": "1.3.1",
42
- "@internxt/sdk": "1.11.12",
43
- "@oclif/core": "4.5.5",
44
- "@oclif/plugin-autocomplete": "3.2.36",
45
- "axios": "1.12.2",
41
+ "@internxt/lib": "1.4.1",
42
+ "@internxt/sdk": "1.11.25",
43
+ "@oclif/core": "4.8.0",
44
+ "@oclif/plugin-autocomplete": "3.2.39",
45
+ "axios": "1.13.2",
46
46
  "bip39": "3.1.0",
47
- "body-parser": "2.2.0",
47
+ "body-parser": "2.2.1",
48
48
  "cli-progress": "3.12.0",
49
- "dayjs": "1.11.18",
49
+ "dayjs": "1.11.19",
50
50
  "dotenv": "17.2.3",
51
- "express": "5.1.0",
51
+ "express": "5.2.1",
52
52
  "express-async-handler": "1.2.0",
53
- "fast-xml-parser": "5.3.0",
54
- "mime-types": "3.0.1",
55
- "openpgp": "6.2.2",
53
+ "fast-xml-parser": "5.3.3",
54
+ "mime-types": "3.0.2",
55
+ "open": "11.0.0",
56
+ "openpgp": "6.3.0",
56
57
  "otpauth": "9.4.1",
57
- "pm2": "6.0.13",
58
+ "pm2": "6.0.14",
58
59
  "range-parser": "1.2.1",
59
- "selfsigned": "3.0.1",
60
- "tty-table": "4.2.3",
61
- "winston": "3.18.3"
60
+ "selfsigned": "5.2.0",
61
+ "tty-table": "5.0.0",
62
+ "winston": "3.19.0"
62
63
  },
63
64
  "devDependencies": {
64
65
  "@internxt/eslint-config-internxt": "2.0.1",
65
66
  "@internxt/prettier-config": "internxt/prettier-config#v1.0.2",
66
- "@openpgp/web-stream-tools": "0.1.3",
67
+ "@openpgp/web-stream-tools": "0.3.0",
67
68
  "@types/cli-progress": "3.11.6",
68
- "@types/express": "5.0.3",
69
+ "@types/express": "5.0.6",
69
70
  "@types/mime-types": "3.0.1",
70
- "@types/node": "22.18.9",
71
+ "@types/node": "25.0.3",
71
72
  "@types/range-parser": "1.2.7",
72
- "@vitest/coverage-istanbul": "3.2.4",
73
- "@vitest/spy": "3.2.4",
74
- "eslint": "9.37.0",
73
+ "@vitest/coverage-istanbul": "4.0.16",
74
+ "@vitest/spy": "4.0.16",
75
+ "eslint": "9.39.2",
75
76
  "husky": "9.1.7",
76
- "lint-staged": "16.2.4",
77
- "nodemon": "3.1.10",
78
- "oclif": "4.22.32",
79
- "prettier": "3.6.2",
80
- "rimraf": "6.0.1",
77
+ "lint-staged": "16.2.7",
78
+ "nodemon": "3.1.11",
79
+ "oclif": "4.22.57",
80
+ "prettier": "3.7.4",
81
+ "rimraf": "6.1.2",
81
82
  "ts-node": "10.9.2",
82
83
  "typescript": "5.9.3",
83
- "vitest": "3.2.4",
84
+ "vitest": "4.0.16",
84
85
  "vitest-mock-express": "2.2.0"
85
86
  },
86
87
  "optionalDependencies": {
87
- "sharp": "0.34.4"
88
+ "sharp": "0.34.5"
88
89
  },
89
90
  "engines": {
90
- "node": ">=22.12.0"
91
+ "node": ">=22.13.0"
91
92
  },
92
93
  "bin": {
93
94
  "internxt": "./bin/run.js"