From c374f6cf13e0dd3dcf6061290a4cad959e189308 Mon Sep 17 00:00:00 2001 From: Tomas Kallup Date: Sun, 5 May 2024 21:50:37 +0200 Subject: [PATCH] Add types to ZodContext.invalid --- src/types.ts | 14 +++++++------- src/validation-middleware.ts | 34 +++++++++++++++++++--------------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/types.ts b/src/types.ts index c30ef53..3126c11 100644 --- a/src/types.ts +++ b/src/types.ts @@ -41,12 +41,12 @@ export type Method = | 'unlock' | 'unsubscribe'; -export interface ZodRouterInvalid { - body?: ZodError; - headers?: ZodError; - params?: ZodError; - query?: ZodError; - files?: ZodError; +export interface ZodRouterInvalid { + body?: ZodError; + headers?: ZodError; + params?: ZodError; + query?: ZodError; + files?: ZodError; error?: boolean; } @@ -63,7 +63,7 @@ export interface ZodContext extends Context query: Query; files: Files; } & Request; - invalid: ZodRouterInvalid; + invalid: ZodRouterInvalid; } export type ValidationOptions = { diff --git a/src/validation-middleware.ts b/src/validation-middleware.ts index bd8ccba..d4f99bb 100644 --- a/src/validation-middleware.ts +++ b/src/validation-middleware.ts @@ -1,6 +1,6 @@ import { DefaultContext, Next } from 'koa'; import { ZodError, ZodTypeAny } from 'zod'; -import { ValidationOptions, RouterOpts, ZodRouterInvalid, ZodValidationError } from './types'; +import { ValidationOptions, RouterOpts, ZodValidationError, ZodRouterInvalid } from './types'; import { assertValidation, assertZodValidationError, noopMiddleware } from './util'; class ValidationError extends Error { @@ -23,7 +23,7 @@ const validate = async ( return { requestParameter, error: parsed.error, - }; + } as ZodValidationError; } return parsed.data; @@ -47,19 +47,23 @@ export const validationMiddleware = ( return async (ctx: DefaultContext, next: Next) => { const validated = await Promise.all([ - validate(ctx.request.headers, validation.headers, 'headers'), - validate(ctx.request.params, validation.params, 'params'), - validate(ctx.request.query, validation.query, 'query'), - validate(ctx.request.body, validation.body, 'body'), - validate(ctx.request.files, validation.files, 'files'), + validate(ctx.request.headers, validation.headers, 'headers'), + validate

(ctx.request.params, validation.params, 'params'), + validate(ctx.request.query, validation.query, 'query'), + validate(ctx.request.body, validation.body, 'body'), + validate(ctx.request.files, validation.files, 'files'), ]); - const inputErrors = validated.reduce((acc: ZodRouterInvalid, curr) => { - if (assertZodValidationError(curr)) { - acc[curr.requestParameter] = curr.error; - } - return acc; - }, {}); + const inputErrors = validated.reduce>( + (acc, curr) => { + if (assertZodValidationError(curr)) { + (acc[curr.requestParameter] as typeof curr.error) = curr.error; + } + + return acc; + }, + { error: false }, + ); if (inputErrors.body || inputErrors.files || inputErrors.headers || inputErrors.params || inputErrors.query) { if (validation?.continueOnError || opts?.validationErrorHandler) { @@ -90,13 +94,13 @@ export const validationMiddleware = ( await next(); - const output = await validate(ctx.body, validation.response, 'response'); + const output = await validate(ctx.body, validation.response, 'response'); if (!output) { return; } - if (output.error instanceof ZodError) { + if (assertZodValidationError(output)) { if (opts?.exposeResponseErrors) { ctx.status = 500; ctx.type = 'json';