5.0.0 • Published 10 months ago

fastify-type-provider-yup v5.0.0

Weekly downloads
-
License
MIT
Repository
github
Last release
10 months ago

fastify-type-provider-yup

NPM Version CI

Getting Started

pnpm add fastify-type-provider-yup
yarn add fastify-type-provider-yup
npm i fastify-type-provider-yup
PackageVersionFastify Compatibility
pnpm add fastify-type-provider-yup@44.x4.x
pnpm add fastify-type-provider-yup@55.x5.x

How to use

See Examples folder for more details.

Register Fastify plugin:

import { yupPlugin } from 'fastify-type-provider-yup';
import fp from 'fastify-plugin';

export const example = async (fastify) => {
  fastify.register(fp(yupPlugin));
};

Manually registered with Typescript:

import Fastify from "fastify";
import {
  serializerCompiler,
  validatorCompiler,
  type YupTypeProvider
} from 'fastify-type-provider-yup';
import * as yup from yup

const server = Fastify()

server.withTypeProvider<withTypeProvider>().route({
  method: 'POST',
  url: '/',
  schema: {
    body: yup.object({
      foo: yup.string().required()
    }),
    querystring: yup.object({
      page: yup.number().default(1)
    }),
    response: {
      200: yup.string()
    }
  },
  handler: async (reques, reply) => {
    const { foo } = request.body
    const { page } = request.querystring
    return `Received ${foo} for page ${page}`
  }
})

server.listen({port: 1337, host: '0.0.0.0'})

Swagger

import fastifySwagger from '@fastify/swagger';
import fastifySwaggerUI from '@fastify/swagger-ui';
import Fastify from 'fastify';
import * as yup from 'yup';
import {
  type YupTypeProvider,
  validatorCompiler,
  serializerCompiler,
  jsonSchemaTransformer,
} from 'fastify-type-provider-yup';
import { extendSchema } from '@sodaru/yup-to-json-schema';
import { Schema, addMethod } from 'yup';

extendSchema({ addMethod, Schema });

const app = Fastify({ logger: true });
app.setValidatorCompiler(validatorCompiler);
app.setSerializerCompiler(serializerCompiler);

app.register(fastifySwagger, {
  openapi: {
    info: {
      title: 'SampleApi',
      description: 'Sample backend service',
      version: '1.0.0',
    },
    servers: [],
  },
  transform: jsonSchemaTransformer,
});

app.register(fastifySwaggerUI, {
  routePrefix: '/docs',
});

app.after(() => {
  app.withTypeProvider<YupTypeProvider>().route({
    url: '/',
    method: 'POST',
    schema: {
      description: 'Description details',
      tags: ['home'],
      body: yup.object({
        page: yup.number().default(1),
      }),
      response: {
        200: yup.object({
          page: yup.string().example('1'),
        }),
      },
    },
    handler: async (request, reply) => {
      const { page } = request.body;

      return {
        page: String(page),
      };
    },
  });
});

app.listen({ port: 8080, host: '0.0.0.0' });

Aknowledgements

Module heavilty inspired by:

Benchmarks

Run:

Go to folder /benchmarks and run the benchmark server:

node (both|serializer|validation)-(json|yup|zod).benchmark.cjs

Then run:

autocannon http://localhost:3000

Find below the results using a MacBook Pro (16-inch, Apple M1 Pro, 2021, Sonoma 14.6.1) with 16 GB of RAM.

Serializer Results (Avg.)

NameVersionReq/secLatency (ms)Bytes/secRequests
fastify-type-provider-yup0.0.565,521.46 (84.58 %)0.0112.3 MB721k req in 11.01s, 135 MB read
fastify-type-provider-zod2.0.077,119.00 (99.55 %)0.0114.5 MB805k req in 11.01 s, 151 MB read
fastify (raw)4.23.077,464.550.0114.6 MB854k req in 11.01 s, 161 MB read

Validation Results (Avg.)

NameVersionReq/secLatency (ms)Bytes/secRequests
fastify-type-provider-yup0.0.563,902.55 (89.74 %)0.0111.6 MB703k req in 11.01s, 127 MB read
fastify-type-provider-zod2.0.070,893.10 (99.56 %)0.0112.8 MB780k req in 11.01 s, 141 MB read
fastify (raw)4.23.071,207.280.0112.9 MB783k req in 11.02 s, 142 MB read

Validation And Serialization Results (Avg.)

NameVersionReq/secLatency (ms)Bytes/secRequests
fastify-type-provider-yup0.0.557,133.10 (73.38 %)0.0110.5 MB629k req in 11.01s, 115 MB read
fastify-type-provider-zod2.0.051,389.82 (66.00 %)0.019.4 MB565k req in 11.01 s, 103 MB read
fastify (raw)4.23.077,861.820.0114.2 MB856k req in 11.01 s, 157 MB read
5.0.0

10 months ago

0.0.5

12 months ago

0.0.4

2 years ago

0.0.3

2 years ago

0.0.2

2 years ago

0.0.1

2 years ago