1.0.4 • Published 1 month ago

custom-resource v1.0.4

Weekly downloads
-
License
MIT
Repository
-
Last release
1 month ago

Custom Resource Schematic

This package provides custom schematics for generating NestJS resources with a hexagonal architecture and vertical slices, as well as setting up a shared folder structure with base configuration for Prisma and global error handlers.

Features

  • Generates a NestJS resource with a predefined hexagonal architecture.
  • Creates vertical slices for each resource.
  • Automatically imports the generated module into app.module.ts.
  • Sets up a shared folder structure with predefined files for exceptions, helpers, pipes, services, and types.
  • Installs necessary dependencies and initializes Prisma with a sample schema.
  • Adds PrismaService and GlobalErrorExceptionFilter to the app.module.ts providers and exports arrays.

Installation

First, install the package:

yarn add custom-resource@latest

## add to package.json
"scripts": {
  "generate:resources": "schematics custom-resource:custom-resource",
  "setup:shared": "schematics custom-resource:shared-setup"
}

Usage

Setup Shared Folder

To set up the shared folder structure, use the following command:

schematics custom-resource:shared-setup

If you have included the command in your package.json scripts, you can also use:

npm run setup:shared

AppModule Configuration

After running yarn setup:shared, the app.module.ts file should be updated to include the following providers and exports:

import { Global, Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { APP_FILTER, APP_GUARD } from '@nestjs/core';
import { AppController } from './app.controller';
import { PrismaService } from './shared/services/prisma.service';
import { GlobalErrorExceptionFilter } from './shared/exceptions/global-error.exception';
import { AppService } from './app.service';

@Global()
@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
    }),
  ],
  controllers: [AppController],
  providers: [
    AppService,
    PrismaService,
    {
      provide: APP_FILTER,
      useClass: GlobalErrorExceptionFilter,
    },
  ],
  exports: [PrismaService],
})
export class AppModule {}

And the main.ts file should look like this:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { CustomValidationPipe } from './shared/pipes/validation.pipes';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new CustomValidationPipe());
  await app.listen(3000);
}
bootstrap();

CHECK THESE TWO FILES MENTIONED BEFORE CONTINUING !

Prisma Initialization

After running the shared-setup schematic, you can initialize Prisma with the following command and schema:

RUN: npx prisma init
datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model User {
  id    Int     @id @default(autoincrement())
  email String  @unique
  name  String?
}
RUN: npx prisma generate

Shared folder structure

The shared folder structure will include the following files:

src/
  └── shared/
      ├── exceptions/
      │   ├── global-error.exception.ts
      │   └── global-request.exception.ts
      ├── helpers/
      │   └── prisma-error.handler.ts
      ├── pipes/
      │   └── validation.pipes.ts
      ├── services/
      │   └── prisma.service.ts
      └── types/
          └── prisma-error-handler.type.ts

Generate a Resource

You can generate a new resource using the following command:

schematics custom-resource:custom-resource --name=your-resource-name

If you have included the command in your package.json scripts, you can also use:

npm run generate:resources -- --name=your-resource-name

Example

To generate a resource named report:

schematics custom-resource:custom-resource --name=report
or
npm run generate:resources -- --name=report

Generated Resource folder structure

The generated resource will follow this hexagonal architecture and vertical slices structure:

src/
  └── your-resource-name/
      ├── application/
      │   ├── your-resource-name.module.ts
      │   ├── your-resource-name.service.spec.ts
      │   └── your-resource-name.service.ts
      ├── domain/
      │   ├── constants/
      │   │   └── your-resource-name.constants.ts
      │   ├── dto/
      │   │   ├── create-your-resource-name.dto.ts
      │   │   ├── param-findAll-your-resource-name.dto.ts
      │   │   └── update-your-resource-name.dto.ts
      │   ├── entities/
      │   │   └── your-resource-name.entity.ts
      │   └── interfaces/
      │       └── your-resource-name-repository.interface.ts
      └── infrastructure/
          ├── controller/
          │   ├── your-resource-name.controller.spec.ts
          │   └── your-resource-name.controller.ts
          └── repository/
              └── your-resource-name-prisma.repository.ts

Licence

This project is licensed under the MIT License.

1.0.4

1 month ago

1.0.3

1 month ago

1.0.2

1 month ago

1.0.1

1 month ago

1.0.0

1 month ago

0.0.5

1 month ago

0.0.4

1 month ago

0.0.3

1 month ago

0.0.2

1 month ago

0.0.1

1 month ago