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
|
import { Either, type IEither } from "@emprespresso/pengueno";
export const getRequiredEnv = <V extends string>(name: V): IEither<Error, V> =>
Either.fromFailable<Error, V | undefined>(() => Deno.env.get(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>),
);
|