structured-elements
Version:
A TypeScript package for modelling and validating data
86 lines • 3.08 kB
JavaScript
;
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