jotenv is fast json-schema validated dotenv config parser.
npm i jotenv
# or yarn add jotenv
# or pnpm add jotenv
- parses .env files
- overrides variables in .env files by variables with the same name from
process.env
(ifoverridesByEnv
option istrue
) - variables interpolation (requires specifying
interpolateVariables
, variables that starts withENV_
are retrieved fromprocess.env
) - custom value transformations (provides one built-in -
splitBySemicolon
) - casts values to specified in schema types
Define json-schema for your configuration and let jotenv load it for you. Having config like this:
DB_HOST=localhost
DB_PORT=27017
DB_PASSWORD=secret
ALLOWED_HOSTS=http://localhost:3000; http://localhost:5000
jotenv allows us to parse it into JavaScript object with coerced types:
import { loadConfig } from "jotenv";
const schema = {
type: "object",
required: ["DB_PORT", "DB_HOST", "ALLOWED_HOSTS"],
properties: {
DB_PORT: {
type: "number"
},
DB_HOST: {
type: "string"
},
DB_PASSWORD: {
type: "string",
},
ALLOWED_HOSTS: {
type: "string",
transform: "splitBySemicolon",
},
}
};
const config = loadConfig({
path: `${process.cwd()}/.env`,
schema,
});
// {
// DB_PORT: 27017,
// DB_HOST: "localhost",
// DB_PASSWORD: "secret",
// ALLOWED_HOSTS: ["http://locahost:3000", "http://locahost:5000"]
// }
Sometimes, it may be useful to keep configuration files together with application code, so they don't go out of sync and other contributors may change them. But it's unsafe to keep all configs in plain text, especially passwords, tokens, etc.
To solve this, we need to encrypt sensitive values and decrypt them when application starts. To do this with jotenv, we just need to provide a custom transformation:
import { loadConfig } from "jotenv";
const schema = {
type: "object",
required: ["DB_PASSWORD", "DB_HOST"],
properties: {
DB_HOST: {
type: "string"
},
DB_PASSWORD: {
type: "string",
transform: "decrypt"
},
}
};
const config = loadConfig({
path: `${process.cwd()}/.env`,
schema,
transformations: {
decrypt(value: string) {
// custom decryption algorithm
}
}
});
To get ts validation and IDE hints for config properties, we can use an awesome json-schema-to-ts library:
import { FromSchema } from "json-schema-to-ts";
const schema = {
type: "object",
required: ["DB_PASSWORD", "DB_HOST"],
properties: {
DB_HOST: {
type: "string"
},
DB_PASSWORD: {
type: "string",
},
}
} as const; // Important!
const config = loadConfig<FromSchema<typeof schema>>({
path: `${process.cwd()}/.env`,
schema,
});
console.log(config.DB_HOST) // OK
console.log(config.DB_PASS) // fails at compile time
Apache License, Version 2.0, 2021-present Sergii Stotskyi