mogh_ui 1.2.9 → 1.2.11
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.
- package/dist/components/entity-header.cjs +17 -2
- package/dist/components/entity-header.cjs.map +1 -1
- package/dist/components/entity-header.d.ts.map +1 -1
- package/dist/components/entity-header.js +17 -2
- package/dist/components/entity-header.js.map +1 -1
- package/dist/formatting.cjs +12 -0
- package/dist/formatting.cjs.map +1 -1
- package/dist/formatting.d.ts +3 -0
- package/dist/formatting.d.ts.map +1 -1
- package/dist/formatting.js +11 -0
- package/dist/formatting.js.map +1 -1
- package/package.json +1 -1
|
@@ -120,8 +120,23 @@ function EntityHeader({
|
|
|
120
120
|
}
|
|
121
121
|
),
|
|
122
122
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.Group, { fz: "md", tt: "uppercase", mt: "-8", gap: "sm", children: [
|
|
123
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
124
|
-
|
|
123
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
124
|
+
import_core.Text,
|
|
125
|
+
{
|
|
126
|
+
component: typeof state === "string" ? void 0 : "div",
|
|
127
|
+
c: color,
|
|
128
|
+
fw: "600",
|
|
129
|
+
children: state
|
|
130
|
+
}
|
|
131
|
+
),
|
|
132
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
133
|
+
import_core.Text,
|
|
134
|
+
{
|
|
135
|
+
component: typeof status === "string" ? void 0 : "div",
|
|
136
|
+
c: "dimmed",
|
|
137
|
+
children: status
|
|
138
|
+
}
|
|
139
|
+
)
|
|
125
140
|
] })
|
|
126
141
|
] })
|
|
127
142
|
] }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/entity-header.tsx"],"sourcesContent":["import { ActionIcon, Group, Stack, Text, TextInput } from \"@mantine/core\";\nimport { FC, ReactNode, useEffect, useState } from \"react\";\nimport { Edit, Save, X } from \"lucide-react\";\nimport { ColorIntention, hexColorByIntention } from \"../color\";\n\nexport interface EntityHeaderProps {\n name?: string;\n icon: FC<{ size?: string | number; color?: string }>;\n intent: ColorIntention;\n state?: ReactNode;\n status?: ReactNode;\n action?: ReactNode;\n onRename?: (name: string) => Promise<unknown>;\n renamePending?: boolean;\n}\n\nexport function EntityHeader({\n name,\n icon: Icon,\n intent,\n state,\n status,\n action,\n onRename: _onRename,\n renamePending,\n}: EntityHeaderProps) {\n const [editingName, setEditingName] = useState(false);\n const [newName, setNewName] = useState(name);\n useEffect(() => {\n setNewName(name);\n }, [name]);\n const color = hexColorByIntention(intent);\n const background = color ? color + \"25\" : undefined;\n const onRename =\n _onRename &&\n (() => {\n if (!newName) return;\n if (name === newName) {\n setEditingName(false);\n } else {\n _onRename(newName).then(() => setEditingName(false));\n }\n });\n return (\n <Group\n justify=\"space-between\"\n gap=\"lg\"\n px=\"xl\"\n py=\"md\"\n style={{\n background,\n borderTopLeftRadius: \"var(--mantine-radius-md)\",\n borderTopRightRadius: \"var(--mantine-radius-md)\",\n }}\n >\n <Group gap=\"lg\">\n <Icon size=\"2rem\" color={color} />\n <Stack gap=\"0\">\n {name && !onRename && (\n <Text fz=\"h1\" fw=\"bolder\">\n {name}\n </Text>\n )}\n {onRename && (\n <Group\n mb={editingName ? \"xs\" : undefined}\n gap=\"xs\"\n onClick={editingName ? undefined : () => setEditingName(true)}\n style={{ cursor: editingName ? undefined : \"pointer\" }}\n >\n {!editingName && (\n <>\n <Text fz=\"h1\" fw=\"bolder\">\n {name}\n </Text>\n <ActionIcon title=\"Rename\">\n <Edit size=\"1rem\" />\n </ActionIcon>\n </>\n )}\n {editingName && (\n <>\n <TextInput\n placeholder=\"Enter name\"\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && onRename()}\n disabled={renamePending}\n size=\"lg\"\n autoFocus\n />\n <ActionIcon\n variant=\"filled\"\n color=\"blue\"\n onClick={onRename}\n loading={renamePending}\n >\n <Save size=\"1rem\" />\n </ActionIcon>\n <ActionIcon\n variant=\"filled\"\n color=\"red\"\n onClick={() => {\n setNewName(name);\n setEditingName(false);\n }}\n >\n <X size=\"1rem\" />\n </ActionIcon>\n </>\n )}\n </Group>\n )}\n <Group fz=\"md\" tt=\"uppercase\" mt=\"-8\" gap=\"sm\">\n <Text c={color}
|
|
1
|
+
{"version":3,"sources":["../../src/components/entity-header.tsx"],"sourcesContent":["import { ActionIcon, Group, Stack, Text, TextInput } from \"@mantine/core\";\nimport { FC, ReactNode, useEffect, useState } from \"react\";\nimport { Edit, Save, X } from \"lucide-react\";\nimport { ColorIntention, hexColorByIntention } from \"../color\";\n\nexport interface EntityHeaderProps {\n name?: string;\n icon: FC<{ size?: string | number; color?: string }>;\n intent: ColorIntention;\n state?: ReactNode;\n status?: ReactNode;\n action?: ReactNode;\n onRename?: (name: string) => Promise<unknown>;\n renamePending?: boolean;\n}\n\nexport function EntityHeader({\n name,\n icon: Icon,\n intent,\n state,\n status,\n action,\n onRename: _onRename,\n renamePending,\n}: EntityHeaderProps) {\n const [editingName, setEditingName] = useState(false);\n const [newName, setNewName] = useState(name);\n useEffect(() => {\n setNewName(name);\n }, [name]);\n const color = hexColorByIntention(intent);\n const background = color ? color + \"25\" : undefined;\n const onRename =\n _onRename &&\n (() => {\n if (!newName) return;\n if (name === newName) {\n setEditingName(false);\n } else {\n _onRename(newName).then(() => setEditingName(false));\n }\n });\n return (\n <Group\n justify=\"space-between\"\n gap=\"lg\"\n px=\"xl\"\n py=\"md\"\n style={{\n background,\n borderTopLeftRadius: \"var(--mantine-radius-md)\",\n borderTopRightRadius: \"var(--mantine-radius-md)\",\n }}\n >\n <Group gap=\"lg\">\n <Icon size=\"2rem\" color={color} />\n <Stack gap=\"0\">\n {name && !onRename && (\n <Text fz=\"h1\" fw=\"bolder\">\n {name}\n </Text>\n )}\n {onRename && (\n <Group\n mb={editingName ? \"xs\" : undefined}\n gap=\"xs\"\n onClick={editingName ? undefined : () => setEditingName(true)}\n style={{ cursor: editingName ? undefined : \"pointer\" }}\n >\n {!editingName && (\n <>\n <Text fz=\"h1\" fw=\"bolder\">\n {name}\n </Text>\n <ActionIcon title=\"Rename\">\n <Edit size=\"1rem\" />\n </ActionIcon>\n </>\n )}\n {editingName && (\n <>\n <TextInput\n placeholder=\"Enter name\"\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && onRename()}\n disabled={renamePending}\n size=\"lg\"\n autoFocus\n />\n <ActionIcon\n variant=\"filled\"\n color=\"blue\"\n onClick={onRename}\n loading={renamePending}\n >\n <Save size=\"1rem\" />\n </ActionIcon>\n <ActionIcon\n variant=\"filled\"\n color=\"red\"\n onClick={() => {\n setNewName(name);\n setEditingName(false);\n }}\n >\n <X size=\"1rem\" />\n </ActionIcon>\n </>\n )}\n </Group>\n )}\n <Group fz=\"md\" tt=\"uppercase\" mt=\"-8\" gap=\"sm\">\n <Text\n component={typeof state === \"string\" ? undefined : \"div\"}\n c={color}\n fw=\"600\"\n >\n {state}\n </Text>\n <Text\n component={typeof status === \"string\" ? undefined : \"div\"}\n c=\"dimmed\"\n >\n {status}\n </Text>\n </Group>\n </Stack>\n </Group>\n {action}\n </Group>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-header.d.ts","sourceRoot":"","sources":["../../src/components/entity-header.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,SAAS,EAAuB,MAAM,OAAO,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAuB,MAAM,UAAU,CAAC;AAE/D,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,EAAE,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,IAAI,EAAE,IAAI,EACV,MAAM,EACN,KAAK,EACL,MAAM,EACN,MAAM,EACN,QAAQ,EAAE,SAAS,EACnB,aAAa,GACd,EAAE,iBAAiB,+
|
|
1
|
+
{"version":3,"file":"entity-header.d.ts","sourceRoot":"","sources":["../../src/components/entity-header.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,SAAS,EAAuB,MAAM,OAAO,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAuB,MAAM,UAAU,CAAC;AAE/D,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,EAAE,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,IAAI,EAAE,IAAI,EACV,MAAM,EACN,KAAK,EACL,MAAM,EACN,MAAM,EACN,QAAQ,EAAE,SAAS,EACnB,aAAa,GACd,EAAE,iBAAiB,+BA4GnB"}
|
|
@@ -97,8 +97,23 @@ function EntityHeader({
|
|
|
97
97
|
}
|
|
98
98
|
),
|
|
99
99
|
/* @__PURE__ */ jsxs(Group, { fz: "md", tt: "uppercase", mt: "-8", gap: "sm", children: [
|
|
100
|
-
/* @__PURE__ */ jsx(
|
|
101
|
-
|
|
100
|
+
/* @__PURE__ */ jsx(
|
|
101
|
+
Text,
|
|
102
|
+
{
|
|
103
|
+
component: typeof state === "string" ? void 0 : "div",
|
|
104
|
+
c: color,
|
|
105
|
+
fw: "600",
|
|
106
|
+
children: state
|
|
107
|
+
}
|
|
108
|
+
),
|
|
109
|
+
/* @__PURE__ */ jsx(
|
|
110
|
+
Text,
|
|
111
|
+
{
|
|
112
|
+
component: typeof status === "string" ? void 0 : "div",
|
|
113
|
+
c: "dimmed",
|
|
114
|
+
children: status
|
|
115
|
+
}
|
|
116
|
+
)
|
|
102
117
|
] })
|
|
103
118
|
] })
|
|
104
119
|
] }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/entity-header.tsx"],"sourcesContent":["import { ActionIcon, Group, Stack, Text, TextInput } from \"@mantine/core\";\nimport { FC, ReactNode, useEffect, useState } from \"react\";\nimport { Edit, Save, X } from \"lucide-react\";\nimport { ColorIntention, hexColorByIntention } from \"../color\";\n\nexport interface EntityHeaderProps {\n name?: string;\n icon: FC<{ size?: string | number; color?: string }>;\n intent: ColorIntention;\n state?: ReactNode;\n status?: ReactNode;\n action?: ReactNode;\n onRename?: (name: string) => Promise<unknown>;\n renamePending?: boolean;\n}\n\nexport function EntityHeader({\n name,\n icon: Icon,\n intent,\n state,\n status,\n action,\n onRename: _onRename,\n renamePending,\n}: EntityHeaderProps) {\n const [editingName, setEditingName] = useState(false);\n const [newName, setNewName] = useState(name);\n useEffect(() => {\n setNewName(name);\n }, [name]);\n const color = hexColorByIntention(intent);\n const background = color ? color + \"25\" : undefined;\n const onRename =\n _onRename &&\n (() => {\n if (!newName) return;\n if (name === newName) {\n setEditingName(false);\n } else {\n _onRename(newName).then(() => setEditingName(false));\n }\n });\n return (\n <Group\n justify=\"space-between\"\n gap=\"lg\"\n px=\"xl\"\n py=\"md\"\n style={{\n background,\n borderTopLeftRadius: \"var(--mantine-radius-md)\",\n borderTopRightRadius: \"var(--mantine-radius-md)\",\n }}\n >\n <Group gap=\"lg\">\n <Icon size=\"2rem\" color={color} />\n <Stack gap=\"0\">\n {name && !onRename && (\n <Text fz=\"h1\" fw=\"bolder\">\n {name}\n </Text>\n )}\n {onRename && (\n <Group\n mb={editingName ? \"xs\" : undefined}\n gap=\"xs\"\n onClick={editingName ? undefined : () => setEditingName(true)}\n style={{ cursor: editingName ? undefined : \"pointer\" }}\n >\n {!editingName && (\n <>\n <Text fz=\"h1\" fw=\"bolder\">\n {name}\n </Text>\n <ActionIcon title=\"Rename\">\n <Edit size=\"1rem\" />\n </ActionIcon>\n </>\n )}\n {editingName && (\n <>\n <TextInput\n placeholder=\"Enter name\"\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && onRename()}\n disabled={renamePending}\n size=\"lg\"\n autoFocus\n />\n <ActionIcon\n variant=\"filled\"\n color=\"blue\"\n onClick={onRename}\n loading={renamePending}\n >\n <Save size=\"1rem\" />\n </ActionIcon>\n <ActionIcon\n variant=\"filled\"\n color=\"red\"\n onClick={() => {\n setNewName(name);\n setEditingName(false);\n }}\n >\n <X size=\"1rem\" />\n </ActionIcon>\n </>\n )}\n </Group>\n )}\n <Group fz=\"md\" tt=\"uppercase\" mt=\"-8\" gap=\"sm\">\n <Text c={color}
|
|
1
|
+
{"version":3,"sources":["../../src/components/entity-header.tsx"],"sourcesContent":["import { ActionIcon, Group, Stack, Text, TextInput } from \"@mantine/core\";\nimport { FC, ReactNode, useEffect, useState } from \"react\";\nimport { Edit, Save, X } from \"lucide-react\";\nimport { ColorIntention, hexColorByIntention } from \"../color\";\n\nexport interface EntityHeaderProps {\n name?: string;\n icon: FC<{ size?: string | number; color?: string }>;\n intent: ColorIntention;\n state?: ReactNode;\n status?: ReactNode;\n action?: ReactNode;\n onRename?: (name: string) => Promise<unknown>;\n renamePending?: boolean;\n}\n\nexport function EntityHeader({\n name,\n icon: Icon,\n intent,\n state,\n status,\n action,\n onRename: _onRename,\n renamePending,\n}: EntityHeaderProps) {\n const [editingName, setEditingName] = useState(false);\n const [newName, setNewName] = useState(name);\n useEffect(() => {\n setNewName(name);\n }, [name]);\n const color = hexColorByIntention(intent);\n const background = color ? color + \"25\" : undefined;\n const onRename =\n _onRename &&\n (() => {\n if (!newName) return;\n if (name === newName) {\n setEditingName(false);\n } else {\n _onRename(newName).then(() => setEditingName(false));\n }\n });\n return (\n <Group\n justify=\"space-between\"\n gap=\"lg\"\n px=\"xl\"\n py=\"md\"\n style={{\n background,\n borderTopLeftRadius: \"var(--mantine-radius-md)\",\n borderTopRightRadius: \"var(--mantine-radius-md)\",\n }}\n >\n <Group gap=\"lg\">\n <Icon size=\"2rem\" color={color} />\n <Stack gap=\"0\">\n {name && !onRename && (\n <Text fz=\"h1\" fw=\"bolder\">\n {name}\n </Text>\n )}\n {onRename && (\n <Group\n mb={editingName ? \"xs\" : undefined}\n gap=\"xs\"\n onClick={editingName ? undefined : () => setEditingName(true)}\n style={{ cursor: editingName ? undefined : \"pointer\" }}\n >\n {!editingName && (\n <>\n <Text fz=\"h1\" fw=\"bolder\">\n {name}\n </Text>\n <ActionIcon title=\"Rename\">\n <Edit size=\"1rem\" />\n </ActionIcon>\n </>\n )}\n {editingName && (\n <>\n <TextInput\n placeholder=\"Enter name\"\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && onRename()}\n disabled={renamePending}\n size=\"lg\"\n autoFocus\n />\n <ActionIcon\n variant=\"filled\"\n color=\"blue\"\n onClick={onRename}\n loading={renamePending}\n >\n <Save size=\"1rem\" />\n </ActionIcon>\n <ActionIcon\n variant=\"filled\"\n color=\"red\"\n onClick={() => {\n setNewName(name);\n setEditingName(false);\n }}\n >\n <X size=\"1rem\" />\n </ActionIcon>\n </>\n )}\n </Group>\n )}\n <Group fz=\"md\" tt=\"uppercase\" mt=\"-8\" gap=\"sm\">\n <Text\n component={typeof state === \"string\" ? undefined : \"div\"}\n c={color}\n fw=\"600\"\n >\n {state}\n </Text>\n <Text\n component={typeof status === \"string\" ? undefined : \"div\"}\n c=\"dimmed\"\n >\n {status}\n </Text>\n </Group>\n </Stack>\n </Group>\n {action}\n </Group>\n );\n}\n"],"mappings":"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","names":[]}
|
package/dist/formatting.cjs
CHANGED
|
@@ -28,6 +28,7 @@ __export(formatting_exports, {
|
|
|
28
28
|
fmtRateBytes: () => fmtRateBytes,
|
|
29
29
|
fmtSizeBytes: () => fmtSizeBytes,
|
|
30
30
|
fmtSnakeCaseToUpperSpaceCase: () => fmtSnakeCaseToUpperSpaceCase,
|
|
31
|
+
fmtTimeUntil: () => fmtTimeUntil,
|
|
31
32
|
fmtUpperCamelcase: () => fmtUpperCamelcase,
|
|
32
33
|
fmtUtcDate: () => fmtUtcDate
|
|
33
34
|
});
|
|
@@ -82,6 +83,16 @@ function fmtDuration(startTs, endTs) {
|
|
|
82
83
|
const remaining_seconds = seconds % 60;
|
|
83
84
|
return `${minutes > 0 ? `${minutes} minute${minutes > 1 ? "s" : ""} ` : ""}${remaining_seconds.toFixed(minutes > 0 ? 0 : 1)} seconds`;
|
|
84
85
|
}
|
|
86
|
+
const MINUTE_MS = 6e4;
|
|
87
|
+
const HOUR_MS = 60 * MINUTE_MS;
|
|
88
|
+
const DAY_MS = 24 * HOUR_MS;
|
|
89
|
+
function fmtTimeUntil(ms) {
|
|
90
|
+
const plural = (count, unit) => `${count} ${unit}${count === 1 ? "" : "s"}`;
|
|
91
|
+
if (ms >= DAY_MS) return plural(Math.floor(ms / DAY_MS), "day");
|
|
92
|
+
if (ms >= HOUR_MS) return plural(Math.floor(ms / HOUR_MS), "hour");
|
|
93
|
+
if (ms >= MINUTE_MS) return plural(Math.floor(ms / MINUTE_MS), "minute");
|
|
94
|
+
return "< 1 minute";
|
|
95
|
+
}
|
|
85
96
|
function fmtUpperCamelcase(input) {
|
|
86
97
|
return input.match(/[A-Z][a-z]+|[0-9]+/g)?.join(" ") ?? input;
|
|
87
98
|
}
|
|
@@ -118,6 +129,7 @@ function fmtRateBytes(bytes) {
|
|
|
118
129
|
fmtRateBytes,
|
|
119
130
|
fmtSizeBytes,
|
|
120
131
|
fmtSnakeCaseToUpperSpaceCase,
|
|
132
|
+
fmtTimeUntil,
|
|
121
133
|
fmtUpperCamelcase,
|
|
122
134
|
fmtUtcDate
|
|
123
135
|
});
|
package/dist/formatting.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/formatting.ts"],"sourcesContent":["export function fmtDate(d: Date) {\n const hours = d.getHours();\n const minutes = d.getMinutes();\n return `${fmtMonth(d.getMonth())} ${d.getDate()} ${\n hours > 9 ? hours : \"0\" + hours\n }:${minutes > 9 ? minutes : \"0\" + minutes}`;\n}\n\nexport function fmtUtcDate(d: Date) {\n const hours = d.getUTCHours();\n const minutes = d.getUTCMinutes();\n return `${fmtMonth(d.getUTCMonth())} ${d.getUTCDate()} ${\n hours > 9 ? hours : \"0\" + hours\n }:${minutes > 9 ? minutes : \"0\" + minutes}`;\n}\n\nexport function fmtMonth(month: number) {\n switch (month) {\n case 0:\n return \"Jan\";\n case 1:\n return \"Feb\";\n case 2:\n return \"Mar\";\n case 3:\n return \"Apr\";\n case 4:\n return \"May\";\n case 5:\n return \"Jun\";\n case 6:\n return \"Jul\";\n case 7:\n return \"Aug\";\n case 8:\n return \"Sep\";\n case 9:\n return \"Oct\";\n case 10:\n return \"Nov\";\n case 11:\n return \"Dec\";\n }\n}\n\nexport const fmtDateWithMinutes = (d: Date) => {\n // return `${d.toLocaleDateString()} ${d.toLocaleTimeString()}`;\n return d.toLocaleString();\n};\n\nexport function fmtDuration(startTs: number, endTs: number) {\n const start = new Date(startTs);\n const end = new Date(endTs);\n const durr = end.getTime() - start.getTime();\n const seconds = durr / 1000;\n const minutes = Math.floor(seconds / 60);\n const remaining_seconds = seconds % 60;\n return `${\n minutes > 0 ? `${minutes} minute${minutes > 1 ? \"s\" : \"\"} ` : \"\"\n }${remaining_seconds.toFixed(minutes > 0 ? 0 : 1)} seconds`;\n}\n\nexport function fmtUpperCamelcase(input: string) {\n return input.match(/[A-Z][a-z]+|[0-9]+/g)?.join(\" \") ?? input;\n}\n\n/// list_all_items => List All Items\nexport function fmtSnakeCaseToUpperSpaceCase(snake: string) {\n if (snake.length === 0) return \"\";\n return snake\n .split(\"_\")\n .map((item) => item[0].toUpperCase() + item.slice(1))\n .join(\" \");\n}\n\nexport const BYTES_PER_KB = 1024;\nexport const BYTES_PER_MB = 1024 * BYTES_PER_KB;\nexport const BYTES_PER_GB = 1024 * BYTES_PER_MB;\n\nexport function fmtSizeBytes(bytes: number) {\n if (bytes >= BYTES_PER_GB) {\n return (bytes / BYTES_PER_GB).toFixed(1) + \" GiB\";\n } else if (bytes >= BYTES_PER_MB) {\n return (bytes / BYTES_PER_MB).toFixed(1) + \" MiB\";\n } else if (bytes >= BYTES_PER_KB) {\n return (bytes / BYTES_PER_KB).toFixed(1) + \" KiB\";\n } else {\n return bytes.toString() + \" bytes\";\n }\n}\n\nexport function fmtRateBytes(bytes: number) {\n return fmtSizeBytes(bytes) + \"/s\";\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,SAAS,QAAQ,GAAS;AAC/B,QAAM,QAAQ,EAAE,SAAS;AACzB,QAAM,UAAU,EAAE,WAAW;AAC7B,SAAO,GAAG,SAAS,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,IAC7C,QAAQ,IAAI,QAAQ,MAAM,KAC5B,IAAI,UAAU,IAAI,UAAU,MAAM,OAAO;AAC3C;AAEO,SAAS,WAAW,GAAS;AAClC,QAAM,QAAQ,EAAE,YAAY;AAC5B,QAAM,UAAU,EAAE,cAAc;AAChC,SAAO,GAAG,SAAS,EAAE,YAAY,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,IACnD,QAAQ,IAAI,QAAQ,MAAM,KAC5B,IAAI,UAAU,IAAI,UAAU,MAAM,OAAO;AAC3C;AAEO,SAAS,SAAS,OAAe;AACtC,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEO,MAAM,qBAAqB,CAAC,MAAY;AAE7C,SAAO,EAAE,eAAe;AAC1B;AAEO,SAAS,YAAY,SAAiB,OAAe;AAC1D,QAAM,QAAQ,IAAI,KAAK,OAAO;AAC9B,QAAM,MAAM,IAAI,KAAK,KAAK;AAC1B,QAAM,OAAO,IAAI,QAAQ,IAAI,MAAM,QAAQ;AAC3C,QAAM,UAAU,OAAO;AACvB,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,QAAM,oBAAoB,UAAU;AACpC,SAAO,GACL,UAAU,IAAI,GAAG,OAAO,UAAU,UAAU,IAAI,MAAM,EAAE,MAAM,EAChE,GAAG,kBAAkB,QAAQ,UAAU,IAAI,IAAI,CAAC,CAAC;AACnD;AAEO,SAAS,kBAAkB,OAAe;AAC/C,SAAO,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,KAAK;AAC1D;AAGO,SAAS,6BAA6B,OAAe;AAC1D,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EACnD,KAAK,GAAG;AACb;AAEO,MAAM,eAAe;AACrB,MAAM,eAAe,OAAO;AAC5B,MAAM,eAAe,OAAO;AAE5B,SAAS,aAAa,OAAe;AAC1C,MAAI,SAAS,cAAc;AACzB,YAAQ,QAAQ,cAAc,QAAQ,CAAC,IAAI;AAAA,EAC7C,WAAW,SAAS,cAAc;AAChC,YAAQ,QAAQ,cAAc,QAAQ,CAAC,IAAI;AAAA,EAC7C,WAAW,SAAS,cAAc;AAChC,YAAQ,QAAQ,cAAc,QAAQ,CAAC,IAAI;AAAA,EAC7C,OAAO;AACL,WAAO,MAAM,SAAS,IAAI;AAAA,EAC5B;AACF;AAEO,SAAS,aAAa,OAAe;AAC1C,SAAO,aAAa,KAAK,IAAI;AAC/B;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/formatting.ts"],"sourcesContent":["export function fmtDate(d: Date) {\n const hours = d.getHours();\n const minutes = d.getMinutes();\n return `${fmtMonth(d.getMonth())} ${d.getDate()} ${\n hours > 9 ? hours : \"0\" + hours\n }:${minutes > 9 ? minutes : \"0\" + minutes}`;\n}\n\nexport function fmtUtcDate(d: Date) {\n const hours = d.getUTCHours();\n const minutes = d.getUTCMinutes();\n return `${fmtMonth(d.getUTCMonth())} ${d.getUTCDate()} ${\n hours > 9 ? hours : \"0\" + hours\n }:${minutes > 9 ? minutes : \"0\" + minutes}`;\n}\n\nexport function fmtMonth(month: number) {\n switch (month) {\n case 0:\n return \"Jan\";\n case 1:\n return \"Feb\";\n case 2:\n return \"Mar\";\n case 3:\n return \"Apr\";\n case 4:\n return \"May\";\n case 5:\n return \"Jun\";\n case 6:\n return \"Jul\";\n case 7:\n return \"Aug\";\n case 8:\n return \"Sep\";\n case 9:\n return \"Oct\";\n case 10:\n return \"Nov\";\n case 11:\n return \"Dec\";\n }\n}\n\nexport const fmtDateWithMinutes = (d: Date) => {\n // return `${d.toLocaleDateString()} ${d.toLocaleTimeString()}`;\n return d.toLocaleString();\n};\n\nexport function fmtDuration(startTs: number, endTs: number) {\n const start = new Date(startTs);\n const end = new Date(endTs);\n const durr = end.getTime() - start.getTime();\n const seconds = durr / 1000;\n const minutes = Math.floor(seconds / 60);\n const remaining_seconds = seconds % 60;\n return `${\n minutes > 0 ? `${minutes} minute${minutes > 1 ? \"s\" : \"\"} ` : \"\"\n }${remaining_seconds.toFixed(minutes > 0 ? 0 : 1)} seconds`;\n}\n\nconst MINUTE_MS = 60_000;\nconst HOUR_MS = 60 * MINUTE_MS;\nconst DAY_MS = 24 * HOUR_MS;\n\n/** Coarse \"time until\" of a future timestamp: days, falling back to\n * hours / minutes once under a day. */\nexport function fmtTimeUntil(ms: number) {\n const plural = (count: number, unit: string) =>\n `${count} ${unit}${count === 1 ? \"\" : \"s\"}`;\n if (ms >= DAY_MS) return plural(Math.floor(ms / DAY_MS), \"day\");\n if (ms >= HOUR_MS) return plural(Math.floor(ms / HOUR_MS), \"hour\");\n if (ms >= MINUTE_MS) return plural(Math.floor(ms / MINUTE_MS), \"minute\");\n return \"< 1 minute\";\n}\n\nexport function fmtUpperCamelcase(input: string) {\n return input.match(/[A-Z][a-z]+|[0-9]+/g)?.join(\" \") ?? input;\n}\n\n/// list_all_items => List All Items\nexport function fmtSnakeCaseToUpperSpaceCase(snake: string) {\n if (snake.length === 0) return \"\";\n return snake\n .split(\"_\")\n .map((item) => item[0].toUpperCase() + item.slice(1))\n .join(\" \");\n}\n\nexport const BYTES_PER_KB = 1024;\nexport const BYTES_PER_MB = 1024 * BYTES_PER_KB;\nexport const BYTES_PER_GB = 1024 * BYTES_PER_MB;\n\nexport function fmtSizeBytes(bytes: number) {\n if (bytes >= BYTES_PER_GB) {\n return (bytes / BYTES_PER_GB).toFixed(1) + \" GiB\";\n } else if (bytes >= BYTES_PER_MB) {\n return (bytes / BYTES_PER_MB).toFixed(1) + \" MiB\";\n } else if (bytes >= BYTES_PER_KB) {\n return (bytes / BYTES_PER_KB).toFixed(1) + \" KiB\";\n } else {\n return bytes.toString() + \" bytes\";\n }\n}\n\nexport function fmtRateBytes(bytes: number) {\n return fmtSizeBytes(bytes) + \"/s\";\n}\n"],"mappings":"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","names":[]}
|
package/dist/formatting.d.ts
CHANGED
|
@@ -3,6 +3,9 @@ export declare function fmtUtcDate(d: Date): string;
|
|
|
3
3
|
export declare function fmtMonth(month: number): "Apr" | "Aug" | "Dec" | "Feb" | "Jan" | "Jul" | "Jun" | "Mar" | "May" | "Nov" | "Oct" | "Sep" | undefined;
|
|
4
4
|
export declare const fmtDateWithMinutes: (d: Date) => string;
|
|
5
5
|
export declare function fmtDuration(startTs: number, endTs: number): string;
|
|
6
|
+
/** Coarse "time until" of a future timestamp: days, falling back to
|
|
7
|
+
* hours / minutes once under a day. */
|
|
8
|
+
export declare function fmtTimeUntil(ms: number): string;
|
|
6
9
|
export declare function fmtUpperCamelcase(input: string): string;
|
|
7
10
|
export declare function fmtSnakeCaseToUpperSpaceCase(snake: string): string;
|
|
8
11
|
export declare const BYTES_PER_KB = 1024;
|
package/dist/formatting.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../src/formatting.ts"],"names":[],"mappings":"AAAA,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,UAM9B;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,UAMjC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,6GA2BrC;AAED,eAAO,MAAM,kBAAkB,MAAO,IAAI,WAGzC,CAAC;AAEF,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAUzD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,UAE9C;AAGD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,UAMzD;AAED,eAAO,MAAM,YAAY,OAAO,CAAC;AACjC,eAAO,MAAM,YAAY,QAAsB,CAAC;AAChD,eAAO,MAAM,YAAY,QAAsB,CAAC;AAEhD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,UAUzC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,UAEzC"}
|
|
1
|
+
{"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../src/formatting.ts"],"names":[],"mappings":"AAAA,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,UAM9B;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,UAMjC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,6GA2BrC;AAED,eAAO,MAAM,kBAAkB,MAAO,IAAI,WAGzC,CAAC;AAEF,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAUzD;AAMD;uCACuC;AACvC,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,UAOtC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,UAE9C;AAGD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,UAMzD;AAED,eAAO,MAAM,YAAY,OAAO,CAAC;AACjC,eAAO,MAAM,YAAY,QAAsB,CAAC;AAChD,eAAO,MAAM,YAAY,QAAsB,CAAC;AAEhD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,UAUzC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,UAEzC"}
|
package/dist/formatting.js
CHANGED
|
@@ -48,6 +48,16 @@ function fmtDuration(startTs, endTs) {
|
|
|
48
48
|
const remaining_seconds = seconds % 60;
|
|
49
49
|
return `${minutes > 0 ? `${minutes} minute${minutes > 1 ? "s" : ""} ` : ""}${remaining_seconds.toFixed(minutes > 0 ? 0 : 1)} seconds`;
|
|
50
50
|
}
|
|
51
|
+
const MINUTE_MS = 6e4;
|
|
52
|
+
const HOUR_MS = 60 * MINUTE_MS;
|
|
53
|
+
const DAY_MS = 24 * HOUR_MS;
|
|
54
|
+
function fmtTimeUntil(ms) {
|
|
55
|
+
const plural = (count, unit) => `${count} ${unit}${count === 1 ? "" : "s"}`;
|
|
56
|
+
if (ms >= DAY_MS) return plural(Math.floor(ms / DAY_MS), "day");
|
|
57
|
+
if (ms >= HOUR_MS) return plural(Math.floor(ms / HOUR_MS), "hour");
|
|
58
|
+
if (ms >= MINUTE_MS) return plural(Math.floor(ms / MINUTE_MS), "minute");
|
|
59
|
+
return "< 1 minute";
|
|
60
|
+
}
|
|
51
61
|
function fmtUpperCamelcase(input) {
|
|
52
62
|
return input.match(/[A-Z][a-z]+|[0-9]+/g)?.join(" ") ?? input;
|
|
53
63
|
}
|
|
@@ -83,6 +93,7 @@ export {
|
|
|
83
93
|
fmtRateBytes,
|
|
84
94
|
fmtSizeBytes,
|
|
85
95
|
fmtSnakeCaseToUpperSpaceCase,
|
|
96
|
+
fmtTimeUntil,
|
|
86
97
|
fmtUpperCamelcase,
|
|
87
98
|
fmtUtcDate
|
|
88
99
|
};
|
package/dist/formatting.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/formatting.ts"],"sourcesContent":["export function fmtDate(d: Date) {\n const hours = d.getHours();\n const minutes = d.getMinutes();\n return `${fmtMonth(d.getMonth())} ${d.getDate()} ${\n hours > 9 ? hours : \"0\" + hours\n }:${minutes > 9 ? minutes : \"0\" + minutes}`;\n}\n\nexport function fmtUtcDate(d: Date) {\n const hours = d.getUTCHours();\n const minutes = d.getUTCMinutes();\n return `${fmtMonth(d.getUTCMonth())} ${d.getUTCDate()} ${\n hours > 9 ? hours : \"0\" + hours\n }:${minutes > 9 ? minutes : \"0\" + minutes}`;\n}\n\nexport function fmtMonth(month: number) {\n switch (month) {\n case 0:\n return \"Jan\";\n case 1:\n return \"Feb\";\n case 2:\n return \"Mar\";\n case 3:\n return \"Apr\";\n case 4:\n return \"May\";\n case 5:\n return \"Jun\";\n case 6:\n return \"Jul\";\n case 7:\n return \"Aug\";\n case 8:\n return \"Sep\";\n case 9:\n return \"Oct\";\n case 10:\n return \"Nov\";\n case 11:\n return \"Dec\";\n }\n}\n\nexport const fmtDateWithMinutes = (d: Date) => {\n // return `${d.toLocaleDateString()} ${d.toLocaleTimeString()}`;\n return d.toLocaleString();\n};\n\nexport function fmtDuration(startTs: number, endTs: number) {\n const start = new Date(startTs);\n const end = new Date(endTs);\n const durr = end.getTime() - start.getTime();\n const seconds = durr / 1000;\n const minutes = Math.floor(seconds / 60);\n const remaining_seconds = seconds % 60;\n return `${\n minutes > 0 ? `${minutes} minute${minutes > 1 ? \"s\" : \"\"} ` : \"\"\n }${remaining_seconds.toFixed(minutes > 0 ? 0 : 1)} seconds`;\n}\n\nexport function fmtUpperCamelcase(input: string) {\n return input.match(/[A-Z][a-z]+|[0-9]+/g)?.join(\" \") ?? input;\n}\n\n/// list_all_items => List All Items\nexport function fmtSnakeCaseToUpperSpaceCase(snake: string) {\n if (snake.length === 0) return \"\";\n return snake\n .split(\"_\")\n .map((item) => item[0].toUpperCase() + item.slice(1))\n .join(\" \");\n}\n\nexport const BYTES_PER_KB = 1024;\nexport const BYTES_PER_MB = 1024 * BYTES_PER_KB;\nexport const BYTES_PER_GB = 1024 * BYTES_PER_MB;\n\nexport function fmtSizeBytes(bytes: number) {\n if (bytes >= BYTES_PER_GB) {\n return (bytes / BYTES_PER_GB).toFixed(1) + \" GiB\";\n } else if (bytes >= BYTES_PER_MB) {\n return (bytes / BYTES_PER_MB).toFixed(1) + \" MiB\";\n } else if (bytes >= BYTES_PER_KB) {\n return (bytes / BYTES_PER_KB).toFixed(1) + \" KiB\";\n } else {\n return bytes.toString() + \" bytes\";\n }\n}\n\nexport function fmtRateBytes(bytes: number) {\n return fmtSizeBytes(bytes) + \"/s\";\n}\n"],"mappings":"AAAO,SAAS,QAAQ,GAAS;AAC/B,QAAM,QAAQ,EAAE,SAAS;AACzB,QAAM,UAAU,EAAE,WAAW;AAC7B,SAAO,GAAG,SAAS,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,IAC7C,QAAQ,IAAI,QAAQ,MAAM,KAC5B,IAAI,UAAU,IAAI,UAAU,MAAM,OAAO;AAC3C;AAEO,SAAS,WAAW,GAAS;AAClC,QAAM,QAAQ,EAAE,YAAY;AAC5B,QAAM,UAAU,EAAE,cAAc;AAChC,SAAO,GAAG,SAAS,EAAE,YAAY,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,IACnD,QAAQ,IAAI,QAAQ,MAAM,KAC5B,IAAI,UAAU,IAAI,UAAU,MAAM,OAAO;AAC3C;AAEO,SAAS,SAAS,OAAe;AACtC,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEO,MAAM,qBAAqB,CAAC,MAAY;AAE7C,SAAO,EAAE,eAAe;AAC1B;AAEO,SAAS,YAAY,SAAiB,OAAe;AAC1D,QAAM,QAAQ,IAAI,KAAK,OAAO;AAC9B,QAAM,MAAM,IAAI,KAAK,KAAK;AAC1B,QAAM,OAAO,IAAI,QAAQ,IAAI,MAAM,QAAQ;AAC3C,QAAM,UAAU,OAAO;AACvB,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,QAAM,oBAAoB,UAAU;AACpC,SAAO,GACL,UAAU,IAAI,GAAG,OAAO,UAAU,UAAU,IAAI,MAAM,EAAE,MAAM,EAChE,GAAG,kBAAkB,QAAQ,UAAU,IAAI,IAAI,CAAC,CAAC;AACnD;AAEO,SAAS,kBAAkB,OAAe;AAC/C,SAAO,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,KAAK;AAC1D;AAGO,SAAS,6BAA6B,OAAe;AAC1D,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EACnD,KAAK,GAAG;AACb;AAEO,MAAM,eAAe;AACrB,MAAM,eAAe,OAAO;AAC5B,MAAM,eAAe,OAAO;AAE5B,SAAS,aAAa,OAAe;AAC1C,MAAI,SAAS,cAAc;AACzB,YAAQ,QAAQ,cAAc,QAAQ,CAAC,IAAI;AAAA,EAC7C,WAAW,SAAS,cAAc;AAChC,YAAQ,QAAQ,cAAc,QAAQ,CAAC,IAAI;AAAA,EAC7C,WAAW,SAAS,cAAc;AAChC,YAAQ,QAAQ,cAAc,QAAQ,CAAC,IAAI;AAAA,EAC7C,OAAO;AACL,WAAO,MAAM,SAAS,IAAI;AAAA,EAC5B;AACF;AAEO,SAAS,aAAa,OAAe;AAC1C,SAAO,aAAa,KAAK,IAAI;AAC/B;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/formatting.ts"],"sourcesContent":["export function fmtDate(d: Date) {\n const hours = d.getHours();\n const minutes = d.getMinutes();\n return `${fmtMonth(d.getMonth())} ${d.getDate()} ${\n hours > 9 ? hours : \"0\" + hours\n }:${minutes > 9 ? minutes : \"0\" + minutes}`;\n}\n\nexport function fmtUtcDate(d: Date) {\n const hours = d.getUTCHours();\n const minutes = d.getUTCMinutes();\n return `${fmtMonth(d.getUTCMonth())} ${d.getUTCDate()} ${\n hours > 9 ? hours : \"0\" + hours\n }:${minutes > 9 ? minutes : \"0\" + minutes}`;\n}\n\nexport function fmtMonth(month: number) {\n switch (month) {\n case 0:\n return \"Jan\";\n case 1:\n return \"Feb\";\n case 2:\n return \"Mar\";\n case 3:\n return \"Apr\";\n case 4:\n return \"May\";\n case 5:\n return \"Jun\";\n case 6:\n return \"Jul\";\n case 7:\n return \"Aug\";\n case 8:\n return \"Sep\";\n case 9:\n return \"Oct\";\n case 10:\n return \"Nov\";\n case 11:\n return \"Dec\";\n }\n}\n\nexport const fmtDateWithMinutes = (d: Date) => {\n // return `${d.toLocaleDateString()} ${d.toLocaleTimeString()}`;\n return d.toLocaleString();\n};\n\nexport function fmtDuration(startTs: number, endTs: number) {\n const start = new Date(startTs);\n const end = new Date(endTs);\n const durr = end.getTime() - start.getTime();\n const seconds = durr / 1000;\n const minutes = Math.floor(seconds / 60);\n const remaining_seconds = seconds % 60;\n return `${\n minutes > 0 ? `${minutes} minute${minutes > 1 ? \"s\" : \"\"} ` : \"\"\n }${remaining_seconds.toFixed(minutes > 0 ? 0 : 1)} seconds`;\n}\n\nconst MINUTE_MS = 60_000;\nconst HOUR_MS = 60 * MINUTE_MS;\nconst DAY_MS = 24 * HOUR_MS;\n\n/** Coarse \"time until\" of a future timestamp: days, falling back to\n * hours / minutes once under a day. */\nexport function fmtTimeUntil(ms: number) {\n const plural = (count: number, unit: string) =>\n `${count} ${unit}${count === 1 ? \"\" : \"s\"}`;\n if (ms >= DAY_MS) return plural(Math.floor(ms / DAY_MS), \"day\");\n if (ms >= HOUR_MS) return plural(Math.floor(ms / HOUR_MS), \"hour\");\n if (ms >= MINUTE_MS) return plural(Math.floor(ms / MINUTE_MS), \"minute\");\n return \"< 1 minute\";\n}\n\nexport function fmtUpperCamelcase(input: string) {\n return input.match(/[A-Z][a-z]+|[0-9]+/g)?.join(\" \") ?? input;\n}\n\n/// list_all_items => List All Items\nexport function fmtSnakeCaseToUpperSpaceCase(snake: string) {\n if (snake.length === 0) return \"\";\n return snake\n .split(\"_\")\n .map((item) => item[0].toUpperCase() + item.slice(1))\n .join(\" \");\n}\n\nexport const BYTES_PER_KB = 1024;\nexport const BYTES_PER_MB = 1024 * BYTES_PER_KB;\nexport const BYTES_PER_GB = 1024 * BYTES_PER_MB;\n\nexport function fmtSizeBytes(bytes: number) {\n if (bytes >= BYTES_PER_GB) {\n return (bytes / BYTES_PER_GB).toFixed(1) + \" GiB\";\n } else if (bytes >= BYTES_PER_MB) {\n return (bytes / BYTES_PER_MB).toFixed(1) + \" MiB\";\n } else if (bytes >= BYTES_PER_KB) {\n return (bytes / BYTES_PER_KB).toFixed(1) + \" KiB\";\n } else {\n return bytes.toString() + \" bytes\";\n }\n}\n\nexport function fmtRateBytes(bytes: number) {\n return fmtSizeBytes(bytes) + \"/s\";\n}\n"],"mappings":"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","names":[]}
|