import { z, toJSONSchema } from 'zod' export type ValidateCallback> = (_z: typeof z) => { [K in keyof T]: T[K] } export type ValidateCallbackOutputs< T extends ValidateCallback, R = ReturnType > = { [K in keyof R]: R[K] extends z.ZodTypeAny ? z.infer : R[K] } export function definedValidateSchema>(cb: T): T { return cb } export function validate< T extends ValidateCallback, R = ReturnType >(target: any, schemaCallback: T) { return z.object(schemaCallback(z)).parse(target || {}) as { [K in keyof R]: R[K] extends z.ZodTypeAny ? z.infer : R[K] } } export function validateToJsonSchema>(target: () => T) { const schema = toJSONSchema(z.object(target())) delete schema.$schema return schema }