env-safe is module that loads environment variables from a .env
file into process.env
with type-safe. And can also validate the type of process.env
. env-safe is dependent on dotenv and reflect-metadata.
npm intall @creatrip/env-safe --save
Or installing with yarn? yarn add @creatrip/env-safe
Turn on emitDecoratorMetadata
, experimentalDecorators
in tsconfig.json:
{
"compilerOptions": {
"emitDecoratorMetadata": true,
"experimentalDecorators": true
...
}
...
}
Create a .env
file in the root of your project:
DATABASE_HOST="localhost"
DATABASE_PORT=3306
Use env-safe to create env config class:
import { EnvSafe, EnvKey } from '@creatrip/env-safe';
@EnvSafe()
export class Env {
@EnvKey()
static DATABASE_HOST: string;
@EnvKey()
static DATABASE_PORT: number;
}
filename: env.ts
That's it. Just use the newly created config class:
import { Env } from './env.ts';
mysql.connect({
host: Env.DATABASE_HOST, // String("localhost")
port: Env.DATABASE_PORT, // Number(3306)
});
Comments may be added to your file on their own line or inline:
# This is a comment
DATABASE_HOST="localhost" # comment
DATABASE_PASSWORD="can-define-with-#"
Comments begin where a #
exists, so if your value contains a #
please wrap it in quotes.
Set default value to env config class property:
@EnvSafe()
export class Env {
@EnvKey({ default: 'localhost' })
static DATABASE_HOST: string;
@EnvKey({ default: 3306 })
static DATABASE_PORT: number;
}
Since the provided .env
does not contain all the variables defined in env config class, an exception is thrown:
DATABASE_HOST=
DATABASE_PORT="wrong data"
@EnvSafe()
export class Env {
@EnvKey()
static DATABASE_HOST: string; // Not defined Error
@EnvKey()
static DATABASE_PORT: number; // NaN Error
@EnvKey()
static DATABASE_USER: string; // Not defined Error
}
$ node dist/index.js
ERROR: DATABASE_USER is not defined in .env
Can change .env
path in your project:
$ ls
development.env stagging.env production.env
@EnvSafe({ path: 'development.env' })
export class Env {
...
}
Can define multiple env config class:
AWS_SECRET_KEY="secret key"
S3_BUCKET="bucket name"
@EnvSafe()
export class EnvAWS {
@EnvKey()
static AWS_SECRET_KEY: string; // String("secret key")
}
@EnvSafe()
export class EnvS3 {
@EnvKey()
static S3_BUCKET: string; // String("bucket name")
}
See CONTRIBUTING.md