UNPKG

@tree-house/serializer

Version:
65 lines (64 loc) 2.41 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.constructData = void 0; const lodash_1 = require("lodash"); const serializer_1 = require("../serializer"); const key_conversion_util_1 = require("./key-conversion.util"); function isFlatValue(value) { if ((0, lodash_1.isArray)(value)) return (0, lodash_1.every)(value, lodash_1.isString); return (0, lodash_1.some)([ (0, lodash_1.isNumber)(value), (0, lodash_1.isString)(value), (0, lodash_1.isBoolean)(value), (0, lodash_1.isDate)(value), ], Boolean); } async function getValue(data = {}, key, config, options) { if (data[key] === null) return null; if (config[key]) { if (config[key] instanceof serializer_1.Serializer) { return data[key] == null ? null : await (0, exports.constructData)(data[key], config[key].config, options); } } if ((0, lodash_1.isFunction)(config[key])) { return await config[key].apply(data, [data[key], data]); } if (isFlatValue(data[key])) { return data[key]; } if ((0, lodash_1.isPlainObject)(data[key])) { if (config[key]) return await (0, exports.constructData)(data[key], config[key]); return data[key]; } if ((0, lodash_1.isArray)(data[key])) { return await Promise.all(data[key].map(async (value) => await (0, exports.constructData)(value, config[key]))); } if (new RegExp('^[0-9a-fA-F]{24}$').test(data[key])) { return data[key]; } return null; } const constructData = async (data, customConfig = { attributes: [] }, options = {}) => { const defaultConfig = { attributes: [], }; const config = { ...defaultConfig, ...customConfig }; if ((0, lodash_1.isArray)(data)) { return await Promise.all(data.map(async (item) => await (0, exports.constructData)(item, config, options))); } return await config.attributes.reduce(async (acc, key) => { const previousData = await acc; const value = await getValue(data, key, config, options); const formattedKey = (0, key_conversion_util_1.convertCase)(key, options.case); return Promise.resolve({ ...previousData, [formattedKey]: value, }); }, Promise.resolve({})); }; exports.constructData = constructData;