Load process.env
into class instance by convention and validate with class-validator
annotations
class Nested {
@IsString()
foo: string // QUX_FOO
@IsInt()
barBaz: number // QUX_BAR_BAZ
}
class Cls {
@ValidateNested
qux: Nested = new Nested() // Default values are necessary for nested class fields
@IsBoolean()
quux: boolean // QUUX
}
-
Install this package:
npm install -S node-env-to-class
-
reflect-metadata
shim is required, install it too:npm install reflect-metadata --save
and make sure to import it in a global place, like app.ts:
import 'reflect-metadata';
-
ES6 features are used, if you are using old version of node.js you may need to install es6-shim:
npm install -S es6-shim
and import it in a global place like app.ts:
import 'es6-shim';
Define the classes and annotate with class-validator type decorators:
import {
IsBoolean,
IsInt,
IsNumber,
IsString,
ValidateNested,
} from 'class-validator'
class Nested {
@IsString()
str: string = 'str-default'
@IsInt()
int: number = 123
@IsNumber()
float: number = 0.123
@IsBoolean()
bool: boolean = true
}
class Parent {
@IsString()
strParent!: string
@IsInt()
intParent!: number
@IsNumber()
floatParent: number = 0.321
@IsBoolean()
boolParent = false
@ValidateNested()
nestedParent: Nested = new Nested() // Default values are necessary for nested class fields
}
class Child extends Parent {
@IsString()
strChild: string = 'str-child-default'
@IsInt()
intChild: number = 321
@IsNumber()
floatChild!: number
@IsBoolean()
boolChild!: boolean
@ValidateNested()
nestedChild: Nested = new Nested() // Default values are necessary for nested class fields
}
❗ Note that both the TypeScript type annotations and the
class-validator
decorators are required. Default values are necessary for nested class fields.
Then use envToClass
to load process.env
into a class instance:
const [errs, c] = envToClass(Child)
if (errs.length) {
console.log('Validation error:', errs)
} else {
console.log('Loaded class:', c)
}
Set the envPrefix
option to load from prefixed environment variable names such as PREFIX_ENV_NAME
:
const [errs, c] = envToClass(Child, undefined, { envPrefix: 'PREFIX' })
classToEnv
will override the existing values in the supplied class instance or the default values in the new class instance by default. To keep the existing values, set the overrideExistingValues
option to true
:
const [errs, c] = envToClass(Child, undefined, {
overrideExistingValues: false,
})
if (errs.length) {
console.log('Validation error:', errs)
} else {
console.log('Loaded class:', c)
}
See Options for all the options.
MIT © Nex Zhu