@plutonhq/core-frontend 0.1.15 → 0.1.17

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 (34) hide show
  1. package/dist-lib/components/App/Footer/Footer.d.ts +2 -1
  2. package/dist-lib/components/App/Footer/Footer.d.ts.map +1 -1
  3. package/dist-lib/components/App/Footer/Footer.js +29 -18
  4. package/dist-lib/components/App/Footer/Footer.js.map +1 -1
  5. package/dist-lib/node_modules/.pnpm/@tanstack_query-core@5.96.0/node_modules/@tanstack/query-core/build/modern/notifyManager.js +68 -0
  6. package/dist-lib/node_modules/.pnpm/@tanstack_query-core@5.96.0/node_modules/@tanstack/query-core/build/modern/notifyManager.js.map +1 -0
  7. package/dist-lib/node_modules/.pnpm/@tanstack_query-core@5.96.0/node_modules/@tanstack/query-core/build/modern/timeoutManager.js +7 -0
  8. package/dist-lib/node_modules/.pnpm/@tanstack_query-core@5.96.0/node_modules/@tanstack/query-core/build/modern/timeoutManager.js.map +1 -0
  9. package/dist-lib/node_modules/.pnpm/@tanstack_query-core@5.96.0/node_modules/@tanstack/query-core/build/modern/utils.js +55 -0
  10. package/dist-lib/node_modules/.pnpm/@tanstack_query-core@5.96.0/node_modules/@tanstack/query-core/build/modern/utils.js.map +1 -0
  11. package/dist-lib/node_modules/.pnpm/@tanstack_query-persist-client-core@5.96.0/node_modules/@tanstack/query-persist-client-core/build/modern/createPersister.js +190 -0
  12. package/dist-lib/node_modules/.pnpm/@tanstack_query-persist-client-core@5.96.0/node_modules/@tanstack/query-persist-client-core/build/modern/createPersister.js.map +1 -0
  13. package/dist-lib/router.d.ts.map +1 -1
  14. package/dist-lib/router.js +42 -39
  15. package/dist-lib/router.js.map +1 -1
  16. package/dist-lib/services/settings.d.ts +2 -0
  17. package/dist-lib/services/settings.d.ts.map +1 -1
  18. package/dist-lib/services/settings.js +100 -69
  19. package/dist-lib/services/settings.js.map +1 -1
  20. package/dist-lib/services/users.d.ts +1 -1
  21. package/dist-lib/services/users.d.ts.map +1 -1
  22. package/dist-lib/services/users.js.map +1 -1
  23. package/dist-lib/services.js +61 -59
  24. package/dist-lib/utils/helpers.d.ts +1 -0
  25. package/dist-lib/utils/helpers.d.ts.map +1 -1
  26. package/dist-lib/utils/helpers.js +74 -70
  27. package/dist-lib/utils/helpers.js.map +1 -1
  28. package/dist-lib/utils.js +28 -27
  29. package/package.json +5 -4
  30. package/src/components/App/Footer/Footer.tsx +17 -2
  31. package/src/router.tsx +6 -1
  32. package/src/services/settings.ts +36 -0
  33. package/src/services/users.ts +1 -1
  34. package/src/utils/helpers.ts +26 -0
