chore: switch to zod for schema validation
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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;
|
||||
|
||||
15
yarn.lock
15
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==
|
||||
|
||||
Reference in New Issue
Block a user