UNPKG

fets

Version:

TypeScript HTTP Framework focusing on e2e type-safety, easy setup, performance & great developer experience

93 lines (92 loc) 4.58 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useZod = void 0; const server_1 = require("@whatwg-node/server"); const Response_js_1 = require("../Response.js"); const types_js_1 = require("./types.js"); function useZod() { return { onRoute({ schemas, handlers }) { if (schemas) { const validationMiddlewares = new Map(); const requestSchemas = schemas.request; if (requestSchemas) { if ((0, types_js_1.isZodSchema)(requestSchemas.headers)) { const headersSchema = requestSchemas.headers; validationMiddlewares.set('headers', request => { const headersObj = (0, server_1.getHeadersObj)(request.headers); const result = headersSchema.safeParse(headersObj); if (!result.success) { return result.error.issues; } return []; }); } if ((0, types_js_1.isZodSchema)(requestSchemas.params)) { const paramsSchema = requestSchemas.params; validationMiddlewares.set('params', request => { const result = paramsSchema.safeParse(request.params); if (!result.success) { return result.error.issues; } return []; }); } if ((0, types_js_1.isZodSchema)(requestSchemas.query)) { const querySchema = requestSchemas.query; validationMiddlewares.set('query', request => { const result = querySchema.safeParse(request.query); if (!result.success) { return result.error.issues; } return []; }); } if ((0, types_js_1.isZodSchema)(requestSchemas.json)) { const jsonSchema = requestSchemas.json; validationMiddlewares.set('json', async (request) => { const contentType = request.headers.get('content-type'); if (contentType?.includes('json')) { const jsonObj = await request.json(); Object.defineProperty(request, 'json', { value: async () => jsonObj, configurable: true, }); const result = jsonSchema.safeParse(jsonObj); if (!result.success) { return result.error.issues; } } return []; }); } if (validationMiddlewares.size > 0) { handlers.unshift(async (request) => { const validationErrorsNonFlat = await Promise.all([...validationMiddlewares.entries()].map(async ([name, fn]) => { const errors = await fn(request); if (errors.length > 0) { return errors.map(error => ({ name, ...error, })); } })); const validationErrors = validationErrorsNonFlat.flat().filter(Boolean); if (validationErrors.length > 0) { return Response_js_1.Response.json({ errors: validationErrors, }, { status: 400, headers: { 'x-error-type': 'validation', }, }); } }); } } } }, }; } exports.useZod = useZod;