From ce84aa497f320b32d305ff59175f81a1bfbc1257 Mon Sep 17 00:00:00 2001 From: Riccardo Date: Wed, 30 Aug 2023 21:18:34 +0200 Subject: [PATCH] chore: switch to zod for schema validation --- package.json | 7 ++++--- src/server/server.ts | 24 ++++++++++++------------ yarn.lock | 15 ++++++++++----- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index 5214c7b..9ef38fb 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "lint": "eslint --ext .ts . --fix", "typecheck": "tsc --noEmit", "format": "prettier --config .prettierrc 'src/**/*.ts' --write", - "test": "jest --runInBand", + "test": "jest --runInBand --detectOpenHandles", "prepare": "husky install", "db:generate": "prisma generate", "db:migrate": "prisma migrate deploy", @@ -33,10 +33,11 @@ "cors": "^2.8.5", "express": "^4.18.2", "helmet": "^7.0.0", - "jsonschema": "^1.4.1", "prisma": "^5.1.1", "winston": "^3.10.0", - "winston-daily-rotate-file": "^4.7.1" + "winston-daily-rotate-file": "^4.7.1", + "zod": "^3.22.2", + "zod-validation-error": "^1.5.0" }, "devDependencies": { "@commitlint/cli": "^17.6.6", diff --git a/src/server/server.ts b/src/server/server.ts index 0d7b1bb..ab6078a 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -2,7 +2,8 @@ import * as bodyParser from 'body-parser'; import cors from 'cors'; import express, { Request, Response } from 'express'; import helmet from 'helmet'; -import { Validator } from 'jsonschema'; +import { z } from 'zod'; +import { fromZodError } from 'zod-validation-error'; import { addition } from '../utils/addition'; import { logger } from '../utils/logger'; @@ -12,20 +13,19 @@ server.use(express.json()); server.use(bodyParser.json()); server.use(helmet()); -const validator = new Validator(); -const schema = { - id: '/PostRequest', - type: 'object', - properties: { - value: { type: 'number' } - }, - required: ['value'] -}; +const schema = z.object({ + value: z.number() +}); server.post('/', async (req: Request, res: Response) => { logger.info(`POST / with ${JSON.stringify(req.body)}`); - if (!validator.validate(req.body, schema).valid) { - return res.status(400).json({ message: 'Malformed query parameters' }); + + try { + schema.parse(req.body); + } catch (err) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const validationError = fromZodError(err as any); + return res.status(400).json({ message: validationError.message }); } const { value } = req.body; diff --git a/yarn.lock b/yarn.lock index 78a3190..15b3c38 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3318,11 +3318,6 @@ jsonparse@^1.2.0: resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== -jsonschema@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" - integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== - kind-of@^6.0.3: version "6.0.3" resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" @@ -4902,3 +4897,13 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod-validation-error@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/zod-validation-error/-/zod-validation-error-1.5.0.tgz#2b355007a1c3b7fb04fa476bfad4e7b3fd5491e3" + integrity sha512-/7eFkAI4qV0tcxMBB/3+d2c1P6jzzZYdYSlBuAklzMuCrJu5bzJfHS0yVAS87dRHVlhftd6RFJDIvv03JgkSbw== + +zod@^3.22.2: + version "3.22.2" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.2.tgz#3add8c682b7077c05ac6f979fea6998b573e157b" + integrity sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg==