UNPKG

objectypes

Version:

A type-safe library to transform and validate objects

46 lines (45 loc) 2.19 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.extractObject = void 0; const ramda_1 = require("ramda"); const property_1 = require("./metadata/property"); const transformation_1 = require("./metadata/transformation"); function extractObject(object, objectClass, options) { const propertyMetadatas = (0, property_1.findClassPropertiesMetadata)(objectClass, options === null || options === void 0 ? void 0 : options.namedOnly); if (!propertyMetadatas) { return {}; } return generateExtractedObject(object, objectClass, propertyMetadatas); } exports.extractObject = extractObject; function generateExtractedObject(object, objectClass, propertyMetadatas) { return propertyMetadatas.reduce((acc, propertyMetadata) => { var _a; const { name, propertyKey, type, defaultValue } = propertyMetadata; const value = (_a = object[propertyKey]) !== null && _a !== void 0 ? _a : defaultValue; if (value === undefined) { return acc; } const transformedValue = applyTransformationsToObject(objectClass, propertyMetadata, value); const finalValue = processNestedValue(transformedValue, type); const resultingProperty = name !== null && name !== void 0 ? name : propertyKey; return (0, ramda_1.assocPath)(resultingProperty.split('.'), finalValue, acc); }, {}); } function applyTransformationsToObject(objectClass, propertyMetadata, value) { const { propertyKey } = propertyMetadata; const transformationMetadatas = (0, transformation_1.findClassTransformationMetadata)(objectClass, 'extract'); const transformationMetadata = transformationMetadatas === null || transformationMetadatas === void 0 ? void 0 : transformationMetadatas.find(metadata => metadata.propertyKey === propertyKey); if (!transformationMetadata) { return value; } return transformationMetadata.transformer.transform(value); } function processNestedValue(value, type) { if (!type) { return value; } return Array.isArray(value) ? (value = value.map(val => extractObject(val, type))) : extractObject(value, type); }