UNPKG

structured-elements

Version:

A TypeScript package for modelling and validating data

180 lines 6.56 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateElement = void 0; const elementPath_1 = require("../build/elementPath"); const failureReport_1 = require("../build/failureReport"); const referencedValidator_1 = require("../ensure/referencedValidator"); const array_1 = require("../is/array"); const date_1 = require("../is/date"); const recordSchema_1 = require("../is/recordSchema"); const referenceContainer_1 = require("../is/referenceContainer"); const stringKeyedRecord_1 = require("../is/stringKeyedRecord"); // This function validates an element against an expectation. const validateElement = ({ api, element, expectation, key, subject, subjectName, elementName = (0, elementPath_1.buildElementPath)({ key, path: subjectName }), }) => { const failures = []; const expectations = (0, array_1.isArray)(expectation) ? expectation : [expectation]; const elementValid = expectations.some((possibility) => { if (typeof possibility === `function`) { if (possibility(element) === true) { return true; } failures.push({ element, expectation: possibility, key, name: elementName, reason: `${key}: functional expectation did not return true.`, subject, }); return false; } if (typeof possibility === `string`) { const model = api.registeredModels().get(possibility); if (model) { const modelValidator = model.validators()[`item`]; const modelFailures = modelValidator.getFailures(element, elementName); if (modelValidator.isValid(element, elementName)) { return true; } failures.push({ element, expectation, failures: modelFailures, key, name: elementName, reason: (0, failureReport_1.buildFailureReport)({ api, element, expectation, failures: modelFailures, path: key.toString(), }), subject, }); return false; } if (possibility === `date`) { if ((0, date_1.isDate)(element)) { return true; } failures.push({ element, expectation, key, name: elementName, reason: `${key}: expected a Date, got ${typeof element}`, subject, }); return false; } if (typeof element === possibility) { return true; } failures.push({ element, expectation, key, name: elementName, reason: `${key}: expected typeof ${possibility}, got ${typeof element}`, subject, }); return false; } if (possibility === null) { if (element === null) { return true; } failures.push({ element, expectation, key, name: elementName, reason: `${key} is not null`, subject, }); return false; } if (possibility === undefined) { if (element === undefined) { return true; } failures.push({ element, expectation, key, name: elementName, reason: `${key} is not undefined`, subject, }); return false; } if ((0, referenceContainer_1.isReferenceContainer)(api, possibility)) { const referencedValidator = (0, referencedValidator_1.ensureReferencedValidator)({ api, container: possibility, }); if (referencedValidator.isValid(element, elementName)) { return true; } const elementFailures = referencedValidator.getFailures(element, elementName); failures.push({ element, expectation, failures: elementFailures, key, name: elementName, reason: (0, failureReport_1.buildFailureReport)({ api, element, expectation, failures: elementFailures, path: key.toString(), }), subject, }); return false; } if ((0, recordSchema_1.isRecordSchema)(api, possibility)) { const recordValidator = api.validator(possibility, `item`); if (recordValidator.isValid(element, elementName)) { return true; } const recordFailures = recordValidator.getFailures(element, elementName); failures.push({ element, expectation, failures: recordFailures, key, name: elementName, reason: (0, failureReport_1.buildFailureReport)({ api, element, expectation, failures: recordFailures, path: key.toString(), }), subject, }); return false; } if (api.debugEnabled()) { api.privateFunctions.debug(`validateElement did not know how to validate subject:`, { expectations, elementName, name: subjectName, possibility, subject, }, { recordSchema: (0, recordSchema_1.isRecordSchema)(api, possibility), stringKeyedRecord: (0, stringKeyedRecord_1.isStringKeyedRecord)(possibility), }); } return false; }); if (elementValid) { return []; } return failures; }; exports.validateElement = validateElement; //# sourceMappingURL=element.js.map