aboutsummaryrefslogtreecommitdiff
path: root/services/docker/mail-server/relay/util.ts
diff options
context:
space:
mode:
Diffstat (limited to 'services/docker/mail-server/relay/util.ts')
-rw-r--r--services/docker/mail-server/relay/util.ts36
1 files changed, 36 insertions, 0 deletions
diff --git a/services/docker/mail-server/relay/util.ts b/services/docker/mail-server/relay/util.ts
new file mode 100644
index 0000000..3f7f989
--- /dev/null
+++ b/services/docker/mail-server/relay/util.ts
@@ -0,0 +1,36 @@
+declare global {
+ interface Date {
+ toFileNameString(dateOnly?: boolean): string;
+ }
+}
+
+Object.defineProperty(Date.prototype, "toFileNameString", {
+ value: function (dateOnly?: boolean) {
+ const str = (this as Date).toISOString();
+ return dateOnly === true
+ ? str.slice(0, str.indexOf("T"))
+ : str.replaceAll(/:|\./g, "-");
+ },
+});
+
+export function transformProperties<T extends object, N>(
+ object: T,
+ transformer: (value: T[keyof T], key: keyof T) => N,
+): { [k in keyof T]: N } {
+ return Object.fromEntries(
+ Object.entries(object).map((
+ [k, v],
+ ) => [k, transformer(v, k as keyof T)]),
+ ) as { [k in keyof T]: N };
+}
+
+export function withDefaults<T extends object>(
+ partial: Partial<T> | null | undefined,
+ defaults: T,
+): T {
+ const result: Record<PropertyKey, unknown> = {};
+ for (const [key, value] of Object.entries(defaults)) {
+ result[key] = partial?.[key as keyof T] ?? value;
+ }
+ return result as T;
+}