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.
- 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
andGlobalErrorExceptionFilter
to theapp.module.ts
providers and exports arrays.
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"
}
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
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 !
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
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
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
To generate a resource named report:
schematics custom-resource:custom-resource --name=report
or
npm run generate:resources -- --name=report
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
This project is licensed under the MIT License.