aboutsummaryrefslogtreecommitdiff
path: root/services/docker/mail-server/aws-sendmail/util.ts
blob: 14118403d93e45c568aab3677be79d97aa64f051 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
function getZonedDateTime(instant?: Temporal.Instant | Date) {
  if (instant == null) {
    instant = Temporal.Now.instant();
  } else if (instant instanceof Date) {
    instant = instant.toTemporalInstant();
  }

  return instant.toZonedDateTimeISO("UTC");
}

export function generateTimeStringForFileName(
  instant?: Temporal.Instant | Date,
  dateOnly: boolean = false,
): string {
  const time = getZonedDateTime(instant);

  if (dateOnly) {
    return time.toPlainDate().toString();
  } else {
    return time.toPlainDateTime().toString().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 createSingleton<T>(
  name: string,
): [() => T, (v: T | null) => void] {
  let singleton: T | null = null;

  return [
    () => {
      if (singleton == null) {
        throw new Error(`Singleton ${name} is not set now.`);
      }
      return singleton;
    },
    (newValue: T | null) => singleton = newValue,
  ];
}