UNPKG

structured-elements

Version:

A TypeScript package for modelling and validating data

86 lines 3.08 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildRecordValidator = void 0; const item_1 = require("../../attemptSalvage/item"); const validationResult_1 = require("../validationResult"); const stringKeyedRecord_1 = require("../../is/stringKeyedRecord"); const element_1 = require("../../validate/element"); const structure = `item`; const buildRecordValidator = ({ api, schema, }) => { const expectation = schema; const validator = { getFailures: (subject, name) => { return validator.validate(subject, name).failures; }, getSalvage: (subject, name) => { return validator.validate(subject, name).salvage; }, isValid: (subject, name) => { return validator.validate(subject, name).valid; }, validate: (subject, name, attemptSalvage = item_1.attemptSalvageItem) => { if (!(0, stringKeyedRecord_1.isStringKeyedRecord)(subject)) { return (0, validationResult_1.buildValidationResult)({ failures: [ { element: subject, expectation, key: `(subject)`, name, reason: `${name} expected to be a string-keyed record, but it isn't. It has typeof '${typeof subject}'.`, subject, }, ], subject, }); } const cached = api.privateFunctions.getCachedResult({ expectation, structure, subject, }); if (cached) { return cached; } const failures = []; const validElements = {}; for (const key in schema) { const keyFailures = (0, element_1.validateElement)({ api, element: subject[key], expectation: schema[key], key, subject, subjectName: name, }); if (keyFailures.length === 0) { validElements[key] = subject[key]; } else { failures.push(...keyFailures); } } const salvage = attemptSalvage({ api, subject, name, failures, validElements, }); const result = (0, validationResult_1.buildValidationResult)({ failures, salvage, subject, }); api.privateFunctions.cacheResult({ expectation, result, structure, }); return result; }, }; return validator; }; exports.buildRecordValidator = buildRecordValidator; //# sourceMappingURL=record.js.map