0.3.0 • Published 4 months ago

@qte/nest-border-patrol v0.3.0

Weekly downloads
-
License
MIT
Repository
-
Last release
4 months ago

Nest Border Patrol

A package for validating NestJS HTTP controller endpoints using zod. Integrates with NestJS swagger.

Getting started

Install the package:

npm i @qte/nest-border-patrol
yarn add @qte/nest-border-patrol
pnpm add @qte/nest-border-patrol

You also will need the following dependencies if you haven't installed them already

  • @nestjs/common
  • @nestjs/swagger
  • rxjs
  • zod

Usage

Create a new HttpBorder(options) instance. Options are the following

  • requestBody (optional) - Any Zod schema
  • parameters (optional)
    • path (optional) - A string record of Zod schemas where the key is the name of your URL parameters
    • query (optional) - A string record of Zod schemas
  • responses - A record with keys of HttpStatus and values of any zod schema

To make use of the newly created HttpBorder you decorate your controller endpoint with the @UseHttpBorder() decorator. This will in turn validate the incoming request and outgoing responses with the supplied schemas in the HttpBorder constructor.

The @UseHttpBorder() decorator will also decorate your controller method with matching @nestjs/swagger decorators for generating OpenAPI schemas.

Example

import { Body, Controller, HttpStatus, Param, Post, Query } from '@nestjs/common';
import { z } from 'zod';
import {
  HttpBorder,
  InferFromHttpBorder
} from '@qte/nest-border-patrol';

// Create a border
const border = new HttpBorder({
  requestBody: z.object({
    name: z.string(),
  }),
  parameters: {
    path:  {
      someParam: z.string(),
    },
    query: {
      someQueryParam: z.string().optional(),
    },
  }
  responses: {
    [HttpStatus.CREATED]: z.object({
      publicData: z.string(),
    }),
  }
});

@Controller()
export class SampleController {
  @Post('/:someParam')
  @UseBorder(border)
  public async post(
    // Will be typed as:
    //  { name: string }
    @Body() body: InferFromHttpBorder<typeof border, 'requestBody'>,
    // Will be typed as:
    // { someQueryParam: string | undefined; }
    @Query() query: InferFromHttpBorder<typeof border, 'queryParameters'>,
    // Will be typed as:
    // { someParam: string; }
    @Param() params: InferFromHttpBorder<typeof border, 'pathParameters'>
  ): // Will be typed as:
  // HttpBorderResponse<HttpStatus.CREATED, { publicData: string; }>
  Promise<InferFromHttpBorder<typeof border, 'response'>> {
    return border.createResponse(HttpStatus.CREATED, {
      publicData: 'Hello world',
      // This property will stripped from the response as
      // it is not defined in the response schema.
      sensitiveData: 'password',
    });
  }
}

Versioning

Until the package reaches 1.0.0 all updates may be breaking.

Potential roadmap

  • Validating headers incoming and outgoing
  • OpenAPI example values
  • Test typings using // @ts-expect-error
  • Validate query params as an object (OpenAPI issues)
  • Validate unnamed query params
0.3.0

4 months ago

0.2.5

5 months ago

0.1.0

10 months ago

0.2.1

9 months ago

0.1.2

10 months ago

0.2.0

9 months ago

0.1.1

10 months ago

0.3.0-alpha.2

9 months ago

0.0.9

10 months ago

0.3.0-alpha.3

9 months ago

0.3.0-alpha.4

9 months ago

0.2.3

9 months ago

0.2.2

9 months ago

0.3.0-alpha.0

9 months ago

0.3.0-alpha.1

9 months ago

0.2.4

9 months ago

0.0.8

1 year ago

0.0.7

1 year ago

0.0.6

1 year ago

0.0.5

1 year ago

0.0.4

1 year ago

0.0.3

1 year ago

0.0.2

1 year ago

0.0.1

1 year ago