https://github.com/shahriar-shojib/atenv
modern dotenv replacement
https://github.com/shahriar-shojib/atenv
decorators dotenv env parser typescript
Last synced: 12 months ago
JSON representation
modern dotenv replacement
- Host: GitHub
- URL: https://github.com/shahriar-shojib/atenv
- Owner: shahriar-shojib
- Created: 2021-10-23T10:20:55.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2022-04-30T00:27:04.000Z (about 4 years ago)
- Last Synced: 2025-06-26T16:07:27.177Z (12 months ago)
- Topics: decorators, dotenv, env, parser, typescript
- Language: TypeScript
- Homepage:
- Size: 169 KB
- Stars: 15
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
## AtEnv is a modern replacement for parsing env on Typescript projects
[](https://github.com/shahriar-shojib/atenv/actions/workflows/tests.yml)
[](https://github.com/shahriar-shojib/atenv/actions/workflows/publish-to-npm.yml)
### How to install
```bash
npm install atenv
```
## How to use
Declare a class which you want to parse env to
```typescript
import 'reflect-metadata'; // required
import { IsEnum } from 'class-validator';
export enum NodeEnv = {
DEV = 'development',
PRODUCTION = 'production'
}
class AWS {
@Env('AWS_SECRET')
secret: string;
@Env('AWS_KEY')
key: string;
}
export class AppConfig {
@Env('PORT')
@IsDefined() //you can use class validator decorators here
port: number; // gets transformed to number automatically
// it is also possible to define child classes for ease of use
@Section(() => AWS)
aws: AWS;
@Env('NODE_ENV')
@IsEnum(NodeEnv); // throws error if not defined
nodeEnv: NodeEnv;
//helper getters are okay too
get isDev() {
return this.nodeEnv === NodeEnv.DEV;
}
}
export const appConfig = parseEnv(AppConfig); //appConfig is now an instance of AppConfig containing values from .env
//now access your env like this
appConfig.port // number
```
> Booleans, and Numbers are automatically transformed, if you need to use custom transformation logic, you can use the `@Transform` Decorator from [class-transformer](https://github.com/typestack/class-transformer#additional-data-transformation)
## Default and optional values
it is possible to set default values like this
```typescript
export enum NodeEnv = {
DEV = 'development',
PRODUCTION = 'production'
}
export class AppConfig {
@Env('NODE_ENV')
@IsEnum(NodeEnv); // throws error if not defined
@IsOptional() // class validator will treat this value as optional
nodeEnv: NodeEnv = NodeEnv.DEV;
}
const myEnv = parseEnv(AppConfig)
myEnv.nodeEnv === 'development' //true
```
## Custom Env files
```typescript
export enum NodeEnv = {
DEV = 'development',
PRODUCTION = 'production'
}
export class AppConfig {
@Env('NODE_ENV')
@IsEnum(NodeEnv); // throws error if not defined
@IsOptional() // class validator will treat this value as optional
nodeEnv: NodeEnv = NodeEnv.DEV;
}
const myEnv = parseEnv(AppConfig, {
dotEnvOptions: {
path: '.env.development' // or a path to your env
}
})
```
## Additional Options
You can parse additional options for class-validator and class-transformer
```typescript
parseEnv(YourClass, {
transformOptions: {} // override classToclass options
validatorOptions: {} // override validateSync options
});
```
Docs for options:
- [transformOptions](https://github.com/typestack/class-transformer/blob/develop/src/interfaces/class-transformer-options.interface.ts)
- [validatorOptions](https://github.com/typestack/class-validator#passing-options)