@internxt/cli 1.5.2 → 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.
Files changed (70) hide show
  1. package/.env +2 -6
  2. package/README.md +46 -26
  3. package/bin/dev.js +1 -1
  4. package/bin/run.js +1 -1
  5. package/dist/commands/add-cert.d.ts +1 -1
  6. package/dist/commands/add-cert.js +23 -23
  7. package/dist/commands/config.js +8 -3
  8. package/dist/commands/create-folder.js +11 -6
  9. package/dist/commands/delete-permanently-file.js +9 -4
  10. package/dist/commands/delete-permanently-folder.js +9 -4
  11. package/dist/commands/download-file.js +21 -16
  12. package/dist/commands/list.js +8 -3
  13. package/dist/commands/login.js +8 -3
  14. package/dist/commands/logout.js +10 -3
  15. package/dist/commands/logs.js +8 -3
  16. package/dist/commands/move-file.js +8 -3
  17. package/dist/commands/move-folder.js +8 -3
  18. package/dist/commands/rename-file.js +8 -3
  19. package/dist/commands/rename-folder.js +8 -3
  20. package/dist/commands/trash-clear.js +8 -3
  21. package/dist/commands/trash-file.js +8 -3
  22. package/dist/commands/trash-folder.js +8 -3
  23. package/dist/commands/trash-list.js +8 -3
  24. package/dist/commands/trash-restore-file.js +8 -3
  25. package/dist/commands/trash-restore-folder.js +8 -3
  26. package/dist/commands/upload-file.js +17 -11
  27. package/dist/commands/webdav-config.js +8 -3
  28. package/dist/commands/webdav.js +22 -22
  29. package/dist/commands/whoami.js +8 -3
  30. package/dist/hooks/prerun/auth_check.js +13 -7
  31. package/dist/services/auth.service.d.ts +1 -0
  32. package/dist/services/auth.service.js +13 -1
  33. package/dist/services/crypto.service.d.ts +1 -1
  34. package/dist/services/crypto.service.js +2 -2
  35. package/dist/services/drive/drive-file.service.d.ts +1 -1
  36. package/dist/services/drive/drive-file.service.js +7 -7
  37. package/dist/services/drive/drive-folder.service.js +7 -7
  38. package/dist/services/drive/trash.service.d.ts +6 -4
  39. package/dist/services/drive/trash.service.js +6 -6
  40. package/dist/services/sdk-manager.service.d.ts +3 -5
  41. package/dist/services/sdk-manager.service.js +14 -34
  42. package/dist/services/thumbnail.service.d.ts +2 -2
  43. package/dist/services/thumbnail.service.js +6 -6
  44. package/dist/services/usage.service.d.ts +2 -2
  45. package/dist/services/usage.service.js +2 -2
  46. package/dist/types/config.types.d.ts +1 -4
  47. package/dist/utils/cli.utils.d.ts +13 -4
  48. package/dist/utils/cli.utils.js +44 -10
  49. package/dist/utils/pm2.utils.d.ts +1 -1
  50. package/dist/utils/thumbnail.utils.js +3 -3
  51. package/dist/utils/webdav.utils.d.ts +2 -3
  52. package/dist/utils/webdav.utils.js +6 -18
  53. package/dist/utils/xml.utils.d.ts +1 -1
  54. package/dist/utils/xml.utils.js +3 -3
  55. package/dist/webdav/handlers/DELETE.handler.js +5 -1
  56. package/dist/webdav/handlers/GET.handler.js +6 -2
  57. package/dist/webdav/handlers/HEAD.handler.js +7 -2
  58. package/dist/webdav/handlers/MKCOL.handler.js +10 -8
  59. package/dist/webdav/handlers/MOVE.handler.js +10 -3
  60. package/dist/webdav/handlers/OPTIONS.handler.js +2 -5
  61. package/dist/webdav/handlers/PROPFIND.handler.js +31 -21
  62. package/dist/webdav/handlers/PUT.handler.js +8 -4
  63. package/dist/webdav/index.js +1 -1
  64. package/dist/webdav/middewares/auth.middleware.js +10 -2
  65. package/dist/webdav/middewares/errors.middleware.js +8 -13
  66. package/dist/webdav/webdav-server.d.ts +2 -1
  67. package/dist/webdav/webdav-server.js +6 -3
  68. package/oclif.manifest.json +1 -1
  69. package/package.json +29 -28
  70. package/scripts/restart-webdav.js +2 -1
