UNPKG

structured-elements

Version:

A TypeScript package for modelling and validating data

105 lines 4.25 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buildCollectionValidator = void 0; const collection_1 = require("../../attemptSalvage/collection"); const validationResult_1 = require("../validationResult"); const constants_1 = require("../../constants"); const record_1 = require("../../is/record"); const stringKeyedRecord_1 = require("../../is/stringKeyedRecord"); const element_1 = require("../../validate/element"); const structure = `collection`; const buildCollectionValidator = ({ api, expectation, }) => { const validator = { getFailures: (subject, name) => { return validator.validate(subject, name).failures; }, getSalvage: (subject, name, attemptSalvage = collection_1.attemptSalvageCollection) => { return validator.validate(subject, name, attemptSalvage).salvage; }, isValid: (subject, name) => { return validator.getFailures(subject, name).length === 0; }, validate: (subject, name, attemptSalvage = collection_1.attemptSalvageCollection) => { 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 collection, but it is not.`, (0, record_1.isRecord)(subject) ? `The following keys are not strings: ${JSON.stringify(Object.keys(subject).filter((key) => { return typeof key !== `string`; }))}.` : `It has typeof: ${typeof subject}.`, ].join(` `), subject, }, ], subject, }); } const cachedResult = api.privateFunctions.getCachedResult({ expectation, structure, subject, }); if (cachedResult) { return cachedResult; } const failures = []; const validElements = {}; for (const key in subject) { if (key === constants_1.referenceToken) { failures.push({ element: subject[key], expectation, key, name, reason: `${name} contains the reserved token used to signal that it is a validation reference: '${key}'. You cannot use this key in your application data.`, subject, }); continue; } const elementFailures = (0, element_1.validateElement)({ api, element: subject[key], expectation, key, subject, subjectName: name, }); if (elementFailures.length > 0) { failures.push(...elementFailures); } else { validElements[key] = subject[key]; } } const salvage = attemptSalvage({ api, failures, name, subject, validElements, }); const result = (0, validationResult_1.buildValidationResult)({ failures, salvage, subject, }); api.privateFunctions.cacheResult({ expectation, result, structure, }); return result; }, }; return validator; }; exports.buildCollectionValidator = buildCollectionValidator; //# sourceMappingURL=collection.js.map