@nahkies/typescript-koa-runtime
Version:
Runtime package for code generated by @nahkies/openapi-code-generator using the typescript-koa template
84 lines (69 loc) • 2.18 kB
text/typescript
import type {Schema as JoiSchema} from "joi"
import {KoaRuntimeError, type RequestInputType} from "./errors"
/** @deprecated: update and re-generate to import from @nahkies/typescript-koa-runtime/server directly */
export type {Params} from "./server"
// Note: joi types don't appear to have an equivalent of z.infer,
// hence any seems about as good as we can do here.
export function parseRequestInput<Schema extends JoiSchema>(
schema: Schema,
input: unknown,
type: RequestInputType,
// biome-ignore lint/suspicious/noExplicitAny: needed
): any
export function parseRequestInput(
schema: undefined,
input: unknown,
type: RequestInputType,
): undefined
export function parseRequestInput<Schema extends JoiSchema>(
schema: Schema | undefined,
input: unknown,
type: RequestInputType,
// biome-ignore lint/suspicious/noExplicitAny: needed
): any {
try {
if (!schema) {
return undefined
}
const result = schema.validate(input, {stripUnknown: true})
if (result.error) {
throw result.error
}
return result.value
} catch (err) {
throw KoaRuntimeError.RequestError(err, type)
}
}
export function responseValidationFactory(
possibleResponses: [string, JoiSchema][],
defaultResponse?: JoiSchema,
) {
// 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 {
for (const [match, schema] of possibleResponses) {
const isMatch =
(/^\d+$/.test(match) && String(status) === match) ||
(/^\d[xX]{2}$/.test(match) && String(status)[0] === match[0])
if (isMatch) {
const result = schema.validate(value)
if (result.error) {
throw result.error
}
return result.value
}
}
if (defaultResponse) {
const result = defaultResponse.validate(value)
if (result.error) {
throw result.error
}
return result.value
}
return value
} catch (err) {
throw KoaRuntimeError.ResponseError(err)
}
}
}