importFastifyfrom"fastify";import{serializerCompiler,validatorCompiler,ZodTypeProvider}from"fastify-type-provider-zod";importzfrom"zod";constapp=Fastify()// Add schema validator and serializerapp.setValidatorCompiler(validatorCompiler);app.setSerializerCompiler(serializerCompiler);app.withTypeProvider<ZodTypeProvider>().route({method: "GET",url: "/",// Define your schemaschema: {querystring: z.object({name: z.string().min(4),}),response: {200: z.string(),},},handler: (req,res)=>{res.send(req.query.name);},});app.listen({port: 4949});
How to use together with @fastify/swagger
importfastifyfrom'fastify';importfastifySwaggerfrom'@fastify/swagger';importfastifySwaggerUIfrom'@fastify/swagger-ui';import{z}from'zod';import{jsonSchemaTransform,createJsonSchemaTransform,serializerCompiler,validatorCompiler,ZodTypeProvider,}from'fastify-type-provider-zod';constapp=fastify();app.setValidatorCompiler(validatorCompiler);app.setSerializerCompiler(serializerCompiler);app.register(fastifySwagger,{openapi: {info: {title: 'SampleApi',description: 'Sample backend service',version: '1.0.0',},servers: [],},transform: jsonSchemaTransform,// You can also create transform with custom skiplist of endpoints that should not be included in the specification://// transform: createJsonSchemaTransform({// skipList: [ '/documentation/static/*' ]// })});app.register(fastifySwaggerUI,{routePrefix: '/documentation',});constLOGIN_SCHEMA=z.object({username: z.string().max(32).describe('Some description for username'),password: z.string().max(32),});app.after(()=>{app.withTypeProvider<ZodTypeProvider>().route({method: 'POST',url: '/login',schema: {body: LOGIN_SCHEMA},handler: (req,res)=>{res.send('ok');},});});asyncfunctionrun(){awaitapp.ready();awaitapp.listen({port: 4949,});console.log(`Documentation running at http://localhost:4949/documentation`);}run();