UNPKG

@playbooks/serializers

Version:

A collection of serializers for Playbooks.

113 lines (112 loc) 3.89 kB
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 };