UNPKG

nestjs-typebox

Version:

This library provides helper utilities for writing and validating NestJS APIs using [TypeBox](https://github.com/sinclairzx81/typebox) as an alternative to class-validator/class-transformer. It also includes a patch for @nestjs/swagger allowing OpenAPI ge

119 lines (84 loc) 3.3 kB
# nestjs-typebox This library provides helper utilities for writing and validating NestJS APIs using [TypeBox](https://github.com/sinclairzx81/typebox) as an alternative to class-validator/class-transformer. It also includes a patch for @nestjs/swagger allowing OpenAPI generation to continue working. ```sh npm i nestjs-typebox ``` ## Usage ### 1. Apply patches, install global interceptor and pipe ```ts // main.ts import { Reflector } from '@nestjs/core'; import { patchNestJsSwagger, applyFormats, TypeboxValidationPipe, TypeboxTransformInterceptor } from 'nestjs-typebox'; // provide swagger OpenAPI generator support patchNestJsSwagger(); // provide custom JSON schema string format support // currently only "email". applyFormats(); async function bootstrap() { const app = await NestFactory.create(AppModule); // NOTE: registering global pipes/interceptors via app.module.ts is preferred // The following is included here for brevity: // provides request validation app.useGlobalPipes(new TypeboxValidationPipe()); // provides response validation and transformation app.useGlobalInterceptors(new TypeboxTransformInterceptor(app.get(Reflector))); await app.listen(3000); console.log(`Application is running on: ${await app.getUrl()}`); } bootstrap(); ``` ### 2. Create TypeBox schema ```ts import { Type } from '@sinclair/typebox'; export const CatSchema = Type.Object({ id: Type.Number({ description: 'The unique identifier', examples: [42], }), name: Type.String({ description: 'The name of the cat.', examples: ['Figaro'], }), type: Type.Union([Type.Literal('tabby'), Type.Literal('short-hair'), Type.Literal('maine-coon'), Type.Literal('siamese')]), }); ``` ### 3. Create DTOs ```ts import { Type } from '@sinclair/typebox'; import { createTypeboxDto } from 'nestjs-typebox'; export class CatParamsDto extends createTypeboxDto(Type.Pick(CatSchema, ['id']), { coerceTypes: true }) {} export class CatCreateDto extends createTypeboxDto(Type.Omit(CatSchema, ['id'])) {} export class CatUpdateDto extends createTypeboxDto(Type.Partial(Type.Omit(CatSchema, ['id', 'type']))) {} export class CatResponseDto extends createTypeboxDto(CatSchema) {} ``` ### 4. Reference DTOs in Controller Methods ```ts import { Params } from 'nestjs-typebox'; @Controller('cats') export class CatController { constructor(private catService: CatService) {} @Get() async getCats(): Promise<CatResponseDto[]> { return this.catService.getCats(); } @Get(':id') async getCat(@Params() params: CatParamsDto): Promise<CatResponseDto> { return this.catService.getCat(params.id); } @Post() async createCat(@Body() data: CatCreateDto): Promise<CatResponseDto> { return this.catService.createCat(data); } @Patch(':id') async updateCat(@Params() params: CatParamsDto, @Body() data: CatUpdateDto): Promise<CatResponseDto> { return this.catService.updateCat(params.id, data); } @Delete(':id) async deleteCat(@Params() params: CatParamsDto): Promise<CatResponseDto> { return this.catService.deleteCat(params.id); } } ``` ### Credits Swagger patch derived from https://github.com/risenforces/nestjs-zod