@forestadmin/datasource-toolkit
Version:
75 lines • 7.71 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const rules_1 = require("./rules");
const type_getter_1 = __importDefault(require("./type-getter"));
const errors_1 = require("../errors");
const index_1 = require("../index");
class FieldValidator {
static validate(collection, field, values) {
const dotIndex = field.indexOf(':');
if (dotIndex === -1) {
const schema = index_1.SchemaUtils.getField(collection.schema, field, collection.name);
if (schema.type !== 'Column') {
throw new errors_1.ValidationError(`Unexpected field type: '${collection.name}.${field}' ` +
`(found '${schema.type}' expected '${'Column'}')`);
}
if (values !== undefined) {
values.forEach(value => FieldValidator.validateValue(field, schema, value));
}
}
else {
const prefix = field.substring(0, dotIndex);
const schema = collection.schema.fields[prefix];
if (!schema) {
throw new errors_1.MissingRelationError({
collectionName: collection.name,
fieldName: prefix,
availableFields: Object.keys(collection.schema.fields).filter(name => collection.schema.fields[name].type === 'ManyToOne' ||
collection.schema.fields[name].type === 'OneToOne'),
});
}
if (schema.type !== 'ManyToOne' && schema.type !== 'OneToOne') {
throw new errors_1.ValidationError(`Unexpected field type: '${collection.name}.${prefix}' (found ` +
`'${schema.type}' expected '${'ManyToOne'}' or '${'OneToOne'}')`);
}
const suffix = field.substring(dotIndex + 1);
const association = collection.dataSource.getCollection(schema.foreignCollection);
FieldValidator.validate(association, suffix, values);
}
}
static validateValueForId(field, schema, value) {
FieldValidator.validateValue(field, schema, value, [schema.columnType]);
}
static validateValue(field, schema, value, allowedTypes = rules_1.MAP_ALLOWED_TYPES_FOR_COLUMN_TYPE[schema.columnType]) {
// FIXME: handle complex type from ColumnType
if (typeof schema.columnType !== 'string') {
return;
}
const type = type_getter_1.default.get(value, schema.columnType);
if (!allowedTypes?.includes(type)) {
throw new errors_1.ValidationError(`The given value has a wrong type for "${field}": ${value}.\n Expects ${JSON.stringify(allowedTypes).slice(1, -1)}`);
}
if (value && schema.columnType === 'Enum') {
FieldValidator.checkEnumValue(schema, value);
}
}
static checkEnumValue(columnSchema, enumValue) {
const isEnumAllowed = columnSchema.enumValues.includes(enumValue);
if (!isEnumAllowed) {
throw new errors_1.ValidationError(`The given enum value(s) ${enumValue} is not listed in [${columnSchema.enumValues}]`);
}
}
static validateName(collectionName, name) {
if (/ /.test(name)) {
const sanitizedName = name.replace(/ (.)/g, (_, s) => s.toUpperCase());
throw new Error(`The name of field '${name}' you configured on` +
` '${collectionName}' must not contain space.` +
` Something like '${sanitizedName}' should work has expected.`);
}
}
}
exports.default = FieldValidator;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdmFsaWRhdGlvbi9maWVsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUE0RDtBQUM1RCxnRUFBdUM7QUFDdkMsc0NBQWtFO0FBQ2xFLG9DQUF1QztBQUl2QyxNQUFxQixjQUFjO0lBQ2pDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBc0IsRUFBRSxLQUFhLEVBQUUsTUFBa0I7UUFDdkUsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVwQyxJQUFJLFFBQVEsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNuQixNQUFNLE1BQU0sR0FBRyxtQkFBVyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFL0UsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDNUIsTUFBTSxJQUFJLHdCQUFlLENBQ3ZCLDJCQUEyQixVQUFVLENBQUMsSUFBSSxJQUFJLEtBQUssSUFBSTtvQkFDckQsV0FBVyxNQUFNLENBQUMsSUFBSSxlQUFlLFFBQVEsSUFBSSxDQUNwRCxDQUFDO2FBQ0g7WUFFRCxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7Z0JBQ3hCLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUM3RTtTQUNGO2FBQU07WUFDTCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUM1QyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVoRCxJQUFJLENBQUMsTUFB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
;