object-shape-tester
Version:
Test object properties and value types.
38 lines (37 loc) • 1.27 kB
JavaScript
import { check } from '@augment-vir/assert';
import { combineErrorMessages, indent } from '@augment-vir/common';
/**
* This error is thrown when a shape assertion fails.
*
* @category Internal
*/
export class ShapeMismatchError extends TypeError {
value;
errors;
failureMessage;
name = 'ShapeMismatchError';
constructor(value, errors, failureMessage) {
const errorMessages = errors.map((error) => createErrorMessage(error)).join('\n');
const message = combineErrorMessages(failureMessage, `Shape mismatch:\n${indent(errorMessages, 1)}`);
super(message);
this.value = value;
this.errors = errors;
this.failureMessage = failureMessage;
}
}
function getSubErrors(error) {
return error.errors.flatMap((nestedErrors) => Array.from(nestedErrors));
}
function createErrorMessage(error, indentCount = 0) {
const subErrorMessages = getSubErrors(error).map((subError) => createErrorMessage(subError, indentCount + 1));
const currentMessage = [
error.path,
error.message,
]
.filter(check.isTruthy)
.join(': ') + (subErrorMessages.length ? ':' : '');
return [
indent(currentMessage, indentCount),
...subErrorMessages,
].join('\n');
}