npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@jchpro/nest-config

v0.1.0

Published

Nest.js config loading utility

Downloads

2

Readme

Nest.js config loading utility

Yet another way of loading config in Nest.js.

Description

This library is heavily inspired by solution described in Nest.js docs.

Basically it does three things:

  • reads config from environment variables just like Nest's ConfigModule would;
  • with help from class-transformer creates strongly-typed, injectable class instances with properties mapped from environment variables;
  • using the power of class-validator validates these variables.

Usage

Create config classes

Create regular TypeScript classes and mark the properties you want mapped from environment variables.


export enum Environment {
  Development = "development",
  Production = "production"
}

export class ServerConfig {

  // Providing environment variable name explicitly
  @IsEnum(Environment)
  @EnvProperty('NODE_ENV')
  readonly environment: Environment;

  // `SERVER_PORT` will be used as an environment variable name
  @IsNumber()
  @EnvProperty()
  readonly SERVER_PORT: number;
}

export class DatabaseConfig {

  @Matches(/^(mongodb:(?:\/{2})?)((\w+?):(\w+?)@|:?@?)(\w+?):(\d+)\/([\w-]+?)$/)
  @EnvProperty('APP_MONGO_URI')
  readonly mongoUri: string;
  
}

:warning: You have to use at least one class-validator decorator per class.

Import ConfigModule

In AppModule:

@Module({
  imports: [
    ConfigModule.forRoot({
      classes: [ServerConfig, DatabaseConfig]
    })
  ],
  controllers: [],
  providers: [],
})
export class AppModule {}

You can customize behavior of almost any initialization step performed by external packages, as well as provide custom error to throw when validation fails. Check ConfigModuleOptions for more info.

Use your classes in the app

Your instantiated config classes are available via good old dependency injection:


@Injectable()
export class DatabaseConfigService {

  constructor(
    config: DatabaseConfig
  ) {
    console.log(config.mongoUri); // => "mongodb://localhost:27017/my-database"
  }

}

Original config object resolved by Nest is passed through the module instantiation process, so all environment variables will be available via ConfigService#get, though without typing:


@Injectable()
export class ServerConfigService {

  constructor(
    configService: ConfigService
  ) {
    const env = configService.get('NODE_ENV');      // type = any
    console.log(env);                               // => development
  }

}

Use in main.ts

Since initialization of the module happens at the decorators level, your config classes are available even before creation of the app in main.ts!

async function bootstrap() {
  const config = ConfigResolver.get(AppConfig)!;
  
  // Use your config even during `AppModule` creation.
  const app = await NestFactory.create(AppModule);
  await app.listen(config.serverPort);
}
bootstrap();