@playbooks/serializers
Version:
A collection of serializers for Playbooks.
113 lines (112 loc) • 3.89 kB
JavaScript
import { isArray, isObject, isEmpty } from "@playbooks/utils/helpers";
import { camelToUnderscore, camelToDash, dashToCamel } from "@playbooks/utils/transforms";
const formatLookup$1 = (type) => {
switch (type) {
case "camel":
return dashToCamel;
case "dash":
return camelToDash;
case "underscore":
return camelToUnderscore;
}
};
const serializeArray = (type = "dash", data = [], attrs2 = []) => {
const serializedData = [];
data.map((v) => serializedData.push(serializeAttrs(type, v, attrs2)));
return serializedData;
};
const serialize = (type = "dash", data = {}, attrs2 = []) => {
const serializedData = {};
Object.assign(serializedData, serializeAttrs(type, data, attrs2));
return serializedData;
};
const serializeAttrs = (type = "dash", data = {}, attrs2 = []) => {
const formatter = formatLookup$1(type);
const serializedData = {};
Object.keys(data).map((key) => {
if (attrs2.length === 0) return serializedData[formatter(key)] = data[key];
if (isArray(data[key]) && isObject(data[key][0])) {
const arrayData = data[key];
const arrayAttrs = attrs2.filter((v) => v.split(".")[0] === key).map((v) => {
const paths = v.split(".");
paths.shift();
return paths.join(".");
});
const formattedAttrs = !isEmpty(arrayAttrs[0]) ? arrayAttrs : [];
if (!attrs2.includes(key) && isEmpty(arrayAttrs)) return;
return serializedData[formatter(key)] = arrayData.map((v) => serializeAttrs(type, v, formattedAttrs));
}
if (isArray(data[key])) {
if (isEmpty(data[key])) return;
if (!attrs2.includes(key)) return;
return serializedData[formatter(key)] = data[key];
}
if (isObject(data[key]) && data[key] !== null) {
const objectData = data[key];
const objectAttrs = attrs2.filter((v) => v.split(".")[0] === key);
const formattedAttrs = objectAttrs.filter((v) => v.includes(".")).map((v) => {
const paths = v.split(".");
paths.shift();
return paths.join(".");
});
if (isEmpty(objectAttrs)) return;
return serializedData[formatter(key)] = serializeAttrs(type, objectData, formattedAttrs);
}
if (attrs2.includes(key)) return serializedData[formatter(key)] = data[key];
});
return serializedData;
};
const attrs = {
type: { normalize: false, serialize: false },
updatedAt: { serialize: false },
createdAt: { serialize: false }
};
const formatLookup = (type) => {
switch (type) {
case "camel":
return dashToCamel;
case "dash":
return camelToDash;
case "underscore":
return camelToUnderscore;
}
};
const checkAttrs = (key) => {
const keys = Object.keys(attrs);
return keys.includes(key) ? attrs[key] : {};
};
const jsonApiSerializeArray = (data = []) => {
const serializedData = [];
data.map((d) => serializedData.push(jsonApiSerializeAttrs(d)));
return { data: { attributes: serializedData } };
};
const jsonApiSerialize = (data = {}) => {
const serializedData = jsonApiSerializeAttrs(data);
return { data: { attributes: serializedData } };
};
const jsonApiSerializeAttrs = (data = {}) => {
const formatter = formatLookup("camel");
const serializedAttrs = {};
Object.keys(data).map((key) => {
if (checkAttrs(key).serialize === false) return;
if (isArray(data[key]) && isObject(data[key][0])) {
return serializedAttrs[formatter(key)] = data[key].map(jsonApiSerializeAttrs);
}
if (isArray(data[key])) {
return serializedAttrs[formatter(key)] = data[key];
}
if (isObject(data[key])) {
return serializedAttrs[formatter(key)] = jsonApiSerializeAttrs(data[key]);
}
return serializedAttrs[formatter(key)] = data[key];
});
return serializedAttrs;
};
export {
jsonApiSerialize,
jsonApiSerializeArray,
jsonApiSerializeAttrs,
serialize,
serializeArray,
serializeAttrs
};