@plutonhq/core-frontend 0.1.7 → 0.1.8
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.
|
@@ -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;
|
|
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,8 +1,8 @@
|
|
|
1
1
|
const f = () => {
|
|
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,
|
|
5
|
-
return !!(t.test(e) || n &&
|
|
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
6
|
}, c = new Intl.RelativeTimeFormat("en"), d = (e) => {
|
|
7
7
|
const t = e instanceof Date ? e : new Date(e), n = {
|
|
8
8
|
years: 3600 * 24 * 365,
|
|
@@ -12,18 +12,18 @@ const f = () => {
|
|
|
12
12
|
hours: 3600,
|
|
13
13
|
minutes: 60,
|
|
14
14
|
seconds: 1
|
|
15
|
-
},
|
|
16
|
-
for (const
|
|
17
|
-
if (n[
|
|
18
|
-
const
|
|
19
|
-
return c.format(Math.round(
|
|
15
|
+
}, i = (t.getTime() - Date.now()) / 1e3;
|
|
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);
|
|
20
20
|
}
|
|
21
21
|
}, h = (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),
|
|
26
|
-
return t >= 1 ? `${t} h ${n} min` : n >= 1 ? `${n} min` : `${
|
|
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
27
|
}, m = (e) => {
|
|
28
28
|
const t = new Date(e), n = {
|
|
29
29
|
year: "numeric",
|
|
@@ -35,14 +35,14 @@ const f = () => {
|
|
|
35
35
|
return t.toLocaleString("en-US", n);
|
|
36
36
|
}, g = (e) => {
|
|
37
37
|
const t = ["B", "KB", "MB", "GB", "TB", "PB"];
|
|
38
|
-
let n = e || 0,
|
|
39
|
-
for (; n >= 1024 &&
|
|
40
|
-
n /= 1024,
|
|
41
|
-
return `${n.toFixed(2)} ${t[
|
|
42
|
-
}, w = (e) => e < 1e3 ? e.toString() : `${(e / 1e3).toFixed(1)}k`,
|
|
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) => {
|
|
43
43
|
if (e.length <= t * 2) return e;
|
|
44
|
-
const n = e.slice(0, t),
|
|
45
|
-
return `${n}...${
|
|
44
|
+
const n = e.slice(0, t), i = e.slice(-t);
|
|
45
|
+
return `${n}...${i}`;
|
|
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";
|
|
@@ -51,11 +51,11 @@ const f = () => {
|
|
|
51
51
|
return t.includes("amd") ? "amd" : t.includes("intel") ? "intel" : "processor";
|
|
52
52
|
}, A = (e, t) => {
|
|
53
53
|
if (!e || !t) return !1;
|
|
54
|
-
const n = e.split(".").map(Number),
|
|
55
|
-
for (let
|
|
56
|
-
const
|
|
57
|
-
if (
|
|
58
|
-
if (
|
|
54
|
+
const n = e.split(".").map(Number), i = t.split(".").map(Number);
|
|
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;
|
|
59
59
|
}
|
|
60
60
|
return !1;
|
|
61
61
|
}, 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;
|
|
@@ -83,38 +83,38 @@ const B = (e) => {
|
|
|
83
83
|
const t = e.trim();
|
|
84
84
|
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
85
|
return !1;
|
|
86
|
-
const [
|
|
87
|
-
if (!
|
|
86
|
+
const [i, r] = t.split("@");
|
|
87
|
+
if (!i || i.length > 64 || !r || r.length > 253 || !r.includes("."))
|
|
88
88
|
return !1;
|
|
89
|
-
const
|
|
90
|
-
return !(!o || o.length < 2 ||
|
|
91
|
-
}, P = (e, t, n) => !e.condition || e.condition.length === 0 ? !0 : e.condition.some((
|
|
92
|
-
const o = n.find((a) => a.value ===
|
|
93
|
-
return o ? (t[
|
|
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
94
|
})), x = (e) => {
|
|
95
95
|
const t = {};
|
|
96
96
|
return e.forEach((n) => {
|
|
97
97
|
n.isDirectory && (t[n.path] = 0);
|
|
98
98
|
}), e.forEach((n) => {
|
|
99
99
|
if (!n.isDirectory && n.size) {
|
|
100
|
-
let
|
|
101
|
-
for (let
|
|
102
|
-
|
|
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
103
|
}
|
|
104
104
|
}), t;
|
|
105
|
-
}, y = (e, t, n) => [...e].sort((
|
|
106
|
-
var
|
|
105
|
+
}, y = (e, t, n) => [...e].sort((i, r) => {
|
|
106
|
+
var s, o;
|
|
107
107
|
if (t === "name") {
|
|
108
|
-
const u =
|
|
108
|
+
const u = i.name.toLowerCase(), a = r.name.toLowerCase();
|
|
109
109
|
return n === "asc" ? u.localeCompare(a) : a.localeCompare(u);
|
|
110
110
|
} else if (t === "modifiedAt") {
|
|
111
|
-
const u = new Date(
|
|
111
|
+
const u = new Date(i.modifiedAt).getTime(), a = new Date(r.modifiedAt).getTime();
|
|
112
112
|
return n === "asc" ? u - a : a - u;
|
|
113
113
|
} else if (t === "size") {
|
|
114
|
-
const u =
|
|
114
|
+
const u = i.size || 0, a = r.size || 0;
|
|
115
115
|
return n === "asc" ? u - a : a - u;
|
|
116
116
|
} else {
|
|
117
|
-
const u = n === "asc" ? 1 : -1, a = ((
|
|
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
118
|
return a.localeCompare(l) * u;
|
|
119
119
|
}
|
|
120
120
|
}), C = (e) => {
|
|
@@ -137,16 +137,19 @@ const B = (e) => {
|
|
|
137
137
|
};
|
|
138
138
|
switch (e) {
|
|
139
139
|
case "win32":
|
|
140
|
+
case "windows":
|
|
141
|
+
case "Windows":
|
|
140
142
|
return t.Windows;
|
|
141
143
|
case "darwin":
|
|
142
144
|
return t.MacOs;
|
|
143
145
|
case "linux":
|
|
146
|
+
case "Linux":
|
|
144
147
|
return t.Linux;
|
|
145
148
|
default:
|
|
146
149
|
const n = [];
|
|
147
|
-
return Object.keys(t).map((
|
|
148
|
-
t[
|
|
149
|
-
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 });
|
|
150
153
|
});
|
|
151
154
|
}), n;
|
|
152
155
|
}
|
|
@@ -159,8 +162,8 @@ export {
|
|
|
159
162
|
m as formatDateTime,
|
|
160
163
|
h as formatDuration,
|
|
161
164
|
w as formatNumberToK,
|
|
162
|
-
|
|
163
|
-
|
|
165
|
+
v as formatPermissions,
|
|
166
|
+
b as formatSeconds,
|
|
164
167
|
C as getAvailableCliApps,
|
|
165
168
|
S as getLogLevelName,
|
|
166
169
|
$ as getOSIcon,
|
|
@@ -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 return availableShells.Windows;\r\n case 'darwin':\r\n return availableShells.MacOs;\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 allShells.push({ label: OSType + ': ' + shell.label, value: shell.value });\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\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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"}
|
package/package.json
CHANGED
package/src/utils/helpers.ts
CHANGED
|
@@ -416,16 +416,21 @@ export const getAvailableCliApps = (platform?: string) => {
|
|
|
416
416
|
|
|
417
417
|
switch (platform) {
|
|
418
418
|
case 'win32':
|
|
419
|
+
case 'windows':
|
|
420
|
+
case 'Windows':
|
|
419
421
|
return availableShells.Windows;
|
|
420
422
|
case 'darwin':
|
|
421
423
|
return availableShells.MacOs;
|
|
422
424
|
case 'linux':
|
|
425
|
+
case 'Linux':
|
|
423
426
|
return availableShells.Linux;
|
|
424
427
|
default:
|
|
425
428
|
const allShells: { label: string; value: string }[] = [];
|
|
426
429
|
(Object.keys(availableShells) as typeofOSType[]).map((OSType) => {
|
|
427
430
|
availableShells[OSType].forEach((shell) => {
|
|
428
|
-
allShells.
|
|
431
|
+
if (allShells.findIndex((s) => s.value === shell.value) === -1) {
|
|
432
|
+
allShells.push({ label: `${shell.label} (${shell.value})`, value: shell.value });
|
|
433
|
+
}
|
|
429
434
|
});
|
|
430
435
|
});
|
|
431
436
|
return allShells;
|