@@ -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 parentFolderItem = (await webdav_utils_1.WebDavUtils.getAndSearchItemFromResource({
19
+ const parentDriveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
20
20
  resource: parentResource,
21
21
  driveFolderService,
22
- }));
23
- let folderAlreadyExists = true;
24
- try {
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.getAndSearchItemFromResource({
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 destinationFolderItem = (await webdav_utils_1.WebDavUtils.getAndSearchItemFromResource({
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
- if (resource.type === 'file') {
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,28 +20,38 @@ 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
- try {
24
- const driveItem = await webdav_utils_1.WebDavUtils.getAndSearchItemFromResource({
25
- resource,
26
- driveFolderService,
27
- driveFileService,
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
- }
23
+ const driveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
24
+ resource,
25
+ driveFolderService,
26
+ driveFileService,
27
+ });
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
+ }));
41
+ return;
42
42
  }
43
- catch {
44
- res.status(207).send();
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
+ }
45
55
  }
46
56
  };
47
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 parentFolderItem = (await webdav_utils_1.WebDavUtils.getAndSearchItemFromResource({
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.getAndSearchItemFromResource({
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.id, networkFacade);
100
+ await thumbnail_service_1.ThumbnailService.instance.uploadThumbnail(thumbnailBuffer, fileType, user.bucket, file.uuid, networkFacade);
97
101
  }
98
102
  }
99
103
  }
@@ -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();
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AuthMiddleware = void 0;
4
4
  const sdk_manager_service_1 = require("../../services/sdk-manager.service");
5
5
  const logger_utils_1 = require("../../utils/logger.utils");
6
+ const xml_utils_1 = require("../../utils/xml.utils");
6
7
  const AuthMiddleware = (authService) => {
7
8
  return (req, res, next) => {
8
9
  (async () => {
@@ -19,8 +20,15 @@ const AuthMiddleware = (authService) => {
19
20
  next();
20
21
  }
21
22
  catch (error) {
22
- logger_utils_1.webdavLogger.error('Error from AuthMiddleware: ' + error.message);
23
- res.status(401).send({ error: error.message });
23
+ let message = 'Authentication required to access this resource.';
24
+ if ('message' in error && error.message.trim().length > 0) {
25
+ message = error.message;
26
+ }
27
+ logger_utils_1.webdavLogger.error('Error from AuthMiddleware: ' + message);
28
+ const errorBodyXML = xml_utils_1.XMLUtils.toWebDavXML({
29
+ [xml_utils_1.XMLUtils.addDefaultNamespace('responsedescription')]: message,
30
+ }, {}, 'error');
31
+ res.status(401).send(errorBodyXML);
24
32
  }
25
33
  })();
26
34
  };
@@ -2,21 +2,16 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ErrorHandlingMiddleware = void 0;
4
4
  const logger_utils_1 = require("../../utils/logger.utils");
5
+ const xml_utils_1 = require("../../utils/xml.utils");
5
6
  const ErrorHandlingMiddleware = (err, req, res, _) => {
6
7
  logger_utils_1.webdavLogger.error(`[ERROR MIDDLEWARE] [${req.method.toUpperCase()} - ${req.url}]`, err);
7
- if ('statusCode' in err) {
8
- res.status(err.statusCode).send({
9
- error: {
10
- message: err.message,
11
- },
12
- });
13
- }
14
- else {
15
- res.status(500).send({
16
- error: {
17
- message: 'message' in err ? err.message : 'Something went wrong',
18
- },
19
- });
8
+ const errorBodyXML = xml_utils_1.XMLUtils.toWebDavXML({
9
+ [xml_utils_1.XMLUtils.addDefaultNamespace('responsedescription')]: 'message' in err ? err.message : 'Something went wrong',
10
+ }, {}, 'error');
11
+ let statusCode = 500;
12
+ if ('statusCode' in err && !isNaN(err.statusCode)) {
13
+ statusCode = err.statusCode;
20
14
  }
15
+ res.status(statusCode).send(errorBodyXML);
21
16
  };
22
17
  exports.ErrorHandlingMiddleware = ErrorHandlingMiddleware;
@@ -17,7 +17,8 @@ export declare class WebDavServer {
17
17
  private readonly trashService;
18
18
  constructor(app: Express, configService: ConfigService, driveFileService: DriveFileService, driveFolderService: DriveFolderService, downloadService: DownloadService, authService: AuthService, cryptoService: CryptoService, trashService: TrashService);
19
19
  private readonly getNetworkFacade;
20
- private readonly registerMiddlewares;
20
+ private readonly registerStartMiddlewares;
21
+ private readonly registerEndMiddleWares;
21
22
  private readonly registerHandlers;
22
23
  start: () => Promise<void>;
23
24
  }
@@ -67,8 +67,7 @@ class WebDavServer {
67
67
  const networkFacade = new network_facade_service_1.NetworkFacade(networkModule, environment, download_service_1.DownloadService.instance, crypto_service_1.CryptoService.instance);
68
68
  return networkFacade;
69
69
  };
70
- registerMiddlewares = async () => {
71
- this.app.use(errors_middleware_1.ErrorHandlingMiddleware);
70
+ registerStartMiddlewares = () => {
72
71
  this.app.use((0, auth_middleware_1.AuthMiddleware)(auth_service_1.AuthService.instance));
73
72
  this.app.use((0, request_logger_middleware_1.RequestLoggerMiddleware)({
74
73
  enable: true,
@@ -76,6 +75,9 @@ class WebDavServer {
76
75
  this.app.use(body_parser_1.default.text({ type: ['application/xml', 'text/xml'] }));
77
76
  this.app.use(mkcol_middleware_1.MkcolMiddleware);
78
77
  };
78
+ registerEndMiddleWares = () => {
79
+ this.app.use(errors_middleware_1.ErrorHandlingMiddleware);
80
+ };
79
81
  registerHandlers = async () => {
80
82
  const serverListenPath = /(.*)/;
81
83
  const networkFacade = await this.getNetworkFacade();
@@ -119,8 +121,9 @@ class WebDavServer {
119
121
  start = async () => {
120
122
  const configs = await this.configService.readWebdavConfig();
121
123
  this.app.disable('x-powered-by');
122
- await this.registerMiddlewares();
124
+ this.registerStartMiddlewares();
123
125
  await this.registerHandlers();
126
+ this.registerEndMiddleWares();
124
127
  const plainHttp = configs.protocol === 'http';
125
128
  let server;
126
129
  if (plainHttp) {
@@ -1266,5 +1266,5 @@
1266
1266
  ]
1267
1267
  }
1268
1268
  },
1269
- "version": "1.5.2"
1269
+ "version": "1.5.4"
1270
1270
  }
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "author": "Internxt <hello@internxt.com>",
3
- "version": "1.5.2",
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.5.0",
39
- "@internxt/inxt-js": "2.1.0",
40
- "@internxt/lib": "1.2.1",
41
- "@internxt/sdk": "1.7.0",
42
- "@oclif/core": "4.3.0",
43
- "@types/validator": "13.15.0",
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.9.0",
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": "16.5.0",
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.1",
55
+ "fast-xml-parser": "5.2.5",
55
56
  "mime-types": "3.0.1",
56
- "openpgp": "5.11.2",
57
- "pm2": "6.0.5",
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.1",
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.12",
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.1",
73
- "@types/mime-types": "2.1.4",
74
- "@types/node": "22.15.3",
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.1.2",
77
- "@vitest/spy": "3.1.2",
78
- "eslint": "9.25.1",
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": "15.5.1",
81
- "nock": "14.0.4",
81
+ "lint-staged": "16.1.2",
82
+ "nock": "14.0.5",
82
83
  "nodemon": "3.1.10",
83
- "oclif": "4.17.46",
84
- "prettier": "3.5.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.1.2",
89
+ "vitest": "3.2.4",
89
90
  "vitest-mock-express": "2.2.0"
90
91
  },
91
92
  "engines": {
92
- "node": ">=20.12.1"
93
+ "node": ">=22.12.0"
93
94
  },
94
95
  "bin": {
95
96
  "internxt": "./bin/run.js"
@@ -5,8 +5,9 @@ async function runCommand() {
5
5
  exec('node ./bin/run.js webdav restart', (error, stdout, stderr) => {
6
6
  if (error) {
7
7
  reject(error);
8
+ } else {
9
+ resolve(stdout ?? stderr);
8
10
  }
9
- resolve(stdout || stderr);
10
11
  });
11
12
  });
12
13
  }