import Ajv, { ErrorObject } from 'ajv' import { TFunction } from 'next-i18next' export class AjvInvalidMessageError extends Error { public errors: ErrorObject, unknown>[] constructor( errors: ErrorObject, unknown>[], t?: TFunction ) { console.error('AJV:', errors) super( (t?.('error.invalidMessage') ?? 'Invalid message') + ': ' + errors .map( ({ instancePath, message }) => instancePath && message && `${instancePath} ${message}` ) .filter(Boolean)[0] ) this.name = 'InvalidMessageError' this.errors = errors } } export const makeValidateMsg = ( schema: Record, t?: TFunction ) => { const ajv = new Ajv() const validate = ajv.compile(schema) return (msg: T) => { if (!validate(msg)) { throw new AjvInvalidMessageError(validate.errors ?? [], t) } } }