@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;GAmCtE,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;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, r = window.innerWidth <= 768;
5
- return !!(t.test(e) || n && r);
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
- }, r = (t.getTime() - Date.now()) / 1e3;
16
- for (const s in n)
17
- if (n[s] < Math.abs(r)) {
18
- const i = r / n[s];
19
- return c.format(Math.round(i), s);
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), r = Math.floor(e % 60);
26
- return t >= 1 ? `${t} h ${n} min` : n >= 1 ? `${n} min` : `${r}s`;
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, r = 0;
39
- for (; n >= 1024 && r < t.length - 1; )
40
- n /= 1024, r++;
41
- return `${n.toFixed(2)} ${t[r]}`;
42
- }, w = (e) => e < 1e3 ? e.toString() : `${(e / 1e3).toFixed(1)}k`, b = (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`, p = (e, t = 10) => {
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), r = e.slice(-t);
45
- return `${n}...${r}`;
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), r = t.split(".").map(Number);
55
- for (let s = 0; s < 3; s++) {
56
- const i = n[s] || 0, o = r[s] || 0;
57
- if (i < o) return !0;
58
- if (i > o) return !1;
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 [r, s] = t.split("@");
87
- if (!r || r.length > 64 || !s || s.length > 253 || !s.includes("."))
86
+ const [i, r] = t.split("@");
87
+ if (!i || i.length > 64 || !r || r.length > 253 || !r.includes("."))
88
88
  return !1;
89
- const i = s.split("."), o = i[i.length - 1];
90
- return !(!o || o.length < 2 || r.startsWith(".") || r.endsWith(".") || r.includes("..") || s.startsWith(".") || s.endsWith(".") || s.includes(".."));
91
- }, P = (e, t, n) => !e.condition || e.condition.length === 0 ? !0 : e.condition.some((r) => Object.entries(r).every(([s, i]) => {
92
- const o = n.find((a) => a.value === s);
93
- return o ? (t[s] !== void 0 ? t[s] : o.default) === i : !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
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 r = n.path.split("/").filter(Boolean), s = "";
101
- for (let i = 0; i < r.length - 1; i++)
102
- s = s ? `${s}/${r[i]}` : `/${r[i]}`, t[s] !== void 0 && (t[s] += 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
103
  }
104
104
  }), t;
105
- }, y = (e, t, n) => [...e].sort((r, s) => {
106
- var i, o;
105
+ }, y = (e, t, n) => [...e].sort((i, r) => {
106
+ var s, o;
107
107
  if (t === "name") {
108
- const u = r.name.toLowerCase(), a = s.name.toLowerCase();
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(r.modifiedAt).getTime(), a = new Date(s.modifiedAt).getTime();
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 = r.size || 0, a = s.size || 0;
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 = ((i = r[t]) == null ? void 0 : i.toString()) || "", l = ((o = s[t]) == null ? void 0 : o.toString()) || "";
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((r) => {
148
- t[r].forEach((s) => {
149
- n.push({ label: r + ": " + s.label, value: s.value });
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
- b as formatPermissions,
163
- v as formatSeconds,
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":"AAGO,MAAMA,IAAW,MAAe;AAEpC,MAAI,OAAO,YAAc,OAAe,OAAO,SAAW;AACvD,WAAO;AAGV,QAAMC,IAAY,UAAU,aAAa,UAAU,UAAW,OAAe,SAAS,IAGhFC,IAAc,sFAGdC,IAAW,kBAAkB,UAAU,UAAU,iBAAiB,GAClEC,IAAc,OAAO,cAAc;AAQzC,SALI,GAAAF,EAAY,KAAKD,CAAS,KAK1BE,KAAYC;AAKnB,GAEMC,IAAY,IAAI,KAAK,mBAAmB,IAAI,GACrCC,IAAU,CAACC,MAAgB;AACrC,QAAMC,IAAOD,aAAiB,OAAOA,IAAQ,IAAI,KAAKA,CAAK,GACrDE,IAAkC;AAAA,IACrC,OAAO,OAAO,KAAK;AAAA,IACnB,QAAQ,OAAO,KAAK;AAAA,IACpB,OAAO,OAAO,KAAK;AAAA,IACnB,MAAM,OAAO;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,EAAA,GAENC,KAAkBF,EAAK,QAAA,IAAY,KAAK,SAAS;AACvD,aAAWG,KAAOF;AACf,QAAIA,EAAOE,CAAG,IAAI,KAAK,IAAID,CAAc,GAAG;AACzC,YAAME,IAAQF,IAAiBD,EAAOE,CAAG;AACzC,aAAON,EAAU,OAAO,KAAK,MAAMO,CAAK,GAAGD,CAAkC;AAAA,IAChF;AAEN,GAKaE,IAAiB,CAACC,MAA4B;AACxD,MAAI,CAACA,EAAS,QAAO;AAErB,MAAIA,IAAU;AACX,WAAO,GAAG,KAAK,MAAMA,IAAU,GAAI,CAAC;AAGvC,QAAMC,IAAQ,KAAK,MAAMD,IAAU,IAAI,GACjCE,IAAU,KAAK,MAAOF,IAAU,OAAQ,EAAE,GAC1CG,IAAmB,KAAK,MAAMH,IAAU,EAAE;AAEhD,SAAIC,KAAS,IACH,GAAGA,CAAK,MAAMC,CAAO,SAG3BA,KAAW,IACL,GAAGA,CAAO,SAGb,GAAGC,CAAgB;AAC7B,GAEaC,IAAiB,CAACC,MAAqC;AACjE,QAAMX,IAAO,IAAI,KAAKW,CAAO,GAEvBC,IAAsC;AAAA,IACzC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,EAAA;AAGX,SAAOZ,EAAK,eAAe,SAASY,CAAO;AAC9C,GAEaC,IAAc,CAACC,MAA0B;AACnD,QAAMC,IAAQ,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,IAAI;AAChD,MAAIC,IAAQF,KAAS,GACjBG,IAAY;AAEhB,SAAOD,KAAS,QAAQC,IAAYF,EAAM,SAAS;AAChD,IAAAC,KAAS,MACTC;AAGH,SAAO,GAAGD,EAAM,QAAQ,CAAC,CAAC,IAAID,EAAME,CAAS,CAAC;AACjD,GAEaC,IAAkB,CAACC,MACzBA,IAAM,MAAaA,EAAI,SAAA,IAEpB,IADOA,IAAM,KACJ,QAAQ,CAAC,CAAC,KAGhBC,IAAoB,CAACC,OACvBA,IAAO,KAAO,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG,GAGvCC,IAAgB,CAACH,MAEvBA,KAAO,QACD,GAAG,KAAK,MAAMA,IAAM,KAAK,CAAC,MAGhCA,KAAO,OACD,GAAG,KAAK,MAAMA,IAAM,IAAI,CAAC,MAG/BA,KAAO,KACD,GAAG,KAAK,MAAMA,IAAM,EAAE,CAAC,MAG1B,GAAG,KAAK,MAAMA,CAAG,CAAC,KAGfI,IAAW,CAACC,GAAcC,IAAc,OAAO;AACzD,MAAID,EAAK,UAAUC,IAAc,EAAG,QAAOD;AAE3C,QAAME,IAAQF,EAAK,MAAM,GAAGC,CAAW,GACjCE,IAAMH,EAAK,MAAM,CAACC,CAAW;AAEnC,SAAO,GAAGC,CAAK,MAAMC,CAAG;AAC3B,GAEaC,IAAY,CAACC,MAAe;AACtC,QAAMC,IAAWD,EAAG,YAAA;AACpB,SAAIC,EAAS,SAAS,SAAS,IACrB,YAENA,EAAS,SAAS,KAAK,IACjB,UAENA,EAAS,SAAS,QAAQ,IACpB,WAENA,EAAS,SAAS,QAAQ,IACpB,WAENA,EAAS,SAAS,QAAQ,IACpB,WAENA,EAAS,SAAS,MAAM,IAClB,SAENA,EAAS,SAAS,KAAK,IACjB,UAENA,EAAS,SAAS,QAAQ,IACpB,WAENA,EAAS,SAAS,MAAM,IAClB,SAENA,EAAS,SAAS,MAAM,IAClB,SAENA,EAAS,SAAS,OAAO,IACnB,UAENA,EAAS,SAAS,SAAS,IACrB,YAEH;AACV,GAEaC,IAAmB,CAACC,MAAkB;AAChD,QAAMF,IAAWE,EAAM,YAAA;AACvB,SAAIF,EAAS,SAAS,KAAK,IACjB,QAENA,EAAS,SAAS,OAAO,IACnB,UAGH;AACV,GAEaG,IAAkB,CAACC,GAAiBC,MAAmB;AACjE,MAAI,CAACD,KAAW,CAACC,EAAQ,QAAO;AAChC,QAAMC,IAAeF,EAAQ,MAAM,GAAG,EAAE,IAAI,MAAM,GAC5CG,IAAcF,EAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AAEhD,WAASG,IAAI,GAAGA,IAAI,GAAGA,KAAK;AACzB,UAAMC,IAAOH,EAAaE,CAAC,KAAK,GAC1BE,IAAOH,EAAYC,CAAC,KAAK;AAE/B,QAAIC,IAAOC,EAAM,QAAO;AACxB,QAAID,IAAOC,EAAM,QAAO;AAAA,EAC3B;AACA,SAAO;AACV,GAEaC,IAAkB,CAACC,GAAgBC,MAEzCA,MAAa,UACPD,EAAO,SAAS,QAAQ,KAAKA,EAAO,SAAS,gBAAgB,IAInEC,MAAa,UAEXD,EAAO,SAAS,QAAQ,KACxBA,EAAO,SAAS,YAAY,KAC5BA,EAAO,SAAS,QAAQ,KACxBA,EAAO,SAAS,QAAQ,KACxBA,EAAO,SAAS,eAAe,KAC/BA,EAAO,SAAS,QAAQ,KACxBA,EAAO,SAAS,eAAe,IAKjCC,MAAa,WACPD,EAAO,SAAS,QAAQ,IAG3B;AAGH,SAASE,EAAgBC,GAAuB;AACpD,UAAQA,GAAA;AAAA,IACL,KAAK;AACF,aAAO;AAAA,IACV,KAAK;AACF,aAAO;AAAA,IACV,KAAK;AACF,aAAO;AAAA,IACV,KAAK;AACF,aAAO;AAAA,IACV,KAAK;AACF,aAAO;AAAA,IACV,KAAK;AACF,aAAO;AAAA,IACV;AACG,aAAO;AAAA,EAAA;AAEhB;AAOO,MAAMC,IAAe,CAACC,MAA2B;AACrD,MAAI,CAACA,KAAS,OAAOA,KAAU;AAC5B,WAAO;AAGV,QAAMC,IAAeD,EAAM,KAAA;AAW3B,MARIC,EAAa,WAAW,KAAKA,EAAa,SAAS,OAQnD,CAFD,uIAEa,KAAKA,CAAY;AAC9B,WAAO;AAIV,QAAM,CAACC,GAAWC,CAAU,IAAIF,EAAa,MAAM,GAAG;AAatD,MAVI,CAACC,KAAaA,EAAU,SAAS,MAKjC,CAACC,KAAcA,EAAW,SAAS,OAKnC,CAACA,EAAW,SAAS,GAAG;AACzB,WAAO;AAIV,QAAMC,IAAcD,EAAW,MAAM,GAAG,GAClCE,IAAMD,EAAYA,EAAY,SAAS,CAAC;AAM9C,SALI,GAACC,KAAOA,EAAI,SAAS,KAMtBH,EAAU,WAAW,GAAG,KACxBA,EAAU,SAAS,GAAG,KACtBA,EAAU,SAAS,IAAI,KACvBC,EAAW,WAAW,GAAG,KACzBA,EAAW,SAAS,GAAG,KACvBA,EAAW,SAAS,IAAI;AAM9B,GAEaG,IAA4B,CAACC,GAA2BC,GAA+BC,MAE7F,CAACF,EAAM,aAAaA,EAAM,UAAU,WAAW,IACzC,KAIHA,EAAM,UAAU,KAAK,CAACG,MAEnB,OAAO,QAAQA,CAAS,EAAE,MAAM,CAAC,CAACC,GAASC,CAAS,MAAM;AAE9D,QAAMC,IAAcJ,EAAU,KAAK,CAACK,MAAMA,EAAE,UAAUH,CAAO;AAC7D,SAAKE,KAGgBL,EAASG,CAAO,MAAM,SAAYH,EAASG,CAAO,IAAIE,EAAY,aAG/DD,IANC;AAO5B,CAAC,CACH,GAISG,IAA0B,CAACC,MAA6D;AAClG,QAAMC,IAAuC,CAAA;AAG7C,SAAAD,EAAM,QAAQ,CAACE,MAAS;AACrB,IAAIA,EAAK,gBACND,EAASC,EAAK,IAAI,IAAI;AAAA,EAE5B,CAAC,GAGDF,EAAM,QAAQ,CAACE,MAAS;AACrB,QAAI,CAACA,EAAK,eAAeA,EAAK,MAAM;AAEjC,UAAIC,IAAYD,EAAK,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO,GAC/CE,IAAc;AAGlB,eAAS7B,IAAI,GAAGA,IAAI4B,EAAU,SAAS,GAAG5B;AACvC,QAAA6B,IAAcA,IAAc,GAAGA,CAAW,IAAID,EAAU5B,CAAC,CAAC,KAAK,IAAI4B,EAAU5B,CAAC,CAAC,IAC3E0B,EAASG,CAAW,MAAM,WAC3BH,EAASG,CAAW,KAAKF,EAAK;AAAA,IAGvC;AAAA,EACH,CAAC,GAEMD;AACV,GAEaI,IAAgB,CAACC,GAAmBC,GAA2BC,MAClE,CAAC,GAAGF,CAAK,EAAE,KAAK,CAACG,GAAGC,MAAM;AAnX7B,MAAAC,GAAAC;AAoXD,MAAIL,MAAc,QAAQ;AACvB,UAAMM,IAAQJ,EAAE,KAAK,YAAA,GACfK,IAAQJ,EAAE,KAAK,YAAA;AACrB,WAAOF,MAAkB,QAAQK,EAAM,cAAcC,CAAK,IAAIA,EAAM,cAAcD,CAAK;AAAA,EAC1F,WAAWN,MAAc,cAAc;AACpC,UAAMQ,IAAQ,IAAI,KAAKN,EAAE,UAAU,EAAE,QAAA,GAC/BO,IAAQ,IAAI,KAAKN,EAAE,UAAU,EAAE,QAAA;AACrC,WAAOF,MAAkB,QAAQO,IAAQC,IAAQA,IAAQD;AAAA,EAC5D,WAAWR,MAAc,QAAQ;AAC9B,UAAMU,IAAQR,EAAE,QAAQ,GAClBS,IAAQR,EAAE,QAAQ;AACxB,WAAOF,MAAkB,QAAQS,IAAQC,IAAQA,IAAQD;AAAA,EAC5D,OAAO;AACJ,UAAME,IAAaX,MAAkB,QAAQ,IAAI,IAC3CY,MAAST,IAAAF,EAAEF,CAAS,MAAX,gBAAAI,EAAc,eAAc,IACrCU,MAAST,IAAAF,EAAEH,CAAS,MAAX,gBAAAK,EAAc,eAAc;AAC3C,WAAOQ,EAAO,cAAcC,CAAM,IAAIF;AAAA,EACzC;AACH,CAAC,GAGSG,IAAsB,CAAC1C,MAAsB;AACvD,QAAM2C,IAAsE;AAAA,IACzE,SAAS;AAAA,MACN,EAAE,OAAO,cAAc,OAAO,aAAA;AAAA,MAC9B,EAAE,OAAO,wBAAwB,OAAO,MAAA;AAAA,MACxC,EAAE,OAAO,QAAQ,OAAO,OAAA;AAAA,IAAO;AAAA,IAElC,OAAO;AAAA,MACJ,EAAE,OAAO,OAAO,OAAO,MAAA;AAAA,MACvB,EAAE,OAAO,QAAQ,OAAO,YAAA;AAAA,MACxB,EAAE,OAAO,MAAM,OAAO,UAAA;AAAA,IAAU;AAAA,IAEnC,OAAO;AAAA,MACJ,EAAE,OAAO,QAAQ,OAAO,YAAA;AAAA,MACxB,EAAE,OAAO,MAAM,OAAO,UAAA;AAAA,MACtB,EAAE,OAAO,OAAO,OAAO,MAAA;AAAA,IAAM;AAAA,EAChC;AAIH,UAAQ3C,GAAA;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACF,aAAO2C,EAAgB;AAAA,IAC1B,KAAK;AACF,aAAOA,EAAgB;AAAA,IAC1B,KAAK;AAAA,IACL,KAAK;AACF,aAAOA,EAAgB;AAAA,IAC1B;AACG,YAAMC,IAAgD,CAAA;AACrD,oBAAO,KAAKD,CAAe,EAAqB,IAAI,CAACE,MAAW;AAC9D,QAAAF,EAAgBE,CAAM,EAAE,QAAQ,CAACC,MAAU;AACxC,UAAIF,EAAU,UAAU,CAAC,MAAM,EAAE,UAAUE,EAAM,KAAK,MAAM,MACzDF,EAAU,KAAK,EAAE,OAAO,GAAGE,EAAM,KAAK,KAAKA,EAAM,KAAK,KAAK,OAAOA,EAAM,OAAO;AAAA,QAErF,CAAC;AAAA,MACJ,CAAC,GACMF;AAAA,EAAA;AAEhB,GAEaG,IAAmB,CAACpF,MAC1BA,MAAY,IACN,KAEHA,IAAU,KAAK,GAAG,KAAK,MAAMA,IAAU,EAAE,CAAC,SAAS,GAAGA,CAAO;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@plutonhq/core-frontend",
3
3
  "description": "Pluton Core Frontend Library",
4
- "version": "0.1.7",
4
+ "version": "0.1.8",
5
5
  "author": "Plutonhq",
6
6
  "license": "Apache-2.0",
7
7
  "publishConfig": {
@@ -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.push({ label: OSType + ': ' + shell.label, value: shell.value });
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;