NileshPatel17 / nestjs-monorepo

This is monorepo boilerplate using Nestjs, authentication, docker, redis, secrets service, logs service, libs structure, anti corruption layer pattern, adapter pattern, dependency inversion pattern, mongodb, redis, swagger and tests.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Nestjs Monorepo Boilerplate

Check

Statements Branches Functions Lines
Statements Branches Functions Lines
Monorepo with nestjs
  • Docker

  • Secrets Service

  • Logs Service

    • Pinojs
    • Elastic
  • Observability

    • Jeager
    • Opentracing
  • Authentication

  • Error Handler

  • Libs Structure

  • Dependency Inversion Pattern

  • Anti Corruption Layer Pattern

  • Interface Adapter Pattern

  • Generic Repository Pattern

  • Swaggger Documentation

  • Redis

  • Mongodb

    • mongoose
    • multiples databases
  • Tests

    • unit
    • e2e
    • 90% coverage

Prerequisite

  • Node: 14 => <= 15
  • Docker
  • npm install -g commitizen
  • npm install -g changelog

Instalation

  • install monorepo dependencies
    $ yarn monorepo:install
  • install project dependencies
    $ yarn workspace <workspaceName> install
  • install lib on project
    $ yarn workspace <workspaceName> add <libName>

Running local mongodb/redis/kibana/jeager

$ yarn infra:local
# http://0.0.0.0:8082/ to access mongo
# http://0.0.0.0:8081/ to access redis
# http://0.0.0.0:5601/app/home to access kibana
# http://0.0.0.0:16686/search to access jeager

workspace list
$ yarn workspaces info
  • @app/main.api
  • @app/auth.api
  • @tools/eslint.config
  • @libs/utils
  • @libs/modules
  • @libs/core

Running the app

  • local

    $ yarn start:auth-api:dev
    $ yarn start:main-api:dev
  • dev/hml/prd environment

    $ docker-compose up --build

Add new features

$ npm i -g @mikemajesty/monorepo-nestjs-cli
  • add new module

      yarn add:module
    
  • add new api

      yarn add:app
    
  • add new test

      yarn add:test
    

Tests

  • unit

    # run monorepo tests
    $ yarn test
    # Run project tests
    $ yarn test main.api
    $ yarn test auth.api
    $ yarn test libs
  • e2e

    $ yarn test:e2e
    
  • coverage

    $ yarn test:coverage
    

Lint

  • Run monorepo lint
    $ yarn lint
  • Run project lint
    $ yarn workspace <workspaceName> lint
    

Build

  • Run project build
    $ yarn build <workspaceName>
    

-- App Skeleton

