/effect-dotenv

Effect-TS ConfigProvider wrapper for dotenv

Primary LanguageTypeScriptMIT LicenseMIT

effect-dotenv

dotenv ConfigProvider implementation for Effect-TS

pnpm add effect-dotenv

Using setConfigProvider layer

setDotEnvConfigProvider creates a layer that will attempt to load the .env file. If the .env file doesn't exist, it will use the current ConfigProvider instead. If a .env is found, the derived ConfigProvider will be used as a fallback of the current ConfigProvider. This results in the standard behaviour where environment variable is used if set, otherwise it attempts to load it from the .env file.

The input parameters can be

  • ommited completely - .env file is used by default
  • a string - it will attempt to load a file on the given path
  • list of strings - it will use the first existing .env file from the list
import { NodeContext } from "@effect/platform-node"
import { Config, Effect, pipe } from "effect";
import { DotEnv } from "effect-dotenv";

const exampleConfig = Config.all({
  value: Config.string("VALUE"),
});

const program = pipe(
  Effect.config(exampleConfig),
  Effect.flatMap((config) => Effect.log(`value = ${config.value}`)),
  Effect.provide(DotEnv.setConfigProvider()),
  Effect.provide(NodeContext.layer)
);

Effect.runPromise(program);

Using makeConfigProvider effect

The example below configures config provider that will read the config from .env file. The program effect will fail with NoAvailableDotEnvFileError error if the .env file doesn't exist.

import { NodeContext } from "@effect/platform-node"
import { Config, Effect, Layer, pipe } from "effect";
import { DotEnv } from "effect-dotenv";

const exampleConfig = Config.all({
  value: Config.string("VALUE"),
});

const program = pipe(
  Effect.config(exampleConfig),
  Effect.flatMap((config) => Effect.log(`value = ${config.value}`)),
  Effect.provide(
    pipe(
      DotEnv.makeConfigProvider(".env"),
      Effect.map(Layer.setConfigProvider),
      Layer.unwrapEffect,
    ),
  ),
  Effect.provide(NodeContext.layer)
);

Effect.runPromise(program);