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

nest-abstract

v1.0.0-beta.10

Published

NestJS Abstraction Helper

Downloads

43

Readme

Fair warning: This package is still in early development stage. Please give me any feedbacks if you decide to try it out and find any problems/area-for-improvements. Thank you!

Features

  • Provides Abstractions for your NestJS RESTfulAPI.
  • Includes: AbstractModule, AbstractService, and AbstractControllerFactory along with AbstractModel (mongoose) and AbstractEntity (typeorm).
  • [x] Supports @nestjs/swagger

Motivations

I am a big fan of TypeScript and abstraction overall. One of the biggest motivations is to create a BaseController to work with Swagger's decorators that @nestjs/swagger provides which is on the todo list. Main reason is I want to roll out a version of the package that will make it work with non-swagger applications first as this is my first attempt at an npm package.

Installation

npm i nest-abstract

Usage

  1. Import AbstractModule in your AppModule

     import { Module } from '@nestjs/common';
     import { AbstractModule } from 'nest-abstract';
    
     @Module({
         imports: [AbstractModule.forRoot()],
     })
     export class AppModule {}

    By default, AbstractModule will use Mongoose. You can pass a value of ObjectMapping to the forRoot() method.

    import { Module } from '@nestjs/common';
    import { AbstractModule, ObjectMapping } from 'nest-abstract';
    
    @Module({
        imports: [AbstractModule.forRoot(ObjectMapping.TypeOrm)],
    })
    export class AppModule {}

    Note: ObjectMapping.Mongoose will require you to install mongoose and @nestjs/mongoose while ObjectMapping.TypeOrm will require you to install typeorm and @nestjs/typeorm.

    Note: I will list the usage for Mongoose from step 2 on.

  2. Create your MongooseSchema and create an interface that will extend AbstractModel. AbstractModel is an interface that has: createdAt, updatedAt and id.

    import { Schema } from 'mongoose';
    import { AbstractModel } from 'nest-abstract';
       
    const todoSchema = new Schema({
        content: {
            type: String
        }
    }, { timestamps: true });
    
    interface Todo extends AbstractModel {
        content: string;
    }

    Use your schema to initialize your Model with @nestjs/mongoose.

  3. Create your Service with AbstractMongooseService.

    import { Injectable } from '@nestjs/common';
    import { InjectModel } from '@nestjs/mongoose';
    import { AbstractMongooseService } from 'nest-abstract';
    import { Model } from 'mongoose';
    
    @Injectable()
    export class TodoService extends AbstractMongooseService<Todo> {
        constructor(@InjectModel('todo') private readonly _todoModel: Model<Todo>) {
            super(_todoModel);
        }
    }

    Use @InjectModel() from @nestjs/mongoose to inject your MongooseModel and pass that to the abstract constructor.

  4. Create your Controller with abstractControllerFactory

    import { Controller } from '@nestjs/common';
    import { abstractControllerFactory } from 'nest-abstract';
    import { Todo } from './todo.model';
    import { TodoService } from './todo.service';
    
    const BaseController = abstractControllerFactory<Todo>({model: TodoService.model});
    
    @Controller('todo')
    export class TodoController extends BaseController {
        constructor(private readonly _todoService: TodoService) {
            super(_todoService);
        }
    }
  5. Make sure you put your Service in providers array in Module and your Controller in controllers array in Module.

    Now your TodoController should have 5 pre-defined route handlers: find, findById, create, update and delete

With Authentication

To enable Authenticate on your Controllers with Passport, abstractControllerWithAuth.

You need to install passport and @nestjs/passport if you want to enable Authentication.

import { abstractControllerWithAuth } from 'nest-abstract';

const BaseController = abstractControllerWithAuth<Todo>({model: TodoService.model});

By default, auth is enabled by on all 5 CRUDs operations.

With Swagger

To enable Swagger on your Controller, use abstractControllerWithSwagger.

Authentication is "mandatory" with Swagger so you will have to have: passport, @nestjs/passport and @nestjs/swagger installed. By default, auth is enabled by on all 5 CRUDs operations. If you wish to use abstractControllerWithSwagger without auth, please pass in an object of type DefaultAuthObj and set all the properties to false.

Plans

  • [x] Might break abstractControllerFactory out to 3 separate factories: normal, swagger and withAuth
  • Supports Serialization (https://docs.nestjs.com/techniques/serialization)?
  • anything?

Credit

  • @rcanessa89 and his/her repository: https://github.com/rcanessa89/nest-js-starter. rcanessa89 first raised an issue regarding a BaseController on my nest-mean repository and came up with his/her BaseController.