@bemedev/decompose
Version:
Decompose object and so more
49 lines (48 loc) • 1.45 kB
JavaScript
import "./constants/strings.js";
import { merge } from "ts-deepmerge";
//#region src/recompose.ts
function recomposeObjectUrl(shape, value) {
const obj = {};
if (shape.length <= 0) return obj;
const keys = shape.split(".");
if (keys.length === 1) {
const key = keys.shift();
obj[key] = value;
} else {
const key = keys.shift();
obj[key] = recomposeObjectUrl(keys.join("."), value);
}
return obj;
}
const _recompose = (shape) => {
const entries = Object.entries(shape);
if (entries.length === 0) return {};
const arr = [];
entries.forEach(([key, value]) => {
arr.push(recomposeObjectUrl(key, value));
});
return _recompose2(merge(...arr));
};
const _recompose2 = (shape) => {
if (Array.isArray(shape) || typeof shape !== "object" || shape === null) return shape;
const entries = Object.entries(shape).sort(([a], [b]) => a.localeCompare(b));
if (entries.length === 0) return {};
if (entries.every(([key]) => key.startsWith("[") && key.endsWith("]"))) {
const arr = [];
entries.forEach(([key, value]) => {
const index = parseInt(key.slice(1, -1), 10);
arr[index] = _recompose2(value);
});
return arr;
}
return entries.reduce((acc, [key, value]) => {
acc[key] = _recompose2(value);
return acc;
}, {});
};
const recompose = (shape) => _recompose(shape);
recompose.low = _recompose;
recompose.strict = _recompose;
//#endregion
export { recompose, recomposeObjectUrl };
//# sourceMappingURL=recompose.js.map