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