@naturalcycles/js-lib
Version:
Standard library for universal (browser + Node.js) javascript
53 lines (52 loc) • 1.62 kB
JavaScript
import { ZodError } from 'zod';
import { _stringify } from '../string/stringify';
export function zIsValid(value, schema) {
const { success } = schema.safeParse(value);
return success;
}
export function zValidate(value, schema) {
const r = zSafeValidate(value, schema);
if (r.success) {
return r.data;
}
throw r.error;
}
export function zSafeValidate(value, schema) {
const r = schema.safeParse(value);
if (r.success) {
return r;
}
return {
success: false,
error: new ZodValidationError(r.error.issues, value, schema),
};
}
export class ZodValidationError extends ZodError {
constructor(issues, value, schema) {
super(issues);
this.value = value;
this.schema = schema;
}
get message() {
return this.annotate();
}
annotate() {
let objectTitle = this.schema.description;
if (typeof this.value === 'object' && this.value) {
const objectName = this.schema.description || this.value.constructor?.name;
const objectId = this.value['id'];
objectTitle = [objectName, objectId].filter(Boolean).join('.');
}
objectTitle || (objectTitle = 'data');
return [
`Invalid ${objectTitle}`,
'',
'Input:',
_stringify(this.value),
this.issues.length > 1 ? `\n${this.issues.length} issues:` : '',
...this.issues.slice(0, 100).map(i => {
return [i.path.join('.'), i.message].filter(Boolean).join(': ');
}),
].join('\n');
}
}