UNPKG

@nestjs-mod/common

Version:

A collection of utilities for unifying NestJS applications and modules

109 lines 5.38 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.configTransform = configTransform; exports.getConfigModelMetadata = getConfigModelMetadata; const common_1 = require("@nestjs/common"); const load_package_1 = require("../utils/load-package"); const constants_1 = require("./constants"); const errors_1 = require("./errors"); async function configTransform({ model, data, rootOptions }) { if (rootOptions === undefined) { rootOptions = {}; } if (rootOptions.logger === undefined) { rootOptions.logger = new common_1.ConsoleLogger('configTransform'); } const loadValidator = (validatorPackage) => { return validatorPackage || (0, load_package_1.loadPackage)('class-validator', () => require('class-validator')); }; const { modelPropertyOptions, modelOptions } = getConfigModelMetadata(model); const info = { modelPropertyOptions, modelOptions: modelOptions || {}, validations: {}, }; // eslint-disable-next-line @typescript-eslint/no-explicit-any const dataWithAllowedFields = {}; for (const propertyOptions of modelPropertyOptions) { if (propertyOptions.transform?.transform) { dataWithAllowedFields[propertyOptions.originalName] = data[propertyOptions.originalName] !== undefined ? propertyOptions.transform.transform({ modelRootOptions: rootOptions || {}, modelOptions: modelOptions || {}, obj: data, options: propertyOptions, value: data[propertyOptions.originalName], }) : propertyOptions.default; } else { dataWithAllowedFields[propertyOptions.originalName] = data[propertyOptions.originalName] !== undefined ? data[propertyOptions.originalName] : propertyOptions.default; } info.validations[propertyOptions.originalName] = { constraints: {}, value: data?.[propertyOptions.originalName], }; } const classValidator = loadValidator(rootOptions?.validatorPackage || modelOptions?.validatorPackage); let emptyOptionsInstance; let optionsInstance; try { emptyOptionsInstance = new model(); optionsInstance = Object.assign(new model(), dataWithAllowedFields); } catch (err) { emptyOptionsInstance = {}; optionsInstance = {}; } const validateErrors = rootOptions?.skipValidation || modelOptions?.skipValidation ? [] : (await classValidator.validate(optionsInstance, rootOptions?.validatorOptions || modelOptions?.validatorOptions || constants_1.CONFIG_MODEL_CLASS_VALIDATOR_OPTIONS)).filter((validateError) => validateError.property); // collect constraints const validateErrorsForInfo = (await classValidator.validate(emptyOptionsInstance, rootOptions?.validatorOptions || modelOptions?.validatorOptions || constants_1.CONFIG_MODEL_CLASS_VALIDATOR_OPTIONS)).filter((validateError) => validateError.property); for (const validateError of validateErrorsForInfo) { if (info.validations[validateError.property]) { info.validations[validateError.property].constraints = validateError?.constraints || {}; } } const debug = rootOptions?.debug || modelOptions?.debug || process.env['DEBUG']; const logger = rootOptions?.logger || modelOptions?.logger; if (validateErrors.length > 0) { const error = new errors_1.ConfigModelValidationErrors(validateErrors, info); if (logger?.error) { const validations = Object.fromEntries(Object.entries(info.validations).filter(([key, value]) => { return (Object.keys(value.constraints || {}).length && !info.modelPropertyOptions.some((o) => o.hideValueFromOutputs && o.originalName === key)); })); logger.error(!debug ? error.message : { ...info, validations, modelPropertyOptions: info.modelPropertyOptions.filter((o) => o.hideValueFromOutputs !== true && validations[o.originalName]), }); } throw error; } if (debug && logger?.debug) { logger.debug(JSON.stringify({ ...info, validations: Object.fromEntries(Object.entries(info.validations).filter(([key]) => { return !info.modelPropertyOptions.some((o) => o.hideValueFromOutputs && o.originalName === key); })), modelPropertyOptions: info.modelPropertyOptions.filter((o) => o.hideValueFromOutputs !== true), })); } for (const configPropertyMetadata of modelPropertyOptions) { // eslint-disable-next-line @typescript-eslint/no-explicit-any data[configPropertyMetadata.originalName] = optionsInstance[configPropertyMetadata.originalName]; } return { data, info }; } function getConfigModelMetadata(model) { const modelPropertyOptions = Reflect.getMetadata(constants_1.CONFIG_MODEL_PROPERTIES_METADATA, model) || []; const modelOptions = Reflect.getMetadata(constants_1.CONFIG_MODEL_METADATA, model); return { modelPropertyOptions, modelOptions }; } //# sourceMappingURL=utils.js.map