@nestjsx/common

A set of NestJs decorators, interfaces and configuration for application modules bootstraping

Usage no npm install needed!

<script type="module">
  import nestjsxCommon from 'https://cdn.skypack.dev/@nestjsx/common';
</script>

README

Nestjsx Logo

A set of opinionated NestJS extensions and modules

Travis Coverage Status

@nestjsx/common

A set of NestJs decorators, interfaces and configuration for application modules bootstraping.

Table of Contents

Install

npm i --save @nestjsx/common

Decorators

@nestjsx/common provides two module decorators: @Module() and @AppRootModule(). They use glob to import module's files. Generally it looks like this:

/*.+(names){.ts,.js}

The default list of files names can be found under Configuration section.

@Module() decorator

It allows to inject controllers, providers, import entities or models and export providers with minimum effort. To make this happen, a file that exports a module class should be placed in a root of module directory. e.g. we have heroes module where we have heroes.module.ts and some files alongside with it or under some subdirectories of this module: heroes.service.ts, heroes.controller.ts, hero.entity.ts. In this case, heroes.module.ts can be like this:

import { Module } from '@nestjsx/common';

@Module()
export class HeroesModule {}

The @Module() decorator will inject, import and export those components. Of course, we can override any decorator's config property as if we use native NestJS @Module() decorator (docs).

Entities (models) can be imported if one of these has been installed: @nestjs/typeorm or @nestjs/mongoose. Also the orm package name must be specified in the Configuration. e.g.

...
"packages": {
  "orm": {
    "name": "@nestjs/typeorm"
  }
}

@AppRootModule() decorator

It allows to import application modules and can be used as a NestJS root module. e.g. we have a module file app.module.ts in our src directory:

import { AppRootModule } from '@nestjsx/common';

@AppRootModule()
export class AppModule {}

It will import modules and then we can use it the bootstrap function:

...
const app = await NestFactory.create(AppModule);

For the sake of the idea of module's functionality incapsulation, @AppRootModule will not import all modules, but only those with the names that are specified in the Configuration. By default, they are ["global-module", "api-module"] and can be changed in the configuration to meet your requirements.

@AppRootModule can also import global providers like APP_GUARD, APP_INTERCEPTOR, APP_FILTER and APP_PIPE. e.g. we have a file http-filter.app-provider.ts (or we can call it http.app-filter.ts) somewhere in our src directory with the following:

import { APP_FILTER } from '@nestjs/core';
import { NestjsxAppProvider } from '@nestjsx/common';

export const AppHttpFilterProvider = {
  order: 0,
  provider: {
    provide: APP_FILTER,
    useClass: HttpFilter,
  },
} as NestjsxAppProvider;

Since these files can be created anywhere in our project, we want to make sure that these global filters, guards, interceptors and pipes will be executed in a right order. To do so, we need to set an order property for each of them.

Files with those global components must be named according to globalsPrefix specified in the Configuration (app as a default) and can be changed accordingly.

Configuration

By default, configuration looks like this:

"bootstrap": {
  "globalsPrefix": "app",
  "exportProviders": true,
  "files": {
    "modules": ["global-module", "api-module"],
    "providers": ["provider", "providers", "service", "helper", "gateway"],
    "controllers": ["controller"],
    "guards": ["guard"],
    "interceptors": ["interceptor"],
    "filters": ["filter"],
    "pipes": ["pipe"],
    "entities": ["entity"]
  }
},
"packages": {
  "orm": {
    "name": null
  }
}

Any of this params can be changed in the configuration file:

.nestrc

You can create it in your project root or any other appropriate place (please refer to rc npm package for more details).