summaryrefslogtreecommitdiff
path: root/u/process/env.ts
blob: 1e4fd32773c226c2dcf64547afb5d48006efdc25 (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
import { Either, type IEither } from '@emprespresso/pengueno';

export const getRequiredEnv = <V extends string>(name: V): IEither<Error, V> =>
    Either.fromFailable<Error, V | undefined>(() => process.env[name] as V | undefined) // could throw when no permission.
        .flatMap(
            (v) => (v && Either.right(v)) || Either.left(new Error(`environment variable "${name}" is required D:`)),
        );

type ObjectFromList<T extends ReadonlyArray<string>, V = string> = {
    [K in T extends ReadonlyArray<infer U> ? U : never]: V;
};

export const getRequiredEnvVars = <V extends string>(vars: ReadonlyArray<V>) =>
    vars
        .map((envVar) => [envVar, getRequiredEnv(envVar)] as [V, IEither<Error, V>])
        .reduce(
            (acc: IEither<Error, ObjectFromList<typeof vars>>, x: [V, IEither<Error, V>]) => {
                const [envVar, eitherVal] = x;
                return acc.flatMap((args) => {
                    return eitherVal.mapRight(
                        (envValue) =>
                            ({
                                ...args,
                                [envVar]: envValue,
                            }) as ObjectFromList<typeof vars>,
                    );
                });
            },
            Either.right({} as ObjectFromList<typeof vars>),
        );