UNPKG

@elsikora/nestjs-crud-automator

Version:

A library for automating the creation of CRUD operations in NestJS.

55 lines (51 loc) 2.97 kB
'use strict'; var constants_js = require('@nestjs/swagger/dist/constants.js'); var exception_utility = require('../error/exception.utility.js'); /** * Validates discriminator config against the DTO variants used to build Swagger and runtime transforms. * @param {TApiDiscriminatorValidateConfigProperties} properties - Discriminator validation properties. * @returns {void} */ function ApiDiscriminatorValidateConfig(properties) { const errors = []; if (!Array.isArray(properties.variants) || properties.variants.length === 0) { errors.push("type must contain at least one DTO class"); } if (!properties.variants.every((variant) => typeof variant === "function")) { errors.push("type must contain only DTO classes"); } if (!properties.discriminator.propertyName || typeof properties.discriminator.propertyName !== "string") { errors.push("discriminator.propertyName must be a non-empty string"); } if (!properties.discriminator.mapping || typeof properties.discriminator.mapping !== "object" || Object.keys(properties.discriminator.mapping).length === 0) { errors.push("discriminator.mapping must contain at least one variant"); } const mappedVariants = Object.values(properties.discriminator.mapping); const apiModelPropertiesMetadataKey = constants_js.DECORATORS.API_MODEL_PROPERTIES; for (const [key, mappedType] of Object.entries(properties.discriminator.mapping)) { if (typeof mappedType !== "function") { errors.push(`discriminator.mapping.${key} must be a DTO class`); continue; } if (!properties.variants.includes(mappedType)) { errors.push(`discriminator.mapping.${key} references DTO ${mappedType.name || "Anonymous"} that is not listed in type`); } } for (const variant of properties.variants) { if (!mappedVariants.includes(variant)) { errors.push(`type contains DTO ${variant.name || "Anonymous"} that is not referenced by discriminator.mapping`); } if (properties.shouldRequireDeclaredDiscriminatorProperty && typeof variant === "function" && typeof properties.discriminator.propertyName === "string") { const variantPrototype = variant.prototype; const hasDiscriminatorPropertyMetadata = Boolean(Reflect.getMetadata(apiModelPropertiesMetadataKey, variantPrototype, properties.discriminator.propertyName)); if (!hasDiscriminatorPropertyMetadata) { errors.push(`DTO ${variant.name || "Anonymous"} must declare discriminator property '${properties.discriminator.propertyName}'`); } } } if (errors.length > 0) { throw exception_utility.ErrorException(`${properties.context} discriminator config error: ${errors.join("\n")}`); } } exports.ApiDiscriminatorValidateConfig = ApiDiscriminatorValidateConfig; //# sourceMappingURL=discriminator-validate-config.utility.js.map