ih-black-lion
Version:
State handler for Arus projects
53 lines (48 loc) • 1.42 kB
JavaScript
import { clone, isArrayLike as isArray, keys, reject } from 'ramda';
const toCamelCase = (str) => {
const words = str.toLowerCase().split('_');
let camelCase = '';
for (let i = 0; i < words.length; i += 1) {
if (i > 0) {
words[i] = words[i][0].toUpperCase() + words[i].substr(1);
}
camelCase += words[i];
}
return camelCase;
};
const serializeKeys = (keyArray, obj) => {
const res = {};
for (let i = 0; i < keyArray.length; i += 1) {
const key = keyArray[i];
const fieldName = toCamelCase(key);
let value = obj[key];
if (isArray(value) && value.length === 1) {
value = value[0];
}
if (typeof value === 'object') {
// If value is indexed like an array
if (isArray(value)) {
const values = [];
for (let j = 0; value[j] !== undefined; j += 1) {
values.push(serialize(value[j]));
}
value = values;
} else {
value = serialize(value);
}
}
res[fieldName] = value;
}
return res;
};
export default function serialize(obj) {
const metadata = clone(obj.$);
// Grabs the keys from `obj` omitting the `$` key that is usually present
const keyArray = reject(key => key === '$', keys(obj));
// If meta data existed then set it to the value of `meta` in `obj`
if (metadata) {
obj.meta = metadata;
keyArray.push('meta');
}
return serializeKeys(keyArray, obj);
}