@nahkies/typescript-koa-runtime
Version:
Runtime package for code generated by @nahkies/openapi-code-generator using the typescript-koa template
55 lines (47 loc) • 1.45 kB
text/typescript
import {findMatchingSchema} from "@nahkies/typescript-common-runtime/validation"
import type {z} from "zod/v4"
import {KoaRuntimeError, type RequestInputType} from "./errors.ts"
export function parseRequestInput<Schema extends z.ZodTypeAny>(
schema: Schema,
input: unknown,
type: RequestInputType,
): z.infer<Schema>
export function parseRequestInput(
schema: undefined,
input: unknown,
type: RequestInputType,
): undefined
export function parseRequestInput<Schema extends z.ZodTypeAny>(
schema: Schema | undefined,
input: unknown,
type: RequestInputType,
): z.infer<Schema> | undefined {
try {
return schema?.parse(input)
} catch (err) {
throw KoaRuntimeError.RequestError(err, type)
}
}
// TODO: optional response validation
export function responseValidationFactory(
possibleResponses: [string, z.ZodTypeAny][],
defaultResponse?: z.ZodTypeAny,
) {
// Exploit the natural ordering matching the desired specificity of eg: 404 vs 4xx
possibleResponses.sort((x, y) => (x[0] < y[0] ? -1 : 1))
return (status: number, value: unknown) => {
try {
const schema = findMatchingSchema(status, possibleResponses)
if (schema) {
return schema.parse(value)
}
if (defaultResponse) {
return defaultResponse.parse(value)
}
// TODO: throw on unmatched response
return value
} catch (err) {
throw KoaRuntimeError.ResponseError(err)
}
}
}