@tree-house/serializer
Version:
Json de/serialization made for consistency
65 lines (64 loc) • 2.41 kB
JavaScript
;
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;