import { IOptional, Either, Optional, type IEither } from '@emprespresso/pengueno'; export const getEnv = (name: string): IOptional => Optional.from(process.env[name]).filter((val) => val.trim() !== ''); export const getRequiredEnv = (name: string): IEither => getEnv(name) .map((envVal) => Either.right(envVal)) .orSome(() => Either.left(new Error(`environment variable "${name}" is required D:`))) .get(); 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), );