react-indexeddb-kit
Version:
A TypeScript-based React IndexedDB wrapper with CRUD operations.
49 lines (48 loc) • 2.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateData = validateData;
const errors_1 = require("../../errors");
function validateData(data, modelDef, schema) {
const validatedData = {};
Object.entries(modelDef.fields).forEach(([fieldName, definition]) => {
const fieldValue = data[fieldName];
// Check if the field is required and the value is undefined
if (definition.required && fieldValue === undefined) {
throw new errors_1.ValidationError(`Field '${fieldName}' is required`);
}
// If the field has a default value and is missing, set the default
if (fieldValue === undefined && definition.default !== undefined) {
validatedData[fieldName] = definition.default;
return;
}
// Complex type checks for 'array' and 'object'
if (fieldValue !== undefined) {
if (definition.type === "array" && !Array.isArray(fieldValue)) {
throw new errors_1.ValidationError(`Field '${fieldName}' must be an array`);
}
if (definition.type === "object" && typeof fieldValue !== "object") {
throw new errors_1.ValidationError(`Field '${fieldName}' must be an object`);
}
// Check for 'date' type
if (definition.type === "date" && !(fieldValue instanceof Date)) {
throw new errors_1.ValidationError(`Field '${fieldName}' must be a Date`);
}
// Check basic types
if (definition.type !== "array" &&
definition.type !== "object" &&
definition.type !== "date" &&
typeof fieldValue !== definition.type) {
throw new errors_1.ValidationError(`Field '${fieldName}' must be of type ${definition.type}`);
}
// If the field passes validation, include it in validated data
validatedData[fieldName] = fieldValue;
}
});
// Prevent extra fields that are not part of the model
Object.keys(data).forEach((key) => {
if (!modelDef.fields[key]) {
throw new errors_1.ValidationError(`Field '${key}' is not defined in the schema`);
}
});
return validatedData;
}