.
├── apps
│   ├── auth-api
│   │   ├── Dockerfile
│   │   ├── jest.config.js
│   │   ├── package.json
│   │   ├── src
│   │   │   ├── main.ts
│   │   │   └── modules
│   │   │       ├── health
│   │   │       │   ├── adapter.ts
│   │   │       │   ├── controller.ts
│   │   │       │   ├── module.ts
│   │   │       │   ├── service.ts
│   │   │       │   ├── swagger.ts
│   │   │       │   └── __tests__
│   │   │       │       ├── controller.e2e.spec.ts
│   │   │       │       ├── module.spec.ts
│   │   │       │       └── service.spec.ts
│   │   │       ├── login
│   │   │       │   ├── adapter.ts
│   │   │       │   ├── controller.ts
│   │   │       │   ├── module.ts
│   │   │       │   ├── service.ts
│   │   │       │   ├── swagger.ts
│   │   │       │   └── __tests__
│   │   │       │       ├── controller.e2e.spec.ts
│   │   │       │       └── service.spec.ts
│   │   │       ├── module.ts
│   │   │       ├── __tests__
│   │   │       │   └── module.spec.ts
│   │   │       └── user
│   │   │           ├── adapter.ts
│   │   │           ├── entity.ts
│   │   │           ├── module.ts
│   │   │           ├── repository.ts
│   │   │           ├── schema.ts
│   │   │           └── __tests__
│   │   │               └── repository.spec.ts
│   │   ├── tests
│   │   │   └── initialization.js
│   │   ├── tsconfig.build.json
│   │   ├── tsconfig.json
│   │   └── yarn.lock
│   └── main-api
│       ├── Dockerfile
│       ├── jest.config.js
│       ├── node_modules
│       ├── package.json
│       ├── src
│       │   ├── main.ts
│       │   └── modules
│       │       ├── cats
│       │       │   ├── adapter.ts
│       │       │   ├── controller.ts
│       │       │   ├── entity.ts
│       │       │   ├── module.ts
│       │       │   ├── repository.ts
│       │       │   ├── schema.ts
│       │       │   ├── swagger.ts
│       │       │   └── __tests__
│       │       │       ├── controller.e2e.spec.ts
│       │       │       └── repository.spec.ts
│       │       ├── health
│       │       │   ├── adapter.ts
│       │       │   ├── controller.ts
│       │       │   ├── module.ts
│       │       │   ├── service.ts
│       │       │   ├── swagger.ts
│       │       │   └── __tests__
│       │       │       ├── controller.e2e.spec.ts
│       │       │       ├── module.spec.ts
│       │       │       └── service.spec.ts
│       │       ├── module.ts
│       │       └── __tests__
│       │           └── module.spec.ts
│       ├── tests
│       │   └── initialization.js
│       ├── tsconfig.build.json
│       └── tsconfig.json
├── CHANGELOG.md
├── commitlint.config.ts
├── CONTRIBUTING.md
├── deploy
│   └── production-version.sh
├── docker-compose-local.yml
├── docker-compose.yml
├── jest.config.e2e.ts
├── jest.config.ts
├── libs
│   ├── core
│   │   ├── index.ts
│   │   ├── jest.config.js
│   │   ├── package.json
│   │   ├── tests
│   │   │   └── initialization.js
│   │   └── tsconfig.json
│   ├── modules
│   │   ├── auth
│   │   │   └── token
│   │   │       ├── adapter.ts
│   │   │       ├── module.ts
│   │   │       ├── service.ts
│   │   │       ├── __tests__
│   │   │       │   └── service.spec.ts
│   │   │       └── types.ts
│   │   ├── common
│   │   │   ├── http
│   │   │   │   ├── adapter.ts
│   │   │   │   ├── module.ts
│   │   │   │   ├── service.ts
│   │   │   │   └── __tests__
│   │   │   │       ├── module.spec.ts
│   │   │   │       └── service.spec.ts
│   │   │   ├── module.ts
│   │   │   └── __tests__
│   │   │       └── module.spec.ts
│   │   ├── database
│   │   │   ├── adapter.ts
│   │   │   ├── connection
│   │   │   │   ├── auth.ts
│   │   │   │   └── cats.ts
│   │   │   ├── entity.ts
│   │   │   ├── enum.ts
│   │   │   ├── repository.ts
│   │   │   ├── service.ts
│   │   │   └── __tests__
│   │   │       ├── repository.spec.ts
│   │   │       └── service.spec.ts
│   │   ├── global
│   │   │   ├── logger
│   │   │   │   ├── adapter.ts
│   │   │   │   ├── module.ts
│   │   │   │   ├── service.ts
│   │   │   │   ├── __tests__
│   │   │   │   │   ├── module.spec.ts
│   │   │   │   │   └── service.spec.ts
│   │   │   │   └── type.ts
│   │   │   ├── module.ts
│   │   │   ├── secrets
│   │   │   │   ├── adapter.ts
│   │   │   │   ├── enum.ts
│   │   │   │   ├── module.ts
│   │   │   │   ├── service.ts
│   │   │   │   └── __tests__
│   │   │   │       ├── module.spec.ts
│   │   │   │       └── service.spec.ts
│   │   │   └── __tests__
│   │   │       └── module.spec.ts
│   │   ├── index.ts
│   │   ├── jest.config.js
│   │   ├── package.json
│   │   ├── redis
│   │   │   ├── adapter.ts
│   │   │   ├── module.ts
│   │   │   ├── service.ts
│   │   │   ├── __tests__
│   │   │   │   └── service.spec.ts
│   │   │   └── types.ts
│   │   ├── __tests__
│   │   │   └── module.spec.ts
│   │   ├── tests
│   │   │   └── initialization.js
│   │   └── tsconfig.json
│   └── utils
│       ├── documentation
│       │   ├── constants.ts
│       │   └── swagger.ts
│       ├── exception.ts
│       ├── filters
│       │   ├── http-exception.filter.ts
│       │   └── __tests__
│       │       └── http-exception.filter.spec.ts
│       ├── index.ts
│       ├── interceptors
│       │   ├── exception
│       │   │   ├── http-exception.interceptor.ts
│       │   │   └── __tests__
│       │   │       └── http-exception.interceptor.spec.ts
│       │   └── logger
│       │       ├── http-logger.interceptor.ts
│       │       ├── http-tracing.interceptor.ts
│       │       └── __tests__
│       │           └── http-logger.interceptor.spec.ts
│       ├── jest.config.js
│       ├── middleware
│       │   └── auth
│       │       ├── is-logged.middleware.ts
│       │       └── __tests__
│       │           └── is-logged.middleware.spec.ts
│       ├── package.json
│       ├── request.ts
│       ├── static
│       │   └── htttp-status.json
│       ├── __tests__
│       │   └── exception.spec.ts
│       ├── tests
│       │   ├── initialization.js
│       │   ├── mock-utils.ts
│       │   └── __tests__
│       │       └── mock-utils.spec.ts
│       └── tsconfig.json
├── nest-cli.json
├── package.json
├── README.md
├── tests
│   └── common-initialization.js
├── tools
│   └── eslint
│       └── package.json
├── tsconfig.build.json
├── tsconfig.json
└── update-version.sh

Architecture

  • ├── tools: Project tools like: eslint, prettier and etc.
  • ├── libs: Application shared libs.
  • ├── libs ├── core: Core business rules, don't use nestjs dependecies here, only class and rules that will be shared with other projects
  • ├── libs ├── modules: Application modules, use only nestjs modules here, you can add modules like: http, databse etc.
  • ├── libs ├── utils: Application utils, utilities that will shared with your monorepo.
  • ├── apps: Monorepo Applications.
  • ├── tests: Monorepo tests initializer like: env, mocks and configs.
  • ├── libs ├── modules ├── global ├── secrets: Monorepo secrets.

The following is a list of all the people that have contributed Nest monorepo boilerplate. Thanks for your contributions!

mikemajesty

License

It is available under the MIT license. License

About

This is monorepo boilerplate using Nestjs, authentication, docker, redis, secrets service, logs service, libs structure, anti corruption layer pattern, adapter pattern, dependency inversion pattern, mongodb, redis, swagger and tests.


Languages

Language:TypeScript 92.1%Language:JavaScript 4.5%Language:Shell 2.5%Language:Dockerfile 0.9%