# custom-resource

> A schematic for generating NestJS resources with hexagonal architecture and vertical slices

Latest version **1.0.4** (published 2024-05-25) · MIT license · 0 weekly downloads

## Install

```sh
npm install custom-resource
pnpm add custom-resource
yarn add custom-resource
bun add custom-resource
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.0.4 |
| Published | 2024-05-25 |
| First published | 2024-05-24 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 5 |
| Unpacked size | 93.3 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | Jota-Skoll |
| Maintainers | jota-skoll |
| Keywords | schematics, nestjs, generator, module, hexagonal architecture, vertical slices |

## Links

- npm: https://www.npmjs.com/package/custom-resource
- npm.io page: https://npm.io/package/custom-resource

## Dependencies (5)

- [ts-morph](https://npm.io/package/ts-morph.md) ^22.0.0
- [typescript](https://npm.io/package/typescript.md) ^5.4.5
- [@schematics/angular](https://npm.io/package/@schematics/angular.md) ^18.0.1
- [@angular-devkit/core](https://npm.io/package/@angular-devkit/core.md) ^18.0.1
- [@angular-devkit/schematics](https://npm.io/package/@angular-devkit/schematics.md) ^18.0.1

## Alternatives

- [postcss-color-hex-alpha](https://npm.io/package/postcss-color-hex-alpha.md) — 6.4M weekly downloads
- [randomcolor](https://npm.io/package/randomcolor.md) — 348.0K weekly downloads
- [bows](https://npm.io/package/bows.md) — 1.3K weekly downloads
- [ep_prefer_color_scheme](https://npm.io/package/ep_prefer_color_scheme.md) — 260 weekly downloads
- [coc-yank](https://npm.io/package/coc-yank.md) — 61 weekly downloads

## Recent versions

- 1.0.4 (latest) — 2024-05-25
- 1.0.3 — 2024-05-25
- 1.0.2 — 2024-05-25
- 1.0.1 — 2024-05-25
- 1.0.0 — 2024-05-25
- 0.0.5 — 2024-05-25
- 0.0.4 — 2024-05-25
- 0.0.3 — 2024-05-25
- 0.0.2 — 2024-05-25
- 0.0.1 — 2024-05-24

## README

# 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:

```bash
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:

```bash
schematics custom-resource:shared-setup
```

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

```bash
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:

```bash
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:

```bash
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:

```bash
RUN: npx prisma init
```
```bash
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?
}
```
```bash
RUN: npx prisma generate
```

## Shared folder structure

The shared folder structure will include the following files:

```bash
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:

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

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

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

## Example
To generate a resource named report:
```bash
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:

```bash
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.

---
_Source: https://npm.io/package/custom-resource · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
