nukak
Version:
flexible and efficient ORM, with declarative JSON syntax and smart type-safety
50 lines • 7.13 kB
JavaScript
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