UNPKG

nukak

Version:

flexible and efficient ORM, with declarative JSON syntax and smart type-safety

50 lines 7.13 kB
import { getKeys, hasKeys } from './object.util.js'; export function flatObject(obj, pre) { return getKeys(obj).reduce((acc, key) => flatObjectEntry(acc, key, obj[key], typeof obj[key] === 'object' ? '' : pre), {}); } function flatObjectEntry(map, key, val, pre) { const prefix = pre ? `${pre}.${key}` : key; return typeof val === 'object' ? getKeys(val).reduce((acc, prop) => flatObjectEntry(acc, prop, val[prop], prefix), map) : { ...map, [prefix]: val }; } export function unflatObjects(objects) { if (!Array.isArray(objects) || !objects.length) { return objects; } const attrsPaths = obtainAttrsPaths(objects[0]); if (!hasKeys(attrsPaths)) { return objects; } return objects.map((row) => { const dto = {}; for (const col in row) { if (row[col] === null) { continue; } const attrPath = attrsPaths[col]; if (attrPath) { const target = attrPath.slice(0, -1).reduce((acc, key) => { if (typeof acc[key] !== 'object') { acc[key] = {}; } return acc[key]; }, dto); target[attrPath[attrPath.length - 1]] = row[col]; } else { dto[col] = row[col]; } } return dto; }); } export function obtainAttrsPaths(row) { return getKeys(row).reduce((acc, col) => { if (col.includes('.')) { acc[col] = col.split('.'); } return acc; }, {}); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbC9zcWwudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXBELE1BQU0sVUFBVSxVQUFVLENBQUksR0FBTSxFQUFFLEdBQVk7SUFDaEQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUN4QixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFhLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxHQUFhLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQzlHLEVBQU8sQ0FDUixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFJLEdBQU0sRUFBRSxHQUFXLEVBQUUsR0FBUSxFQUFFLEdBQVk7SUFDckUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQzNDLE9BQU8sT0FBTyxHQUFHLEtBQUssUUFBUTtRQUM1QixDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxHQUFHLENBQUM7UUFDeEYsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNoQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FBSSxPQUFZO0lBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQy9DLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVoRCxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDekIsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQ3pCLE1BQU0sR0FBRyxHQUFHLEVBQU8sQ0FBQztRQUVwQixLQUFLLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUN0QixTQUFTO1lBQ1gsQ0FBQztZQUNELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQyxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNiLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUN6QyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtvQkFDWCxJQUFJLE9BQU8sR0FBRyxDQUFDLEdBQWEsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO3dCQUMzQyxHQUFHLENBQUMsR0FBYSxDQUFDLEdBQUcsRUFBbUIsQ0FBQztvQkFDM0MsQ0FBQztvQkFDRCxPQUFPLEdBQUcsQ0FBQyxHQUFhLENBQUMsQ0FBQztnQkFDNUIsQ0FBQyxFQUNELEdBQTBCLENBQzNCLENBQUM7Z0JBQ0YsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25ELENBQUM7aUJBQU0sQ0FBQztnQkFDTixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUksR0FBTTtJQUN4QyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQ3hCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ1gsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxFQUNELEVBQStCLENBQ2hDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBGaWVsZFZhbHVlLCBLZXkgfSBmcm9tICdudWthay90eXBlJztcbmltcG9ydCB7IGdldEtleXMsIGhhc0tleXMgfSBmcm9tICcuL29iamVjdC51dGlsLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZsYXRPYmplY3Q8RT4ob2JqOiBFLCBwcmU/OiBzdHJpbmcpOiBFIHtcbiAgcmV0dXJuIGdldEtleXMob2JqKS5yZWR1Y2UoXG4gICAgKGFjYywga2V5KSA9PiBmbGF0T2JqZWN0RW50cnkoYWNjLCBrZXksIG9ialtrZXkgYXMgS2V5PEU+XSwgdHlwZW9mIG9ialtrZXkgYXMgS2V5PEU+XSA9PT0gJ29iamVjdCcgPyAnJyA6IHByZSksXG4gICAge30gYXMgRSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gZmxhdE9iamVjdEVudHJ5PEU+KG1hcDogRSwga2V5OiBzdHJpbmcsIHZhbDogYW55LCBwcmU/OiBzdHJpbmcpOiBFIHtcbiAgY29uc3QgcHJlZml4ID0gcHJlID8gYCR7cHJlfS4ke2tleX1gIDoga2V5O1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ29iamVjdCdcbiAgICA/IGdldEtleXModmFsKS5yZWR1Y2UoKGFjYywgcHJvcCkgPT4gZmxhdE9iamVjdEVudHJ5KGFjYywgcHJvcCwgdmFsW3Byb3BdLCBwcmVmaXgpLCBtYXApXG4gICAgOiB7IC4uLm1hcCwgW3ByZWZpeF06IHZhbCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5mbGF0T2JqZWN0czxUPihvYmplY3RzOiBUW10pOiBUW10ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkob2JqZWN0cykgfHwgIW9iamVjdHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG9iamVjdHM7XG4gIH1cblxuICBjb25zdCBhdHRyc1BhdGhzID0gb2J0YWluQXR0cnNQYXRocyhvYmplY3RzWzBdKTtcblxuICBpZiAoIWhhc0tleXMoYXR0cnNQYXRocykpIHtcbiAgICByZXR1cm4gb2JqZWN0cztcbiAgfVxuXG4gIHJldHVybiBvYmplY3RzLm1hcCgocm93KSA9PiB7XG4gICAgY29uc3QgZHRvID0ge30gYXMgVDtcblxuICAgIGZvciAoY29uc3QgY29sIGluIHJvdykge1xuICAgICAgaWYgKHJvd1tjb2xdID09PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgYXR0clBhdGggPSBhdHRyc1BhdGhzW2NvbF07XG4gICAgICBpZiAoYXR0clBhdGgpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gYXR0clBhdGguc2xpY2UoMCwgLTEpLnJlZHVjZShcbiAgICAgICAgICAoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYWNjW2tleSBhcyBLZXk8VD5dICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICBhY2Nba2V5IGFzIEtleTxUPl0gPSB7fSBhcyBGaWVsZFZhbHVlPFQ+O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjY1trZXkgYXMgS2V5PFQ+XTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGR0byBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgICAgICApO1xuICAgICAgICB0YXJnZXRbYXR0clBhdGhbYXR0clBhdGgubGVuZ3RoIC0gMV1dID0gcm93W2NvbF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkdG9bY29sXSA9IHJvd1tjb2xdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkdG87XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb2J0YWluQXR0cnNQYXRoczxUPihyb3c6IFQpIHtcbiAgcmV0dXJuIGdldEtleXMocm93KS5yZWR1Y2UoXG4gICAgKGFjYywgY29sKSA9PiB7XG4gICAgICBpZiAoY29sLmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgYWNjW2NvbF0gPSBjb2wuc3BsaXQoJy4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSxcbiAgICB7fSBhcyB7IFtrOiBzdHJpbmddOiBzdHJpbmdbXSB9LFxuICApO1xufVxuIl19