UNPKG

nukak

Version:

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

50 lines 6.88 kB
import { hasKeys, getKeys } 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' ? Object.keys(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; }); } function obtainAttrsPaths(row) { return getKeys(row).reduce((acc, col) => { if (col.includes('.')) { acc[col] = col.split('.'); } return acc; }, {}); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FsLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbC9zcWwudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXBELE1BQU0sVUFBVSxVQUFVLENBQUksR0FBTSxFQUFFLEdBQVk7SUFDaEQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUN4QixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQzFGLEVBQU8sQ0FDUixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFJLEdBQU0sRUFBRSxHQUFXLEVBQUUsR0FBWSxFQUFFLEdBQVk7SUFDekUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQzNDLE9BQU8sT0FBTyxHQUFHLEtBQUssUUFBUTtRQUM1QixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsR0FBRyxDQUFDO1FBQzVGLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDaEMsQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUksT0FBWTtJQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMvQyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFaEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUN6QixNQUFNLEdBQUcsR0FBRyxFQUFPLENBQUM7UUFFcEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUN0QixJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDdEIsU0FBUztZQUNYLENBQUM7WUFDRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakMsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtvQkFDdkQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQzt3QkFDakMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDaEIsQ0FBQztvQkFDRCxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEIsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNSLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBSSxHQUFNO0lBQ2pDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FDeEIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDWCxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQ0QsRUFBK0IsQ0FDaEMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBoYXNLZXlzLCBnZXRLZXlzIH0gZnJvbSAnLi9vYmplY3QudXRpbC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0T2JqZWN0PEU+KG9iajogRSwgcHJlPzogc3RyaW5nKTogRSB7XG4gIHJldHVybiBnZXRLZXlzKG9iaikucmVkdWNlKFxuICAgIChhY2MsIGtleSkgPT4gZmxhdE9iamVjdEVudHJ5KGFjYywga2V5LCBvYmpba2V5XSwgdHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0JyA/ICcnIDogcHJlKSxcbiAgICB7fSBhcyBFLFxuICApO1xufVxuXG5mdW5jdGlvbiBmbGF0T2JqZWN0RW50cnk8RT4obWFwOiBFLCBrZXk6IHN0cmluZywgdmFsOiB1bmtub3duLCBwcmU/OiBzdHJpbmcpOiBFIHtcbiAgY29uc3QgcHJlZml4ID0gcHJlID8gYCR7cHJlfS4ke2tleX1gIDoga2V5O1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ29iamVjdCdcbiAgICA/IE9iamVjdC5rZXlzKHZhbCkucmVkdWNlKChhY2MsIHByb3ApID0+IGZsYXRPYmplY3RFbnRyeShhY2MsIHByb3AsIHZhbFtwcm9wXSwgcHJlZml4KSwgbWFwKVxuICAgIDogeyAuLi5tYXAsIFtwcmVmaXhdOiB2YWwgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuZmxhdE9iamVjdHM8VD4ob2JqZWN0czogVFtdKTogVFtdIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG9iamVjdHMpIHx8ICFvYmplY3RzLmxlbmd0aCkge1xuICAgIHJldHVybiBvYmplY3RzO1xuICB9XG5cbiAgY29uc3QgYXR0cnNQYXRocyA9IG9idGFpbkF0dHJzUGF0aHMob2JqZWN0c1swXSk7XG5cbiAgaWYgKCFoYXNLZXlzKGF0dHJzUGF0aHMpKSB7XG4gICAgcmV0dXJuIG9iamVjdHM7XG4gIH1cblxuICByZXR1cm4gb2JqZWN0cy5tYXAoKHJvdykgPT4ge1xuICAgIGNvbnN0IGR0byA9IHt9IGFzIFQ7XG5cbiAgICBmb3IgKGNvbnN0IGNvbCBpbiByb3cpIHtcbiAgICAgIGlmIChyb3dbY29sXSA9PT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGF0dHJQYXRoID0gYXR0cnNQYXRoc1tjb2xdO1xuICAgICAgaWYgKGF0dHJQYXRoKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGF0dHJQYXRoLnNsaWNlKDAsIC0xKS5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBhY2Nba2V5XSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2Nba2V5XTtcbiAgICAgICAgfSwgZHRvKTtcbiAgICAgICAgdGFyZ2V0W2F0dHJQYXRoW2F0dHJQYXRoLmxlbmd0aCAtIDFdXSA9IHJvd1tjb2xdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHRvW2NvbF0gPSByb3dbY29sXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZHRvO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gb2J0YWluQXR0cnNQYXRoczxUPihyb3c6IFQpIHtcbiAgcmV0dXJuIGdldEtleXMocm93KS5yZWR1Y2UoXG4gICAgKGFjYywgY29sKSA9PiB7XG4gICAgICBpZiAoY29sLmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgYWNjW2NvbF0gPSBjb2wuc3BsaXQoJy4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSxcbiAgICB7fSBhcyB7IFtrOiBzdHJpbmddOiBzdHJpbmdbXSB9LFxuICApO1xufVxuIl19