import { Either, type IEither } from '@emprespresso/pengueno'; export const getRequiredEnv = (name: V): IEither => Either.fromFailable(() => 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, V = string> = { [K in T extends ReadonlyArray ? U : never]: V; }; export const getRequiredEnvVars = (vars: ReadonlyArray) => vars .map((envVar) => [envVar, getRequiredEnv(envVar)] as [V, IEither]) .reduce( (acc: IEither>, x: [V, IEither]) => { const [envVar, eitherVal] = x; return acc.flatMap((args) => { return eitherVal.mapRight( (envValue) => ({ ...args, [envVar]: envValue, }) as ObjectFromList, ); }); }, Either.right({} as ObjectFromList), );