objectypes
Version:
A type-safe library to transform and validate objects
46 lines (45 loc) • 2.19 kB
JavaScript
;
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);
}