@@ -1,34 +1,35 @@
1
- import { cancelBackup as s, cancelBackupDownload as a, deleteBackup as o, generateBackupDownload as u, getBackupDownload as r, getBackupProgress as l, getSnapshotFiles as n, retryFailedReplications as p, updateBackup as g, useCancelBackup as c, useCancelBackupDownload as i, useDeleteBackup as d, useDownloadBackup as S, useGetBackupDownload as P, useGetBackupProgress as k, useGetBackupProgressOnce as D, useGetSnapshotFiles as R, useRetryFailedReplications as G, useUpdateBackup as B } from "./services/backups.js";
2
- import { browseDir as w, getAllDevices as f, getDevice as m, getSystemMetrics as v, updateDependent as y, updateDevice as h, useBrowseDir as F, useGetDevice as L, useGetDevices as U, useGetSystemMetrics as T, useUpdateDependent as x, useUpdateDevice as C } from "./services/devices.js";
3
- import { checkActiveBackupsOrRestore as I, checkPlanIntegrity as V, createPlan as b, deletePlan as M, deleteReplicationStorage as j, downloadPlanLogs as q, getAllPlans as z, getPlanLogs as E, getSinglePlan as H, pausePlan as J, performBackup as K, prunePlan as N, resumePlan as Q, unlockPlan as W, updatePlan as X, useCheckActiveBackupsOrRestore as Y, useCheckPlanIntegrity as Z, useCreatePlan as _, useDeletePlan as $, useDeleteReplicationStorage as ee, useGetDownloadLogs as te, useGetPlan as se, useGetPlanLogs as ae, useGetPlans as oe, usePausePlan as ue, usePerformBackup as re, usePrunePlan as le, useResumePlan as ne, useUnlockPlan as pe, useUpdatePlan as ge } from "./services/plans.js";
4
- import { cancelRestore as ie, deleteRestore as de, getAllRestores as Se, getDryRestoreStats as Pe, getRestoreProgress as ke, getRestoreStats as De, getSingleRestore as Re, restoreBackup as Ge, useCancelRestore as Be, useDeleteRestore as Ae, useGetDryRestoreStats as we, useGetRestore as fe, useGetRestoreProgress as me, useGetRestoreProgressOnce as ve, useGetRestoreStats as ye, useGetRestores as he, useRestoreBackup as Fe } from "./services/restores.js";
5
- import { completeSetup as Ue, downloadAppLogs as Te, getAppLogs as xe, getSettings as Ce, getSetupStatus as Oe, setupTwoFactorAuth as Ie, updateSettings as Ve, useCompleteSetup as be, useGetAppLogs as Me, useGetDownloadAppLogs as je, useGetSettings as qe, useSetupStatus as ze, useSetupTwoFactorAuth as Ee, useUpdateSettings as He, useValidateIntegration as Je, useVerifyTwoFactorAuth as Ke, useVerifyTwoFactorOTP as Ne, validateIntegration as Qe, verifyTwoFactorAuth as We, verifyTwoFactorOTP as Xe } from "./services/settings.js";
6
- import { addStorage as Ze, deleteStorage as _e, getAllStorages as $e, getAvailableStorages as et, getStorage as tt, updateStorage as st, useAddStorage as at, useDeleteStorage as ot, useGetAvailableStorages as ut, useGetStorage as rt, useGetStorages as lt, useUpdateStorage as nt, useVerifyStorage as pt, verifyStorage as gt } from "./services/storage.js";
7
- import { loginUser as it, logoutUser as dt, useAuth as St, useLogin as Pt, useLogout as kt, validateAuth as Dt } from "./services/users.js";
1
+ import { cancelBackup as s, cancelBackupDownload as a, deleteBackup as o, generateBackupDownload as u, getBackupDownload as r, getBackupProgress as l, getSnapshotFiles as n, retryFailedReplications as p, updateBackup as c, useCancelBackup as g, useCancelBackupDownload as i, useDeleteBackup as d, useDownloadBackup as S, useGetBackupDownload as P, useGetBackupProgress as k, useGetBackupProgressOnce as D, useGetSnapshotFiles as R, useRetryFailedReplications as G, useUpdateBackup as B } from "./services/backups.js";
2
+ import { browseDir as w, getAllDevices as f, getDevice as m, getSystemMetrics as v, updateDependent as h, updateDevice as y, useBrowseDir as L, useGetDevice as F, useGetDevices as U, useGetSystemMetrics as C, useUpdateDependent as T, useUpdateDevice as x } from "./services/devices.js";
3
+ import { checkActiveBackupsOrRestore as V, checkPlanIntegrity as I, createPlan as b, deletePlan as M, deleteReplicationStorage as j, downloadPlanLogs as q, getAllPlans as z, getPlanLogs as E, getSinglePlan as H, pausePlan as J, performBackup as K, prunePlan as N, resumePlan as Q, unlockPlan as W, updatePlan as X, useCheckActiveBackupsOrRestore as Y, useCheckPlanIntegrity as Z, useCreatePlan as _, useDeletePlan as $, useDeleteReplicationStorage as ee, useGetDownloadLogs as te, useGetPlan as se, useGetPlanLogs as ae, useGetPlans as oe, usePausePlan as ue, usePerformBackup as re, usePrunePlan as le, useResumePlan as ne, useUnlockPlan as pe, useUpdatePlan as ce } from "./services/plans.js";
4
+ import { cancelRestore as ie, deleteRestore as de, getAllRestores as Se, getDryRestoreStats as Pe, getRestoreProgress as ke, getRestoreStats as De, getSingleRestore as Re, restoreBackup as Ge, useCancelRestore as Be, useDeleteRestore as Ae, useGetDryRestoreStats as we, useGetRestore as fe, useGetRestoreProgress as me, useGetRestoreProgressOnce as ve, useGetRestoreStats as he, useGetRestores as ye, useRestoreBackup as Le } from "./services/restores.js";
5
+ import { checkLatestVersion as Ue, completeSetup as Ce, downloadAppLogs as Te, getAppLogs as xe, getSettings as Oe, getSetupStatus as Ve, setupTwoFactorAuth as Ie, updateSettings as be, useCheckLatestVersion as Me, useCompleteSetup as je, useGetAppLogs as qe, useGetDownloadAppLogs as ze, useGetSettings as Ee, useSetupStatus as He, useSetupTwoFactorAuth as Je, useUpdateSettings as Ke, useValidateIntegration as Ne, useVerifyTwoFactorAuth as Qe, useVerifyTwoFactorOTP as We, validateIntegration as Xe, verifyTwoFactorAuth as Ye, verifyTwoFactorOTP as Ze } from "./services/settings.js";
6
+ import { addStorage as $e, deleteStorage as et, getAllStorages as tt, getAvailableStorages as st, getStorage as at, updateStorage as ot, useAddStorage as ut, useDeleteStorage as rt, useGetAvailableStorages as lt, useGetStorage as nt, useGetStorages as pt, useUpdateStorage as ct, useVerifyStorage as gt, verifyStorage as it } from "./services/storage.js";
7
+ import { loginUser as St, logoutUser as Pt, useAuth as kt, useLogin as Dt, useLogout as Rt, validateAuth as Gt } from "./services/users.js";
8
8
  export {
9
- Ze as addStorage,
9
+ $e as addStorage,
10
10
  w as browseDir,
11
11
  s as cancelBackup,
12
12
  a as cancelBackupDownload,
13
13
  ie as cancelRestore,
14
- I as checkActiveBackupsOrRestore,
15
- V as checkPlanIntegrity,
16
- Ue as completeSetup,
14
+ V as checkActiveBackupsOrRestore,
15
+ Ue as checkLatestVersion,
16
+ I as checkPlanIntegrity,
17
+ Ce as completeSetup,
17
18
  b as createPlan,
18
19
  o as deleteBackup,
19
20
  M as deletePlan,
20
21
  j as deleteReplicationStorage,
21
22
  de as deleteRestore,
22
- _e as deleteStorage,
23
+ et as deleteStorage,
23
24
  Te as downloadAppLogs,
24
25
  q as downloadPlanLogs,
25
26
  u as generateBackupDownload,
26
27
  f as getAllDevices,
27
28
  z as getAllPlans,
28
29
  Se as getAllRestores,
29
- $e as getAllStorages,
30
+ tt as getAllStorages,
30
31
  xe as getAppLogs,
31
- et as getAvailableStorages,
32
+ st as getAvailableStorages,
32
33
  r as getBackupDownload,
33
34
  l as getBackupProgress,
34
35
  m as getDevice,
@@ -36,15 +37,15 @@ export {
36
37
  E as getPlanLogs,
37
38
  ke as getRestoreProgress,
38
39
  De as getRestoreStats,
39
- Ce as getSettings,
40
- Oe as getSetupStatus,
40
+ Oe as getSettings,
41
+ Ve as getSetupStatus,
41
42
  H as getSinglePlan,
42
43
  Re as getSingleRestore,
43
44
  n as getSnapshotFiles,
44
- tt as getStorage,
45
+ at as getStorage,
45
46
  v as getSystemMetrics,
46
- it as loginUser,
47
- dt as logoutUser,
47
+ St as loginUser,
48
+ Pt as logoutUser,
48
49
  J as pausePlan,
49
50
  K as performBackup,
50
51
  N as prunePlan,
@@ -53,36 +54,37 @@ export {
53
54
  p as retryFailedReplications,
54
55
  Ie as setupTwoFactorAuth,
55
56
  W as unlockPlan,
56
- g as updateBackup,
57
- y as updateDependent,
58
- h as updateDevice,
57
+ c as updateBackup,
58
+ h as updateDependent,
59
+ y as updateDevice,
59
60
  X as updatePlan,
60
- Ve as updateSettings,
61
- st as updateStorage,
62
- at as useAddStorage,
63
- St as useAuth,
64
- F as useBrowseDir,
65
- c as useCancelBackup,
61
+ be as updateSettings,
62
+ ot as updateStorage,
63
+ ut as useAddStorage,
64
+ kt as useAuth,
65
+ L as useBrowseDir,
66
+ g as useCancelBackup,
66
67
  i as useCancelBackupDownload,
67
68
  Be as useCancelRestore,
68
69
  Y as useCheckActiveBackupsOrRestore,
70
+ Me as useCheckLatestVersion,
69
71
  Z as useCheckPlanIntegrity,
70
- be as useCompleteSetup,
72
+ je as useCompleteSetup,
71
73
  _ as useCreatePlan,
72
74
  d as useDeleteBackup,
73
75
  $ as useDeletePlan,
74
76
  ee as useDeleteReplicationStorage,
75
77
  Ae as useDeleteRestore,
76
- ot as useDeleteStorage,
78
+ rt as useDeleteStorage,
77
79
  S as useDownloadBackup,
78
- Me as useGetAppLogs,
79
- ut as useGetAvailableStorages,
80
+ qe as useGetAppLogs,
81
+ lt as useGetAvailableStorages,
80
82
  P as useGetBackupDownload,
81
83
  k as useGetBackupProgress,
82
84
  D as useGetBackupProgressOnce,
83
- L as useGetDevice,
85
+ F as useGetDevice,
84
86
  U as useGetDevices,
85
- je as useGetDownloadAppLogs,
87
+ ze as useGetDownloadAppLogs,
86
88
  te as useGetDownloadLogs,
87
89
  we as useGetDryRestoreStats,
88
90
  se as useGetPlan,
@@ -91,38 +93,38 @@ export {
91
93
  fe as useGetRestore,
92
94
  me as useGetRestoreProgress,
93
95
  ve as useGetRestoreProgressOnce,
94
- ye as useGetRestoreStats,
95
- he as useGetRestores,
96
- qe as useGetSettings,
96
+ he as useGetRestoreStats,
97
+ ye as useGetRestores,
98
+ Ee as useGetSettings,
97
99
  R as useGetSnapshotFiles,
98
- rt as useGetStorage,
99
- lt as useGetStorages,
100
- T as useGetSystemMetrics,
101
- Pt as useLogin,
102
- kt as useLogout,
100
+ nt as useGetStorage,
101
+ pt as useGetStorages,
102
+ C as useGetSystemMetrics,
103
+ Dt as useLogin,
104
+ Rt as useLogout,
103
105
  ue as usePausePlan,
104
106
  re as usePerformBackup,
105
107
  le as usePrunePlan,
106
- Fe as useRestoreBackup,
108
+ Le as useRestoreBackup,
107
109
  ne as useResumePlan,
108
110
  G as useRetryFailedReplications,
109
- ze as useSetupStatus,
110
- Ee as useSetupTwoFactorAuth,
111
+ He as useSetupStatus,
112
+ Je as useSetupTwoFactorAuth,
111
113
  pe as useUnlockPlan,
112
114
  B as useUpdateBackup,
113
- x as useUpdateDependent,
114
- C as useUpdateDevice,
115
- ge as useUpdatePlan,
116
- He as useUpdateSettings,
117
- nt as useUpdateStorage,
118
- Je as useValidateIntegration,
119
- pt as useVerifyStorage,
120
- Ke as useVerifyTwoFactorAuth,
121
- Ne as useVerifyTwoFactorOTP,
122
- Dt as validateAuth,
123
- Qe as validateIntegration,
124
- gt as verifyStorage,
125
- We as verifyTwoFactorAuth,
126
- Xe as verifyTwoFactorOTP
115
+ T as useUpdateDependent,
116
+ x as useUpdateDevice,
117
+ ce as useUpdatePlan,
118
+ Ke as useUpdateSettings,
119
+ ct as useUpdateStorage,
120
+ Ne as useValidateIntegration,
121
+ gt as useVerifyStorage,
122
+ Qe as useVerifyTwoFactorAuth,
123
+ We as useVerifyTwoFactorOTP,
124
+ Gt as validateAuth,
125
+ Xe as validateIntegration,
126
+ it as verifyStorage,
127
+ Ye as verifyTwoFactorAuth,
128
+ Ze as verifyTwoFactorOTP
127
129
  };
128
130
  //# sourceMappingURL=services.js.map
@@ -15,6 +15,7 @@ export declare const clipPath: (path: string, charsOnSide?: number) => string;
15
15
  export declare const getOSIcon: (os: string) => "windows" | "macos" | "centos" | "fedora" | "debian" | "mint" | "popos" | "ubuntu" | "kali" | "arch" | "zorin" | "manjaro" | "linux";
16
16
  export declare const getProcessorIcon: (brand: string) => "intel" | "amd" | "processor";
17
17
  export declare const compareVersions: (current: string, latest: string) => boolean;
18
+ export declare const getUpdateDocLink: (isPRO?: boolean) => "https://docs.usepluton.com/docs/pluton-pro/install-pluton-pro-desktop#updating" | "https://docs.usepluton.com/docs/getting-started/install-pluton-desktop#updating" | "https://docs.usepluton.com/docs/pluton-pro/install-pluton-pro-linux-server#updating" | "https://docs.usepluton.com/docs/getting-started/install-pluton-linux-server#updating-pluton" | "https://docs.usepluton.com/docs/pluton-pro/deploy-pluton-pro-docker#updating" | "https://docs.usepluton.com/docs/getting-started/deploy-docker#quick-reference" | "https://github.com/plutonhq/pluton/releases/latest";
18
19
  export declare const isServerEdition: (distro: string, platform: string) => boolean;
19
20
  export declare function getLogLevelName(level: number): string;
20
21
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,eAAO,MAAM,QAAQ,QAAO,OA0B3B,CAAC;AAGF,eAAO,MAAM,OAAO,GAAI,OAAO,IAAI,uBAkBlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,KAAG,MAoBhD,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,GAAG,MAAM,KAAG,MAYzD,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,MAW3C,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,KAAG,MAI7C,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,MAEhD,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,KAAG,MAe3C,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,EAAE,oBAAgB,WAOtD,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,IAAI,MAAM,yIAuCnC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,kCAU7C,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,EAAE,QAAQ,MAAM,YAa9D,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,EAAE,UAAU,MAAM,KAAG,OAyBlE,CAAC;AAEF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAiBrD;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,OA0D5C,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,OAAO,kBAAkB,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,kBAAkB,EAAE,KAAG,OAqBrI,CAAC;AAGF,eAAO,MAAM,uBAAuB,GAAI,OAAO,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC,EAAE;;CA4B/F,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,OAAO,QAAQ,EAAE,EAAE,WAAW,MAAM,QAAQ,EAAE,eAAe,KAAK,GAAG,MAAM,eAqBxG,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,WAAW,MAAM;WACH,MAAM;WAAS,MAAM;GAwCtE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,WAK/C,CAAC"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,eAAO,MAAM,QAAQ,QAAO,OA0B3B,CAAC;AAGF,eAAO,MAAM,OAAO,GAAI,OAAO,IAAI,uBAkBlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,KAAG,MAoBhD,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,GAAG,MAAM,KAAG,MAYzD,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,MAW3C,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,KAAG,MAI7C,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,MAEhD,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,KAAG,MAe3C,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,EAAE,oBAAgB,WAOtD,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,IAAI,MAAM,yIAuCnC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,kCAU7C,CAAC;AAIF,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,EAAE,QAAQ,MAAM,YAa9D,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,QAAQ,OAAO,2jBAsB/C,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,EAAE,UAAU,MAAM,KAAG,OAyBlE,CAAC;AAEF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAiBrD;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,OA0D5C,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,OAAO,kBAAkB,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,kBAAkB,EAAE,KAAG,OAqBrI,CAAC;AAGF,eAAO,MAAM,uBAAuB,GAAI,OAAO,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC,EAAE;;CA4B/F,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,OAAO,QAAQ,EAAE,EAAE,WAAW,MAAM,QAAQ,EAAE,eAAe,KAAK,GAAG,MAAM,eAqBxG,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,WAAW,MAAM;WACH,MAAM;WAAS,MAAM;GAwCtE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,WAK/C,CAAC"}
@@ -1,9 +1,9 @@
1
- const f = () => {
1
+ const d = () => {
2
2
  if (typeof navigator > "u" || typeof window > "u")
3
3
  return !1;
4
- const e = navigator.userAgent || navigator.vendor || window.opera || "", t = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i, n = "ontouchstart" in window || navigator.maxTouchPoints > 0, i = window.innerWidth <= 768;
5
- return !!(t.test(e) || n && i);
6
- }, c = new Intl.RelativeTimeFormat("en"), d = (e) => {
4
+ const e = navigator.userAgent || navigator.vendor || window.opera || "", t = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i, n = "ontouchstart" in window || navigator.maxTouchPoints > 0, s = window.innerWidth <= 768;
5
+ return !!(t.test(e) || n && s);
6
+ }, c = new Intl.RelativeTimeFormat("en"), f = (e) => {
7
7
  const t = e instanceof Date ? e : new Date(e), n = {
8
8
  years: 3600 * 24 * 365,
9
9
  months: 3600 * 24 * 30,
@@ -12,19 +12,19 @@ const f = () => {
12
12
  hours: 3600,
13
13
  minutes: 60,
14
14
  seconds: 1
15
- }, i = (t.getTime() - Date.now()) / 1e3;
15
+ }, s = (t.getTime() - Date.now()) / 1e3;
16
16
  for (const r in n)
17
- if (n[r] < Math.abs(i)) {
18
- const s = i / n[r];
19
- return c.format(Math.round(s), r);
17
+ if (n[r] < Math.abs(s)) {
18
+ const o = s / n[r];
19
+ return c.format(Math.round(o), r);
20
20
  }
21
- }, h = (e) => {
21
+ }, p = (e) => {
22
22
  if (!e) return "0s";
23
23
  if (e < 1)
24
24
  return `${Math.round(e * 1e3)}ms`;
25
- const t = Math.floor(e / 3600), n = Math.floor(e % 3600 / 60), i = Math.floor(e % 60);
26
- return t >= 1 ? `${t} h ${n} min` : n >= 1 ? `${n} min` : `${i}s`;
27
- }, m = (e) => {
25
+ const t = Math.floor(e / 3600), n = Math.floor(e % 3600 / 60), s = Math.floor(e % 60);
26
+ return t >= 1 ? `${t} h ${n} min` : n >= 1 ? `${n} min` : `${s}s`;
27
+ }, h = (e) => {
28
28
  const t = new Date(e), n = {
29
29
  year: "numeric",
30
30
  month: "short",
@@ -33,31 +33,34 @@ const f = () => {
33
33
  minute: "2-digit"
34
34
  };
35
35
  return t.toLocaleString("en-US", n);
36
- }, g = (e) => {
36
+ }, m = (e) => {
37
37
  const t = ["B", "KB", "MB", "GB", "TB", "PB"];
38
- let n = e || 0, i = 0;
39
- for (; n >= 1024 && i < t.length - 1; )
40
- n /= 1024, i++;
41
- return `${n.toFixed(2)} ${t[i]}`;
42
- }, w = (e) => e < 1e3 ? e.toString() : `${(e / 1e3).toFixed(1)}k`, v = (e) => (e & 511).toString(8).padStart(3, "0"), b = (e) => e >= 86400 ? `${Math.floor(e / 86400)}d` : e >= 3600 ? `${Math.floor(e / 3600)}h` : e >= 60 ? `${Math.floor(e / 60)}m` : `${Math.floor(e)}s`, p = (e, t = 10) => {
38
+ let n = e || 0, s = 0;
39
+ for (; n >= 1024 && s < t.length - 1; )
40
+ n /= 1024, s++;
41
+ return `${n.toFixed(2)} ${t[s]}`;
42
+ }, g = (e) => e < 1e3 ? e.toString() : `${(e / 1e3).toFixed(1)}k`, w = (e) => (e & 511).toString(8).padStart(3, "0"), v = (e) => e >= 86400 ? `${Math.floor(e / 86400)}d` : e >= 3600 ? `${Math.floor(e / 3600)}h` : e >= 60 ? `${Math.floor(e / 60)}m` : `${Math.floor(e)}s`, b = (e, t = 10) => {
43
43
  if (e.length <= t * 2) return e;
44
- const n = e.slice(0, t), i = e.slice(-t);
45
- return `${n}...${i}`;
44
+ const n = e.slice(0, t), s = e.slice(-t);
45
+ return `${n}...${s}`;
46
46
  }, $ = (e) => {
47
47
  const t = e.toLowerCase();
48
48
  return t.includes("windows") ? "windows" : t.includes("mac") ? "macos" : t.includes("centos") ? "centos" : t.includes("fedora") ? "fedora" : t.includes("debian") ? "debian" : t.includes("mint") ? "mint" : t.includes("pop") ? "popos" : t.includes("ubuntu") ? "ubuntu" : t.includes("kali") ? "kali" : t.includes("arch") ? "arch" : t.includes("zorin") ? "zorin" : t.includes("manjaro") ? "manjaro" : "linux";
49
- }, z = (e) => {
49
+ }, y = (e) => {
50
50
  const t = e.toLowerCase();
51
51
  return t.includes("amd") ? "amd" : t.includes("intel") ? "intel" : "processor";
52
- }, A = (e, t) => {
52
+ }, z = (e, t) => {
53
53
  if (!e || !t) return !1;
54
- const n = e.split(".").map(Number), i = t.split(".").map(Number);
54
+ const n = e.split(".").map(Number), s = t.split(".").map(Number);
55
55
  for (let r = 0; r < 3; r++) {
56
- const s = n[r] || 0, o = i[r] || 0;
57
- if (s < o) return !0;
58
- if (s > o) return !1;
56
+ const o = n[r] || 0, a = s[r] || 0;
57
+ if (o < a) return !0;
58
+ if (o > a) return !1;
59
59
  }
60
60
  return !1;
61
+ }, A = (e) => {
62
+ const t = window.plutonInstallType || "unknown";
63
+ return console.log("installType :", t), t === "binary" ? e ? "https://docs.usepluton.com/docs/pluton-pro/install-pluton-pro-desktop#updating" : "https://docs.usepluton.com/docs/getting-started/install-pluton-desktop#updating" : t === "server" ? e ? "https://docs.usepluton.com/docs/pluton-pro/install-pluton-pro-linux-server#updating" : "https://docs.usepluton.com/docs/getting-started/install-pluton-linux-server#updating-pluton" : t === "docker" ? e ? "https://docs.usepluton.com/docs/pluton-pro/deploy-pluton-pro-docker#updating" : "https://docs.usepluton.com/docs/getting-started/deploy-docker#quick-reference" : "https://github.com/plutonhq/pluton/releases/latest";
61
64
  }, M = (e, t) => t === "win32" ? e.includes("server") || e.includes("windows server") : t === "linux" ? e.includes("server") || e.includes("enterprise") || e.includes("centos") || e.includes("redhat") || e.includes("ubuntu server") || e.includes("debian") || e.includes("fedora server") : t === "darwin" ? e.includes("server") : !1;
62
65
  function S(e) {
63
66
  switch (e) {
@@ -77,47 +80,47 @@ function S(e) {
77
80
  return "unknown";
78
81
  }
79
82
  }
80
- const B = (e) => {
83
+ const x = (e) => {
81
84
  if (!e || typeof e != "string")
82
85
  return !1;
83
86
  const t = e.trim();
84
87
  if (t.length === 0 || t.length > 254 || !/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/.test(t))
85
88
  return !1;
86
- const [i, r] = t.split("@");
87
- if (!i || i.length > 64 || !r || r.length > 253 || !r.includes("."))
89
+ const [s, r] = t.split("@");
90
+ if (!s || s.length > 64 || !r || r.length > 253 || !r.includes("."))
88
91
  return !1;
89
- const s = r.split("."), o = s[s.length - 1];
90
- return !(!o || o.length < 2 || i.startsWith(".") || i.endsWith(".") || i.includes("..") || r.startsWith(".") || r.endsWith(".") || r.includes(".."));
91
- }, P = (e, t, n) => !e.condition || e.condition.length === 0 ? !0 : e.condition.some((i) => Object.entries(i).every(([r, s]) => {
92
- const o = n.find((a) => a.value === r);
93
- return o ? (t[r] !== void 0 ? t[r] : o.default) === s : !1;
94
- })), x = (e) => {
92
+ const o = r.split("."), a = o[o.length - 1];
93
+ return !(!a || a.length < 2 || s.startsWith(".") || s.endsWith(".") || s.includes("..") || r.startsWith(".") || r.endsWith(".") || r.includes(".."));
94
+ }, B = (e, t, n) => !e.condition || e.condition.length === 0 ? !0 : e.condition.some((s) => Object.entries(s).every(([r, o]) => {
95
+ const a = n.find((i) => i.value === r);
96
+ return a ? (t[r] !== void 0 ? t[r] : a.default) === o : !1;
97
+ })), k = (e) => {
95
98
  const t = {};
96
99
  return e.forEach((n) => {
97
100
  n.isDirectory && (t[n.path] = 0);
98
101
  }), e.forEach((n) => {
99
102
  if (!n.isDirectory && n.size) {
100
- let i = n.path.split("/").filter(Boolean), r = "";
101
- for (let s = 0; s < i.length - 1; s++)
102
- r = r ? `${r}/${i[s]}` : `/${i[s]}`, t[r] !== void 0 && (t[r] += n.size);
103
+ let s = n.path.split("/").filter(Boolean), r = "";
104
+ for (let o = 0; o < s.length - 1; o++)
105
+ r = r ? `${r}/${s[o]}` : `/${s[o]}`, t[r] !== void 0 && (t[r] += n.size);
103
106
  }
104
107
  }), t;
105
- }, y = (e, t, n) => [...e].sort((i, r) => {
106
- var s, o;
108
+ }, P = (e, t, n) => [...e].sort((s, r) => {
109
+ var o, a;
107
110
  if (t === "name") {
108
- const u = i.name.toLowerCase(), a = r.name.toLowerCase();
109
- return n === "asc" ? u.localeCompare(a) : a.localeCompare(u);
111
+ const u = s.name.toLowerCase(), i = r.name.toLowerCase();
112
+ return n === "asc" ? u.localeCompare(i) : i.localeCompare(u);
110
113
  } else if (t === "modifiedAt") {
111
- const u = new Date(i.modifiedAt).getTime(), a = new Date(r.modifiedAt).getTime();
112
- return n === "asc" ? u - a : a - u;
114
+ const u = new Date(s.modifiedAt).getTime(), i = new Date(r.modifiedAt).getTime();
115
+ return n === "asc" ? u - i : i - u;
113
116
  } else if (t === "size") {
114
- const u = i.size || 0, a = r.size || 0;
115
- return n === "asc" ? u - a : a - u;
117
+ const u = s.size || 0, i = r.size || 0;
118
+ return n === "asc" ? u - i : i - u;
116
119
  } else {
117
- const u = n === "asc" ? 1 : -1, a = ((s = i[t]) == null ? void 0 : s.toString()) || "", l = ((o = r[t]) == null ? void 0 : o.toString()) || "";
118
- return a.localeCompare(l) * u;
120
+ const u = n === "asc" ? 1 : -1, i = ((o = s[t]) == null ? void 0 : o.toString()) || "", l = ((a = r[t]) == null ? void 0 : a.toString()) || "";
121
+ return i.localeCompare(l) * u;
119
122
  }
120
- }), C = (e) => {
123
+ }), T = (e) => {
121
124
  const t = {
122
125
  Windows: [
123
126
  { label: "PowerShell", value: "powershell" },
@@ -147,33 +150,34 @@ const B = (e) => {
147
150
  return t.Linux;
148
151
  default:
149
152
  const n = [];
150
- return Object.keys(t).map((i) => {
151
- t[i].forEach((r) => {
152
- n.findIndex((s) => s.value === r.value) === -1 && n.push({ label: `${r.label} (${r.value})`, value: r.value });
153
+ return Object.keys(t).map((s) => {
154
+ t[s].forEach((r) => {
155
+ n.findIndex((o) => o.value === r.value) === -1 && n.push({ label: `${r.label} (${r.value})`, value: r.value });
153
156
  });
154
157
  }), n;
155
158
  }
156
- }, D = (e) => e === 0 ? "" : e > 60 ? `${Math.round(e / 60)} min` : `${e} sec`;
159
+ }, C = (e) => e === 0 ? "" : e > 60 ? `${Math.round(e / 60)} min` : `${e} sec`;
157
160
  export {
158
- x as calculateDirectorySizes,
159
- p as clipPath,
160
- A as compareVersions,
161
- g as formatBytes,
162
- m as formatDateTime,
163
- h as formatDuration,
164
- w as formatNumberToK,
165
- v as formatPermissions,
166
- b as formatSeconds,
167
- C as getAvailableCliApps,
161
+ k as calculateDirectorySizes,
162
+ b as clipPath,
163
+ z as compareVersions,
164
+ m as formatBytes,
165
+ h as formatDateTime,
166
+ p as formatDuration,
167
+ g as formatNumberToK,
168
+ w as formatPermissions,
169
+ v as formatSeconds,
170
+ T as getAvailableCliApps,
168
171
  S as getLogLevelName,
169
172
  $ as getOSIcon,
170
- z as getProcessorIcon,
171
- f as isMobile,
173
+ y as getProcessorIcon,
174
+ A as getUpdateDocLink,
175
+ d as isMobile,
172
176
  M as isServerEdition,
173
- B as isValidEmail,
174
- D as secondsToMinutes,
175
- P as shouldDisplayStorageField,
176
- y as sortFileItems,
177
- d as timeAgo
177
+ x as isValidEmail,
178
+ C as secondsToMinutes,
179
+ B as shouldDisplayStorageField,
180
+ P as sortFileItems,
181
+ f as timeAgo
178
182
  };
179
183
  //# sourceMappingURL=helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sources":["../../src/utils/helpers.ts"],"sourcesContent":["import { storageOptionField } from '../@types/storages';\r\nimport { FileItem } from '../@types/system';\r\n\r\nexport const isMobile = (): boolean => {\r\n // Server-side rendering check\r\n if (typeof navigator === 'undefined' || typeof window === 'undefined') {\r\n return false;\r\n }\r\n\r\n const userAgent = navigator.userAgent || navigator.vendor || (window as any).opera || '';\r\n\r\n // Check for mobile user agents\r\n const mobileRegex = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i;\r\n\r\n // Check for touch capability and screen size\r\n const hasTouch = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\r\n const smallScreen = window.innerWidth <= 768;\r\n\r\n // Primary check: user agent\r\n if (mobileRegex.test(userAgent)) {\r\n return true;\r\n }\r\n\r\n // Secondary check: touch + small screen (for edge cases)\r\n if (hasTouch && smallScreen) {\r\n return true;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst formatter = new Intl.RelativeTimeFormat('en');\r\nexport const timeAgo = (input: Date) => {\r\n const date = input instanceof Date ? input : new Date(input);\r\n const ranges: { [k: string]: number } = {\r\n years: 3600 * 24 * 365,\r\n months: 3600 * 24 * 30,\r\n weeks: 3600 * 24 * 7,\r\n days: 3600 * 24,\r\n hours: 3600,\r\n minutes: 60,\r\n seconds: 1,\r\n };\r\n const secondsElapsed = (date.getTime() - Date.now()) / 1000;\r\n for (const key in ranges) {\r\n if (ranges[key] < Math.abs(secondsElapsed)) {\r\n const delta = secondsElapsed / ranges[key];\r\n return formatter.format(Math.round(delta), key as Intl.RelativeTimeFormatUnit);\r\n }\r\n }\r\n};\r\n\r\n/** * Formats a duration in seconds to a human-readable string\r\n * @param seconds - Duration in seconds\r\n */\r\nexport const formatDuration = (seconds: number): string => {\r\n if (!seconds) return '0s';\r\n\r\n if (seconds < 1) {\r\n return `${Math.round(seconds * 1000)}ms`;\r\n }\r\n\r\n const hours = Math.floor(seconds / 3600);\r\n const minutes = Math.floor((seconds % 3600) / 60);\r\n const remainingSeconds = Math.floor(seconds % 60);\r\n\r\n if (hours >= 1) {\r\n return `${hours} h ${minutes} min`;\r\n }\r\n\r\n if (minutes >= 1) {\r\n return `${minutes} min`;\r\n }\r\n\r\n return `${remainingSeconds}s`;\r\n};\r\n\r\nexport const formatDateTime = (isoDate: string | number): string => {\r\n const date = new Date(isoDate);\r\n\r\n const options: Intl.DateTimeFormatOptions = {\r\n year: 'numeric',\r\n month: 'short',\r\n day: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n };\r\n\r\n return date.toLocaleString('en-US', options);\r\n};\r\n\r\nexport const formatBytes = (bytes: number): string => {\r\n const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];\r\n let value = bytes || 0;\r\n let unitIndex = 0;\r\n\r\n while (value >= 1024 && unitIndex < units.length - 1) {\r\n value /= 1024;\r\n unitIndex++;\r\n }\r\n\r\n return `${value.toFixed(2)} ${units[unitIndex]}`;\r\n};\r\n\r\nexport const formatNumberToK = (num: number): string => {\r\n if (num < 1000) return num.toString();\r\n const value = num / 1000;\r\n return `${value.toFixed(1)}k`;\r\n};\r\n\r\nexport const formatPermissions = (mode: number): string => {\r\n return (mode & 0o777).toString(8).padStart(3, '0');\r\n};\r\n\r\nexport const formatSeconds = (num: number): string => {\r\n // should convert seconds to minutes, hours or days if applicable\r\n if (num >= 86400) {\r\n return `${Math.floor(num / 86400)}d`;\r\n }\r\n\r\n if (num >= 3600) {\r\n return `${Math.floor(num / 3600)}h`;\r\n }\r\n\r\n if (num >= 60) {\r\n return `${Math.floor(num / 60)}m`;\r\n }\r\n\r\n return `${Math.floor(num)}s`;\r\n};\r\n\r\nexport const clipPath = (path: string, charsOnSide = 10) => {\r\n if (path.length <= charsOnSide * 2) return path;\r\n\r\n const start = path.slice(0, charsOnSide);\r\n const end = path.slice(-charsOnSide);\r\n\r\n return `${start}...${end}`;\r\n};\r\n\r\nexport const getOSIcon = (os: string) => {\r\n const osString = os.toLowerCase();\r\n if (osString.includes('windows')) {\r\n return 'windows';\r\n }\r\n if (osString.includes('mac')) {\r\n return 'macos';\r\n }\r\n if (osString.includes('centos')) {\r\n return 'centos';\r\n }\r\n if (osString.includes('fedora')) {\r\n return 'fedora';\r\n }\r\n if (osString.includes('debian')) {\r\n return 'debian';\r\n }\r\n if (osString.includes('mint')) {\r\n return 'mint';\r\n }\r\n if (osString.includes('pop')) {\r\n return 'popos';\r\n }\r\n if (osString.includes('ubuntu')) {\r\n return 'ubuntu';\r\n }\r\n if (osString.includes('kali')) {\r\n return 'kali';\r\n }\r\n if (osString.includes('arch')) {\r\n return 'arch';\r\n }\r\n if (osString.includes('zorin')) {\r\n return 'zorin';\r\n }\r\n if (osString.includes('manjaro')) {\r\n return 'manjaro';\r\n }\r\n return 'linux';\r\n};\r\n\r\nexport const getProcessorIcon = (brand: string) => {\r\n const osString = brand.toLowerCase();\r\n if (osString.includes('amd')) {\r\n return 'amd';\r\n }\r\n if (osString.includes('intel')) {\r\n return 'intel';\r\n }\r\n\r\n return 'processor';\r\n};\r\n\r\nexport const compareVersions = (current: string, latest: string) => {\r\n if (!current || !latest) return false;\r\n const currentParts = current.split('.').map(Number);\r\n const latestParts = latest.split('.').map(Number);\r\n\r\n for (let i = 0; i < 3; i++) {\r\n const curr = currentParts[i] || 0;\r\n const late = latestParts[i] || 0;\r\n\r\n if (curr < late) return true;\r\n if (curr > late) return false;\r\n }\r\n return false;\r\n};\r\n\r\nexport const isServerEdition = (distro: string, platform: string): boolean => {\r\n // Check Windows Server editions\r\n if (platform === 'win32') {\r\n return distro.includes('server') || distro.includes('windows server');\r\n }\r\n\r\n // Check Linux server distributions\r\n if (platform === 'linux') {\r\n return (\r\n distro.includes('server') ||\r\n distro.includes('enterprise') ||\r\n distro.includes('centos') ||\r\n distro.includes('redhat') ||\r\n distro.includes('ubuntu server') ||\r\n distro.includes('debian') ||\r\n distro.includes('fedora server')\r\n );\r\n }\r\n\r\n // Check macOS Server (though it's discontinued, some may still use it)\r\n if (platform === 'darwin') {\r\n return distro.includes('server');\r\n }\r\n\r\n return false;\r\n};\r\n\r\nexport function getLogLevelName(level: number): string {\r\n switch (level) {\r\n case 10:\r\n return 'trace';\r\n case 20:\r\n return 'debug';\r\n case 30:\r\n return 'info';\r\n case 40:\r\n return 'warn';\r\n case 50:\r\n return 'error';\r\n case 60:\r\n return 'fatal';\r\n default:\r\n return 'unknown';\r\n }\r\n}\r\n\r\n/**\r\n * Validates if a string is a valid email address\r\n * @param email - The email string to validate\r\n * @returns boolean - True if email is valid, false otherwise\r\n */\r\nexport const isValidEmail = (email: string): boolean => {\r\n if (!email || typeof email !== 'string') {\r\n return false;\r\n }\r\n\r\n const trimmedEmail = email.trim();\r\n\r\n // Check length limits\r\n if (trimmedEmail.length === 0 || trimmedEmail.length > 254) {\r\n return false;\r\n }\r\n\r\n // More strict email regex that requires proper TLD\r\n const emailRegex =\r\n /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/;\r\n\r\n if (!emailRegex.test(trimmedEmail)) {\r\n return false;\r\n }\r\n\r\n // Split and validate local and domain parts\r\n const [localPart, domainPart] = trimmedEmail.split('@');\r\n\r\n // Validate local part (before @)\r\n if (!localPart || localPart.length > 64) {\r\n return false;\r\n }\r\n\r\n // Validate domain part (after @)\r\n if (!domainPart || domainPart.length > 253) {\r\n return false;\r\n }\r\n\r\n // Ensure domain has at least one dot and proper TLD\r\n if (!domainPart.includes('.')) {\r\n return false;\r\n }\r\n\r\n // Check TLD is at least 2 characters\r\n const domainParts = domainPart.split('.');\r\n const tld = domainParts[domainParts.length - 1];\r\n if (!tld || tld.length < 2) {\r\n return false;\r\n }\r\n\r\n // Check for invalid patterns\r\n if (\r\n localPart.startsWith('.') ||\r\n localPart.endsWith('.') ||\r\n localPart.includes('..') ||\r\n domainPart.startsWith('.') ||\r\n domainPart.endsWith('.') ||\r\n domainPart.includes('..')\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nexport const shouldDisplayStorageField = (field: storageOptionField, settings: Record<string, any>, allFields: storageOptionField[]): boolean => {\r\n // If no conditions, always display the field\r\n if (!field.condition || field.condition.length === 0) {\r\n return true;\r\n }\r\n\r\n // A field is displayed if ANY of its conditions are fully satisfied\r\n return field.condition.some((condition) => {\r\n // A condition is satisfied if ALL its key-value pairs match\r\n return Object.entries(condition).every(([condKey, condValue]) => {\r\n // Find the field that this condition refers to\r\n const targetField = allFields.find((f) => f.value === condKey);\r\n if (!targetField) return false;\r\n\r\n // Get the current value from settings, or use the default\r\n const currentValue = settings[condKey] !== undefined ? settings[condKey] : targetField.default;\r\n\r\n // Check if the condition value matches the field's value\r\n return currentValue === condValue;\r\n });\r\n });\r\n};\r\n\r\n// Calculate the size of each directory based on its files\r\nexport const calculateDirectorySizes = (files: Pick<FileItem, 'path' | 'size' | 'isDirectory'>[]) => {\r\n const dirSizes: { [path: string]: number } = {};\r\n\r\n // Initialize all directories with size 0\r\n files.forEach((file) => {\r\n if (file.isDirectory) {\r\n dirSizes[file.path] = 0;\r\n }\r\n });\r\n\r\n // Sum up file sizes for each directory\r\n files.forEach((file) => {\r\n if (!file.isDirectory && file.size) {\r\n // For each file, add its size to all parent directories\r\n let pathParts = file.path.split('/').filter(Boolean);\r\n let currentPath = '';\r\n\r\n // Add size to each parent directory\r\n for (let i = 0; i < pathParts.length - 1; i++) {\r\n currentPath = currentPath ? `${currentPath}/${pathParts[i]}` : `/${pathParts[i]}`;\r\n if (dirSizes[currentPath] !== undefined) {\r\n dirSizes[currentPath] += file.size;\r\n }\r\n }\r\n }\r\n });\r\n\r\n return dirSizes;\r\n};\r\n\r\nexport const sortFileItems = (items: FileItem[], sortField: keyof FileItem, sortDirection: 'asc' | 'desc') => {\r\n return [...items].sort((a, b) => {\r\n if (sortField === 'name') {\r\n const nameA = a.name.toLowerCase();\r\n const nameB = b.name.toLowerCase();\r\n return sortDirection === 'asc' ? nameA.localeCompare(nameB) : nameB.localeCompare(nameA);\r\n } else if (sortField === 'modifiedAt') {\r\n const dateA = new Date(a.modifiedAt).getTime();\r\n const dateB = new Date(b.modifiedAt).getTime();\r\n return sortDirection === 'asc' ? dateA - dateB : dateB - dateA;\r\n } else if (sortField === 'size') {\r\n const sizeA = a.size || 0;\r\n const sizeB = b.size || 0;\r\n return sortDirection === 'asc' ? sizeA - sizeB : sizeB - sizeA;\r\n } else {\r\n const multiplier = sortDirection === 'asc' ? 1 : -1;\r\n const valueA = a[sortField]?.toString() || '';\r\n const valueB = b[sortField]?.toString() || '';\r\n return valueA.localeCompare(valueB) * multiplier;\r\n }\r\n });\r\n};\r\n\r\nexport const getAvailableCliApps = (platform?: string) => {\r\n const availableShells: Record<string, { label: string; value: string }[]> = {\r\n Windows: [\r\n { label: 'PowerShell', value: 'powershell' },\r\n { label: 'Command Prompt (CMD)', value: 'cmd' },\r\n { label: 'Bash', value: 'bash' },\r\n ],\r\n MacOs: [\r\n { label: 'Zsh', value: 'zsh' },\r\n { label: 'Bash', value: '/bin/bash' },\r\n { label: 'sh', value: '/bin/sh' },\r\n ],\r\n Linux: [\r\n { label: 'Bash', value: '/bin/bash' },\r\n { label: 'sh', value: '/bin/sh' },\r\n { label: 'Zsh', value: 'zsh' },\r\n ],\r\n };\r\n type typeofOSType = keyof typeof availableShells;\r\n\r\n switch (platform) {\r\n case 'win32':\r\n case 'windows':\r\n case 'Windows':\r\n return availableShells.Windows;\r\n case 'darwin':\r\n return availableShells.MacOs;\r\n case 'linux':\r\n case 'Linux':\r\n return availableShells.Linux;\r\n default:\r\n const allShells: { label: string; value: string }[] = [];\r\n (Object.keys(availableShells) as typeofOSType[]).map((OSType) => {\r\n availableShells[OSType].forEach((shell) => {\r\n if (allShells.findIndex((s) => s.value === shell.value) === -1) {\r\n allShells.push({ label: `${shell.label} (${shell.value})`, value: shell.value });\r\n }\r\n });\r\n });\r\n return allShells;\r\n }\r\n};\r\n\r\nexport const secondsToMinutes = (seconds: number) => {\r\n if (seconds === 0) {\r\n return '';\r\n }\r\n return seconds > 60 ? `${Math.round(seconds / 60)} min` : `${seconds} sec`;\r\n};\r\n"],"names":["isMobile","userAgent","mobileRegex","hasTouch","smallScreen","formatter","timeAgo","input","date","ranges","secondsElapsed","key","delta","formatDuration","seconds","hours","minutes","remainingSeconds","formatDateTime","isoDate","options","formatBytes","bytes","units","value","unitIndex","formatNumberToK","num","formatPermissions","mode","formatSeconds","clipPath","path","charsOnSide","start","end","getOSIcon","os","osString","getProcessorIcon","brand","compareVersions","current","latest","currentParts","latestParts","i","curr","late","isServerEdition","distro","platform","getLogLevelName","level","isValidEmail","email","trimmedEmail","localPart","domainPart","domainParts","tld","shouldDisplayStorageField","field","settings","allFields","condition","condKey","condValue","targetField","f","calculateDirectorySizes","files","dirSizes","file","pathParts","currentPath","sortFileItems","items","sortField","sortDirection","a","b","_a","_b","nameA","nameB","dateA","dateB","sizeA","sizeB","multiplier","valueA","valueB","getAvailableCliApps","availableShells","allShells","OSType","shell","secondsToMinutes"],"mappings":"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"}
1
+ {"version":3,"file":"helpers.js","sources":["../../src/utils/helpers.ts"],"sourcesContent":["import { storageOptionField } from '../@types/storages';\r\nimport { FileItem } from '../@types/system';\r\n\r\nexport const isMobile = (): boolean => {\r\n // Server-side rendering check\r\n if (typeof navigator === 'undefined' || typeof window === 'undefined') {\r\n return false;\r\n }\r\n\r\n const userAgent = navigator.userAgent || navigator.vendor || (window as any).opera || '';\r\n\r\n // Check for mobile user agents\r\n const mobileRegex = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i;\r\n\r\n // Check for touch capability and screen size\r\n const hasTouch = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\r\n const smallScreen = window.innerWidth <= 768;\r\n\r\n // Primary check: user agent\r\n if (mobileRegex.test(userAgent)) {\r\n return true;\r\n }\r\n\r\n // Secondary check: touch + small screen (for edge cases)\r\n if (hasTouch && smallScreen) {\r\n return true;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst formatter = new Intl.RelativeTimeFormat('en');\r\nexport const timeAgo = (input: Date) => {\r\n const date = input instanceof Date ? input : new Date(input);\r\n const ranges: { [k: string]: number } = {\r\n years: 3600 * 24 * 365,\r\n months: 3600 * 24 * 30,\r\n weeks: 3600 * 24 * 7,\r\n days: 3600 * 24,\r\n hours: 3600,\r\n minutes: 60,\r\n seconds: 1,\r\n };\r\n const secondsElapsed = (date.getTime() - Date.now()) / 1000;\r\n for (const key in ranges) {\r\n if (ranges[key] < Math.abs(secondsElapsed)) {\r\n const delta = secondsElapsed / ranges[key];\r\n return formatter.format(Math.round(delta), key as Intl.RelativeTimeFormatUnit);\r\n }\r\n }\r\n};\r\n\r\n/** * Formats a duration in seconds to a human-readable string\r\n * @param seconds - Duration in seconds\r\n */\r\nexport const formatDuration = (seconds: number): string => {\r\n if (!seconds) return '0s';\r\n\r\n if (seconds < 1) {\r\n return `${Math.round(seconds * 1000)}ms`;\r\n }\r\n\r\n const hours = Math.floor(seconds / 3600);\r\n const minutes = Math.floor((seconds % 3600) / 60);\r\n const remainingSeconds = Math.floor(seconds % 60);\r\n\r\n if (hours >= 1) {\r\n return `${hours} h ${minutes} min`;\r\n }\r\n\r\n if (minutes >= 1) {\r\n return `${minutes} min`;\r\n }\r\n\r\n return `${remainingSeconds}s`;\r\n};\r\n\r\nexport const formatDateTime = (isoDate: string | number): string => {\r\n const date = new Date(isoDate);\r\n\r\n const options: Intl.DateTimeFormatOptions = {\r\n year: 'numeric',\r\n month: 'short',\r\n day: 'numeric',\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n };\r\n\r\n return date.toLocaleString('en-US', options);\r\n};\r\n\r\nexport const formatBytes = (bytes: number): string => {\r\n const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];\r\n let value = bytes || 0;\r\n let unitIndex = 0;\r\n\r\n while (value >= 1024 && unitIndex < units.length - 1) {\r\n value /= 1024;\r\n unitIndex++;\r\n }\r\n\r\n return `${value.toFixed(2)} ${units[unitIndex]}`;\r\n};\r\n\r\nexport const formatNumberToK = (num: number): string => {\r\n if (num < 1000) return num.toString();\r\n const value = num / 1000;\r\n return `${value.toFixed(1)}k`;\r\n};\r\n\r\nexport const formatPermissions = (mode: number): string => {\r\n return (mode & 0o777).toString(8).padStart(3, '0');\r\n};\r\n\r\nexport const formatSeconds = (num: number): string => {\r\n // should convert seconds to minutes, hours or days if applicable\r\n if (num >= 86400) {\r\n return `${Math.floor(num / 86400)}d`;\r\n }\r\n\r\n if (num >= 3600) {\r\n return `${Math.floor(num / 3600)}h`;\r\n }\r\n\r\n if (num >= 60) {\r\n return `${Math.floor(num / 60)}m`;\r\n }\r\n\r\n return `${Math.floor(num)}s`;\r\n};\r\n\r\nexport const clipPath = (path: string, charsOnSide = 10) => {\r\n if (path.length <= charsOnSide * 2) return path;\r\n\r\n const start = path.slice(0, charsOnSide);\r\n const end = path.slice(-charsOnSide);\r\n\r\n return `${start}...${end}`;\r\n};\r\n\r\nexport const getOSIcon = (os: string) => {\r\n const osString = os.toLowerCase();\r\n if (osString.includes('windows')) {\r\n return 'windows';\r\n }\r\n if (osString.includes('mac')) {\r\n return 'macos';\r\n }\r\n if (osString.includes('centos')) {\r\n return 'centos';\r\n }\r\n if (osString.includes('fedora')) {\r\n return 'fedora';\r\n }\r\n if (osString.includes('debian')) {\r\n return 'debian';\r\n }\r\n if (osString.includes('mint')) {\r\n return 'mint';\r\n }\r\n if (osString.includes('pop')) {\r\n return 'popos';\r\n }\r\n if (osString.includes('ubuntu')) {\r\n return 'ubuntu';\r\n }\r\n if (osString.includes('kali')) {\r\n return 'kali';\r\n }\r\n if (osString.includes('arch')) {\r\n return 'arch';\r\n }\r\n if (osString.includes('zorin')) {\r\n return 'zorin';\r\n }\r\n if (osString.includes('manjaro')) {\r\n return 'manjaro';\r\n }\r\n return 'linux';\r\n};\r\n\r\nexport const getProcessorIcon = (brand: string) => {\r\n const osString = brand.toLowerCase();\r\n if (osString.includes('amd')) {\r\n return 'amd';\r\n }\r\n if (osString.includes('intel')) {\r\n return 'intel';\r\n }\r\n\r\n return 'processor';\r\n};\r\n\r\n// Compares two version strings (e.g., \"1.2.3\" and \"1.3.0\")\r\n// returns true if the latest version is newer than the current version\r\nexport const compareVersions = (current: string, latest: string) => {\r\n if (!current || !latest) return false;\r\n const currentParts = current.split('.').map(Number);\r\n const latestParts = latest.split('.').map(Number);\r\n\r\n for (let i = 0; i < 3; i++) {\r\n const curr = currentParts[i] || 0;\r\n const late = latestParts[i] || 0;\r\n\r\n if (curr < late) return true;\r\n if (curr > late) return false;\r\n }\r\n return false;\r\n};\r\n\r\nexport const getUpdateDocLink = (isPRO?: boolean) => {\r\n const installType = (window as any).plutonInstallType || 'unknown';\r\n console.log('installType :', installType);\r\n if (installType === 'binary') {\r\n if (isPRO) {\r\n return 'https://docs.usepluton.com/docs/pluton-pro/install-pluton-pro-desktop#updating';\r\n }\r\n return 'https://docs.usepluton.com/docs/getting-started/install-pluton-desktop#updating';\r\n }\r\n if (installType === 'server') {\r\n if (isPRO) {\r\n return 'https://docs.usepluton.com/docs/pluton-pro/install-pluton-pro-linux-server#updating';\r\n }\r\n return 'https://docs.usepluton.com/docs/getting-started/install-pluton-linux-server#updating-pluton';\r\n }\r\n if (installType === 'docker') {\r\n if (isPRO) {\r\n return 'https://docs.usepluton.com/docs/pluton-pro/deploy-pluton-pro-docker#updating';\r\n }\r\n return 'https://docs.usepluton.com/docs/getting-started/deploy-docker#quick-reference';\r\n }\r\n return 'https://github.com/plutonhq/pluton/releases/latest';\r\n};\r\n\r\nexport const isServerEdition = (distro: string, platform: string): boolean => {\r\n // Check Windows Server editions\r\n if (platform === 'win32') {\r\n return distro.includes('server') || distro.includes('windows server');\r\n }\r\n\r\n // Check Linux server distributions\r\n if (platform === 'linux') {\r\n return (\r\n distro.includes('server') ||\r\n distro.includes('enterprise') ||\r\n distro.includes('centos') ||\r\n distro.includes('redhat') ||\r\n distro.includes('ubuntu server') ||\r\n distro.includes('debian') ||\r\n distro.includes('fedora server')\r\n );\r\n }\r\n\r\n // Check macOS Server (though it's discontinued, some may still use it)\r\n if (platform === 'darwin') {\r\n return distro.includes('server');\r\n }\r\n\r\n return false;\r\n};\r\n\r\nexport function getLogLevelName(level: number): string {\r\n switch (level) {\r\n case 10:\r\n return 'trace';\r\n case 20:\r\n return 'debug';\r\n case 30:\r\n return 'info';\r\n case 40:\r\n return 'warn';\r\n case 50:\r\n return 'error';\r\n case 60:\r\n return 'fatal';\r\n default:\r\n return 'unknown';\r\n }\r\n}\r\n\r\n/**\r\n * Validates if a string is a valid email address\r\n * @param email - The email string to validate\r\n * @returns boolean - True if email is valid, false otherwise\r\n */\r\nexport const isValidEmail = (email: string): boolean => {\r\n if (!email || typeof email !== 'string') {\r\n return false;\r\n }\r\n\r\n const trimmedEmail = email.trim();\r\n\r\n // Check length limits\r\n if (trimmedEmail.length === 0 || trimmedEmail.length > 254) {\r\n return false;\r\n }\r\n\r\n // More strict email regex that requires proper TLD\r\n const emailRegex =\r\n /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/;\r\n\r\n if (!emailRegex.test(trimmedEmail)) {\r\n return false;\r\n }\r\n\r\n // Split and validate local and domain parts\r\n const [localPart, domainPart] = trimmedEmail.split('@');\r\n\r\n // Validate local part (before @)\r\n if (!localPart || localPart.length > 64) {\r\n return false;\r\n }\r\n\r\n // Validate domain part (after @)\r\n if (!domainPart || domainPart.length > 253) {\r\n return false;\r\n }\r\n\r\n // Ensure domain has at least one dot and proper TLD\r\n if (!domainPart.includes('.')) {\r\n return false;\r\n }\r\n\r\n // Check TLD is at least 2 characters\r\n const domainParts = domainPart.split('.');\r\n const tld = domainParts[domainParts.length - 1];\r\n if (!tld || tld.length < 2) {\r\n return false;\r\n }\r\n\r\n // Check for invalid patterns\r\n if (\r\n localPart.startsWith('.') ||\r\n localPart.endsWith('.') ||\r\n localPart.includes('..') ||\r\n domainPart.startsWith('.') ||\r\n domainPart.endsWith('.') ||\r\n domainPart.includes('..')\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nexport const shouldDisplayStorageField = (field: storageOptionField, settings: Record<string, any>, allFields: storageOptionField[]): boolean => {\r\n // If no conditions, always display the field\r\n if (!field.condition || field.condition.length === 0) {\r\n return true;\r\n }\r\n\r\n // A field is displayed if ANY of its conditions are fully satisfied\r\n return field.condition.some((condition) => {\r\n // A condition is satisfied if ALL its key-value pairs match\r\n return Object.entries(condition).every(([condKey, condValue]) => {\r\n // Find the field that this condition refers to\r\n const targetField = allFields.find((f) => f.value === condKey);\r\n if (!targetField) return false;\r\n\r\n // Get the current value from settings, or use the default\r\n const currentValue = settings[condKey] !== undefined ? settings[condKey] : targetField.default;\r\n\r\n // Check if the condition value matches the field's value\r\n return currentValue === condValue;\r\n });\r\n });\r\n};\r\n\r\n// Calculate the size of each directory based on its files\r\nexport const calculateDirectorySizes = (files: Pick<FileItem, 'path' | 'size' | 'isDirectory'>[]) => {\r\n const dirSizes: { [path: string]: number } = {};\r\n\r\n // Initialize all directories with size 0\r\n files.forEach((file) => {\r\n if (file.isDirectory) {\r\n dirSizes[file.path] = 0;\r\n }\r\n });\r\n\r\n // Sum up file sizes for each directory\r\n files.forEach((file) => {\r\n if (!file.isDirectory && file.size) {\r\n // For each file, add its size to all parent directories\r\n let pathParts = file.path.split('/').filter(Boolean);\r\n let currentPath = '';\r\n\r\n // Add size to each parent directory\r\n for (let i = 0; i < pathParts.length - 1; i++) {\r\n currentPath = currentPath ? `${currentPath}/${pathParts[i]}` : `/${pathParts[i]}`;\r\n if (dirSizes[currentPath] !== undefined) {\r\n dirSizes[currentPath] += file.size;\r\n }\r\n }\r\n }\r\n });\r\n\r\n return dirSizes;\r\n};\r\n\r\nexport const sortFileItems = (items: FileItem[], sortField: keyof FileItem, sortDirection: 'asc' | 'desc') => {\r\n return [...items].sort((a, b) => {\r\n if (sortField === 'name') {\r\n const nameA = a.name.toLowerCase();\r\n const nameB = b.name.toLowerCase();\r\n return sortDirection === 'asc' ? nameA.localeCompare(nameB) : nameB.localeCompare(nameA);\r\n } else if (sortField === 'modifiedAt') {\r\n const dateA = new Date(a.modifiedAt).getTime();\r\n const dateB = new Date(b.modifiedAt).getTime();\r\n return sortDirection === 'asc' ? dateA - dateB : dateB - dateA;\r\n } else if (sortField === 'size') {\r\n const sizeA = a.size || 0;\r\n const sizeB = b.size || 0;\r\n return sortDirection === 'asc' ? sizeA - sizeB : sizeB - sizeA;\r\n } else {\r\n const multiplier = sortDirection === 'asc' ? 1 : -1;\r\n const valueA = a[sortField]?.toString() || '';\r\n const valueB = b[sortField]?.toString() || '';\r\n return valueA.localeCompare(valueB) * multiplier;\r\n }\r\n });\r\n};\r\n\r\nexport const getAvailableCliApps = (platform?: string) => {\r\n const availableShells: Record<string, { label: string; value: string }[]> = {\r\n Windows: [\r\n { label: 'PowerShell', value: 'powershell' },\r\n { label: 'Command Prompt (CMD)', value: 'cmd' },\r\n { label: 'Bash', value: 'bash' },\r\n ],\r\n MacOs: [\r\n { label: 'Zsh', value: 'zsh' },\r\n { label: 'Bash', value: '/bin/bash' },\r\n { label: 'sh', value: '/bin/sh' },\r\n ],\r\n Linux: [\r\n { label: 'Bash', value: '/bin/bash' },\r\n { label: 'sh', value: '/bin/sh' },\r\n { label: 'Zsh', value: 'zsh' },\r\n ],\r\n };\r\n type typeofOSType = keyof typeof availableShells;\r\n\r\n switch (platform) {\r\n case 'win32':\r\n case 'windows':\r\n case 'Windows':\r\n return availableShells.Windows;\r\n case 'darwin':\r\n return availableShells.MacOs;\r\n case 'linux':\r\n case 'Linux':\r\n return availableShells.Linux;\r\n default:\r\n const allShells: { label: string; value: string }[] = [];\r\n (Object.keys(availableShells) as typeofOSType[]).map((OSType) => {\r\n availableShells[OSType].forEach((shell) => {\r\n if (allShells.findIndex((s) => s.value === shell.value) === -1) {\r\n allShells.push({ label: `${shell.label} (${shell.value})`, value: shell.value });\r\n }\r\n });\r\n });\r\n return allShells;\r\n }\r\n};\r\n\r\nexport const secondsToMinutes = (seconds: number) => {\r\n if (seconds === 0) {\r\n return '';\r\n }\r\n return seconds > 60 ? `${Math.round(seconds / 60)} min` : `${seconds} sec`;\r\n};\r\n"],"names":["isMobile","userAgent","mobileRegex","hasTouch","smallScreen","formatter","timeAgo","input","date","ranges","secondsElapsed","key","delta","formatDuration","seconds","hours","minutes","remainingSeconds","formatDateTime","isoDate","options","formatBytes","bytes","units","value","unitIndex","formatNumberToK","num","formatPermissions","mode","formatSeconds","clipPath","path","charsOnSide","start","end","getOSIcon","os","osString","getProcessorIcon","brand","compareVersions","current","latest","currentParts","latestParts","i","curr","late","getUpdateDocLink","isPRO","installType","isServerEdition","distro","platform","getLogLevelName","level","isValidEmail","email","trimmedEmail","localPart","domainPart","domainParts","tld","shouldDisplayStorageField","field","settings","allFields","condition","condKey","condValue","targetField","f","calculateDirectorySizes","files","dirSizes","file","pathParts","currentPath","sortFileItems","items","sortField","sortDirection","a","b","_a","_b","nameA","nameB","dateA","dateB","sizeA","sizeB","multiplier","valueA","valueB","getAvailableCliApps","availableShells","allShells","OSType","shell","s","secondsToMinutes"],"mappings":"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"}